❗️날짜별로 정리하여 복습하기를 원하기 때문에 내용이 길고 다소 정리되지 않았습니다.

실행할 프로그램의 코드가 저장됩니다. CPU는 이 영역에서 명령어를 하나씩 가져와 처리하게 됩니다.
전역변수와 정적변수가 저장됩니다. 이 변수들은 프로그램이 시작될 때 할당되어 프로그램 종료 시 소멸됩니다.
+) 더 자세히 들어가면 BSS(Block Stated Symbol) 영역이 있는데요, 이 영역에는 초기화 되지 않은 전역변수가 저장됩니다. 초기화 된 전역변수는 Data 영역에 저장되어 비휘발성 메모리인 ROM에 저장되는데 이 부분은 비용이 많이 들어 RAM에 저장될 것과 ROM에 저장될 것을 구분하기 위해 영역을 구분해 사용합니다.
지연변수, 매개변수, 리턴값 등 잠시 사용되었다가 사라지는 데이터를 저장하는 영역입니다. 함수 호출 시 할당되고 함수 반환 시 소멸됩니다. 로드 시(컴파일 타임) 크기가 결정됩니다.
위 세 영역은 컴파일 할 때 data, stack 영역의 크기를 계산해 메모리 영역을 결정합니다!
동적 데이터 영역입니다. 메모리 주소 값에 의해서만 참조되고 사용되는 영역입니다. 따라서, 프로그램 동작 시(런타임)에 크기가 결정됩니다.
예를 들어, stack에서 pointer 변수를 할당하면 pointer가 가리키는 heap 영역의 임의의 공간부터 원하는 크기만큼 할당해 사용하게 됩니다.
ref:https://velog.io/@cchloe2311/운영체제-프로세스-메모리-구조


| 이름 | 내용 |
|---|---|
| Process State | 생성, 준비, 실행, 대기, 완료 |
| Process number(=id) | 프로세스 식별자 |
| Program Counter | 해당 프로세스가 다음에 실행할 Instruction의 주소 |
| registers | 사용 중인 레지스터 정보 |
| Memory limits | 사용 가능한 메모리 공간 정보 |

(그림에서) 프로세스 P0가 interrupt 혹은 system call에 의해 중단되면 PCB0의 상태를 저장하고, PCB1 의 상태를 로드해 준비 큐에서 프로세스 P1을 dispatch, 실행상태로 변경한다.
프로세스 P1가 interrupt 혹은 system call에 의해 중단되면 PCB1의 상태를 저장하고, PCB0 의 상태를 로드해 준비 큐에서 프로세스 P0을 dispatch, 실행상태로 변경한다.
💡 idle = 프로세스가 실행하고 있지 않은 상태
idle이 겹치는 시간 = 오버헤드

fork()함수로 부모 프로세스가 자식프로세스를 생성(Linux : Duplicate), fork()의 반환값은 부모 프로세스는 양수, 자식 프로세스는 0을 반환함.
부모 프로세스는 wait() 함수를 통해 자식 프로세스가 exit()함수를 호출할때까지 기다림. 부모가 받는 fork()의 반환값은 이후 생성될 자식프로세스의 pid를 의미함.
fork()이후에 자식프로세스는 자신 고유의 pid를 가짐. pid를 할당하는 알고리즘 및 Policy는 OS에 따라 다름
시스템의 프로세스들은 독립적이거나 협력적임
독립적인 프로세스는 다른 프로세스의 실행에 영향을 주거나 영향을 받을 수 없음.
협력적인 프로세스는 다른 프로세스의 실행에 영향을 주거나 영향을 받을 수 있음.
협력적인 프로세스를 사용하는 이유
💡 협력적인 프로세스는 정보 공유를 위해 Interprocess communication(IPC)를 필요로 한다.
Communications Models

producer process 는 consumer process가 소비할 정보를 생산함