1. Process Memory
- Program : 프로그램 실행 설명서로, System Resource를 할당 받지 못한 상태입니다.
- Process : 프로그램을 실제로 실행 한 것으로, System Resource를 확보 한 상태입니다.
- Code : 프로그램 코드, 기계어 등이 포함된다. 컴파일시 영역 크기가 결정됩니다.
- Data : 전역변수, static 변수 등이 포함됩니다. 컴파일시 영역 크기가 결정됩니다.
- Stack : 지역변수, 함수 호출 주소, 파라미터 등 함수에 필요한 정보가 포함됩니다. LIFO 구조로 함수를 호출할 때 필요한 정보를 쌓고 함수가 끝나면 해당 영역을 Pop합니다. 컴파일시 영역 크기가 결정되며 스택 영역을 벗어나면 Stack Overflow 에러가 발생합니다.
- Heap : 프로그램 실행 중 할당된 변수들이 포함됩니다.(동적 할당 변수) 데이터 중간 삽입, 삭제가 많아 링크드리스트로 관리됩니다. 실행 도중 영역 크기가 변경되며, 힙 영역을 벗어나면(Stack 영역을 침범하면) Heap Overflow 에러가 발생합니다.
※ Stack vs Heap
- Stack, Heap영역은 중간에 공유 라이브러리를 두고 서로 마주보며 공유 라이브러리 영역을 공유합니다.
- Stack 영역이 클수록 Heap 영역이 작고, Stack 영역이 작을수록 Heap 영역을 많이 사용합니다. 이때, 스택은 이미 할당된 공간을 사용하는 것이고, 힙은 실행 중 할당하여 사용합니다.
2. Process State
- New : 프로세스를 생성하는 단계입니다.
- Ready : CPU를 할당 받을 때 까지 기다리는 단계입니다.
- Running : 실제로 CPU를 할당 받아 실행 된 상태입니다.
- Waiting : I/O or Event가 완료 될때까지 기다리는 상태입니다.
- Terminated : 프로세스가 종료되고 리소스를 리턴하는 단계입니다.
3. Process Control Block (PCB)
프로세스마다 가지고 있으며 프로세스의 중요한 정보를 담고 있는 블록입니다. 문맥 전환시 PCB를 참조합니다.
- Process State : Running or waiting 같이 프로세스의 상태를 나타냅니다.
- Program Counter : 다음으로 실행 할 인스트럭션 주소를 나타냅니다.
- CPU Register : CPU 계산시 필요한 정보를 기록하는데 레지스터를 사용합니다.
- CPU Scheduling Information : Process의 우선순위 등 나타냅니다.
- 현재 이 프로세스가 사용하고 있는 메모리 영역을 나타냅니다.
- 현재 사용하는 파일, 사용한 I/O 장치 등을 나타냅니다.
4. Context Switch
"사용하던 정보를 PCB에 기록하고, 이제 사용할 프로세스 정보를 셋팅하는 작업"
멀티 프로그래밍 환경에서 인터럽트 요청이(ex 스케줄링, 시스템 콜) 들어오면 수행하던 프로세스의 정보를 PCB에 저장합니다. 다음 수행할 프로세스 정보를 PCB로부터 CPU 레지스터, 캐시 정보 등을 변경합니다. 이어서 전에 하던 일을 마져 수행합니다.
Context Switch를 많이 하면 많은 프로세스가 동시에 수행 가능하나 PCB를 복구하고 Switch하는 오버헤드가 발생하여 적절한 밸런스를 맞춰야합니다.
5. Process Creation & Termination
[1] Process Creating
대부분의 OS는 process id로 프로세스를 식별 합니다. 프로세스는 실행 도중에 트리 구조를 이용하여 자식 프로세스를 생성합니다. 이때 자식 프로세스는 부모 프로세스와 똑같은 코드와 데이터를 가진 후 독립적으로 실행됩니다.
프로세스는 자신의 작업을 수행 하기 위해 CPU, Memory, File, I/O와 같은 자원들이 필요합니다. 생성된 프로세스가 자원을 할당 받는 방식은 부모 프로세스와 자원을 공유하기도 하고 OS로부터 직접 할당 받기도 합니다.
[2] Process Termination
프로세스는 종료할 때 사용하던 자원을 반납하고 종료합니다. OS에 의해 강제 종료 될 수도 있고 exit API를 통해 스스로 프로세스를 종료 할 수도 있습니다. 혹은 부모 프로세스의 의해 종료 될 수도 있습니다.
- 프로세스가 할당된 자원을 초과하여 사용한다면 OS나 부모 프로세스에 의해 종료됩니다.
- 프로세스가 할 일을 다 마쳤을때 OS나 부모 프로세스에 의해 종료 됩니다. 일반적으로 부모 프로세스가 종료하면 자식 프로세스도 종료하지만 특정 처리(wait function)를 한다면 자식 프로세스 task를 모두 마친 후 부모 프로세스가 종료 할수도 있습니다.
6. Interprocess Communication [IPC]
프로세스들은 서로 정보를 공유 하거나, 작업을 분할하여 모듈별로 동작하는 경우가 많습니다. 이렇게 프로세스는 정보를 교환 하기 위해 IPC 기법을 사용합니다. 보안 상 프로세스가 직접 프로세스에게 메시지를 전달(접근) 못 하여 Message Passing 과 Shared Memory 방식으로 데이터를 교환합니다.
[1] Message Passing
프로세스가 송신할 메시지를 커널에서 관리하는 큐로 전달하고, 커널이 수신할 프로세스에게 메시지를 전달하는 방식입니다. 커널이 메시지 전달을 맡아 메모리를 자체적으로 보호하여 안전하지만 매 통신마다 커널의 개입이 있기 때문에 Context Switching 비용이 발생하는 문제가 있습니다. 또한, 큐는 공간의 한계가 있어 대규모 메시지 전달에는 적합하지 않습니다. 즉, 구현이 쉽고 안정성이 우수하고 적은 양의 데이터를 전달할 때 적합합니다.
[2] Shared Memory
프로세스들이 공유하는 메모리 영역이 구축됩니다. 해당 영역에 데이터를 읽고 쓰면서 정보를 교환합니다. 처음 공유 메모리 영역 구축시에만 커널 개입이 있어, Message Passing보다 성능이 더 우수합니다. 또한, 큐 영역의 공간 한계를 넘어서서 메모리 영역을 구축했기 때문에 많은 양의 데이터를 교환할 때도 좋습니다.
하지만 공유 영역에 데이터를 읽고 씀으로 동기화 문제가 발생할 수 있습니다. 프로세스들이 데이터를 읽기만 한다면 문제 없지만 쓰는 작업이 일어날 경우 문제가 발생할 수 있습니다. 만약 공유 데이터를 변경하는 도중 Context Switching이 발생하면 잘못된 데이터를 읽을 수 있어 Mutex, Semaphore 방식 등으로 문제를 해결합니다.