-
Chapter 2. ProcessOperating System 2019. 6. 24. 23:01
1. Process Memory
Program : 프로그램 실행 '설명서'로, System Resource를 할당 받지 못한 상태이다.
Process : 프로그램을 실제로 '실행' 한 것으로, System Resource를 확보 한 상태이다.
[그림 1] Process In Memory - Code : 프로그램 코드, 기계어 등이 포함된다. 컴파일시 영역 크기가 결정된다.
- Data : 전역변수, static 변수 등이 포함된다. 컴파일시 영역 크기가 결정된다.
- Stack : 지역변수, 함수 호출 주소, 파라미터 등 '함수'에 필요한 정보가 포함된다. LIFO 구조로, 함수를 호출할 때 필요한 정보를 쌓고 함수가 끝나면 해당 영역을 Pop한다. 컴파일시 영역 크기가 결정되며, 스택 영역을 벗어나면 Stack Overflow 에러가 발생한다.
- Heap : 프로그램 '실행 중' 할당된 변수들이 포함된다.(동적 할당 변수) 데이터의 중간 삽입, 삭제가 많아 링크드리스트로 관리된다. 실행 도중 영역 크기가 변경되며 힙 영역을 벗어나면(Stack 영역을 침범하면) Heap Overflow 에러가 발생한다.
※ Stack vs Heap
Stack, Heap영역은 중간에 '공유 라이브러리'를 두고 서로 '마주보며' 영역을 공유한다. 따라서 메모리 공간을 알뜰하게 사용할 수 있다.
Stack 영역이 클수록 Heap 영역이 작고, Stack 영역이 작을수록 Heap 영역을 많이 사용한다. 이때, 스택은 이미 할당된 공간을 사용하는 것이고, 힙은 실행 중 할당하여 사용한다.
2. Process State
[그림 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 정보 : 현재 사용하고 있는 파일, 사용한 I/O 장치 등을 나타냄
4. Context Switch
멀티 프로그래밍 환경에서 인터럽트 요청이(ex 스케줄링, 시스템 콜) 들어오면 수행하던 프로세스의 정보를 PCB에 저장한다. 다음 수행할 프로세스 정보를 PCB로부터 CPU 레지스터, 캐시 정보 등을 변경한다. 이어서 전에 하던 일을 마져 수행한다.
Context Switch를 많이 하면 많은 프로세스가 동시에 수행 가능하나 PCB를 복구하고 Switch하는 오버헤드가 발생하여 적절히 관리 해야 된다.
5. Process Creation & Termination
대부분의 OS는 process id로 프로세스를 식별 한다. 프로세스는 실행 도중에 트리 구조를 이용하여 자식 프로세스를 생성 할 수 있다. 이때 자식 프로세스는 부모 프로세스와 똑같은 코드와 데이터를 가진 후 독립적으로 실행된다.
프로세스는 자신의 task를 수행 하기 위해 CPU, Memory, File, I/O와 같은 자원들이 필요하다. 생성된 프로세스가 자원을 할당 받는 방식은 부모 프로세스와 자원을 공유하기도 하고 OS로부터 직접 할당 받기도 한다.
[그림 3] Child는 fork 를 통해 생성시 pid 가 0 으로 초기화 되있다 . 6. Process Termination
프로세스는 종료할 때 사용하던 자원을 반납하고 종료 해야한다. OS에 의해 강제 종료 될 수도 있고 exit API를 통해 스스로 프로세스를 종료 할 수도 있다. 또한 부모 프로세스의 의해 종료 될 수도 있다.
- 프로세스가 할당된 자원을 초과 하여 사용한다면 OS나 부모 프로세스에 의해 종료 된다.
- 프로세스가 할 일을 다 마쳤을때 OS나 부모 프로세스에 의해 종료 된다.
- 일반적으로 부모 프로세스가 종료하면 자식 프로세스도 종료하지만 특정 처리를 한다면 자식 프로세스 task를 모두 마친 후 부모 프로세스가 종료 할수도 있다.
7. Interprocess communication [IPC]
프로세스들은 서로 정보를 공유 하거나, 작업을 분할하여 모듈별로 동작하는 경우가 많다. 이렇게 프로세스는 정보를 교환 하기 위해 IPC 기법을 사용한다. 보안 상 프로세스가 직접 프로세스에게 메시지를 전달(접근) 못 하여 Message Passing 과 Shared Memory 방식으로 데이터를 교환한다.
[그림 4] IPC Message Passing
프로세스가 송신할 메시지를 커널에서 관리하는 큐로 전달하고, 커널이 수신할 프로세스에게 메시지를 전달하는 방식이다. 커널이 메시지 전달을 맡아 메모리를 자체적으로 보호하여 안전하지만 매 통신마다 커널의 개입이 있기 때문에 Context Switching 비용이 발생하고 성능이 조금 떨어지는 문제가 있다. 또한, 큐는 공간의 한계가 있어 대규모 메시지 전달에는 적합하지 않다. 즉, 구현이 쉽고, 안정성이 우수하고, 적은 양의 데이터를 전달할 때 적합하다.
Shared Memory
프로세스들이 공유하는 메모리 영역이 구축된다. 해당 영역에 데이터를 읽고 쓰면서 정보를 교환한다. 처음 공유 메모리 영역 구축시에만 Context Switching이 발생하여 Message Passing보다 성능이 더 우수하다. 또한, 큐 영역의 공간 한계를 넘어서서, 메모리 영역을 구축했기 때문에 많은 양의 데이터를 교환할 때 좋다.
하지만 공유 영역에 데이터를 읽고 씀으로 '동기화' 문제가 발생한다. 프로세스들이 데이터를 읽기만 한다면 문제가 없지만 쓰는 작업이 일어날 경우 문제가 발생한다. 만약 공유 데이터를 변경하는 도중 Context Switching이 발생하면 잘못된 데이터를 읽을 수 있어 Mutex, Semaphore 방식 등으로 문제를 해결한다.
'Operating System' 카테고리의 다른 글
Chapter 6. Main Memory (0) 2019.08.14 Chapter 5. Synchronization & Deadlocks (0) 2019.08.14 Chapter 4. Scheduling (0) 2019.06.25 Chapter 3. Thread (0) 2019.06.24 Chapter 1. Introduce (0) 2019.06.24