한정된 자원( 처리기 및 메모리 )을 여러 프로세스가 공유하려면 OS는 한 가지 프로세스가 처리기 및 메모리를 독점하지 않고 인터리빙(Interleaving) 할 수 있도록 지원해야한다.
OS의 주요 업무는 2가지이다.
1. 프로세스 수행을 인터리빙하는 패턴 결정
2. 프로세스 자원 할당
2가지 주요 업무는 프로세스 상태와 관련있다.
프로세스 상태
프로세스 상태는 기본적으로 두 가지로 나뉠 수 있다. 수행중이냐 비수행중이냐. 지난 포스팅에서 다루었던 바와 같이, OS는 PCB 자료구조로 프로세스를 관리한다. 준비큐에 PCB가 대기하면 비수행이고 처리기를 할당받으면 수행중이다. OS는 프로세스를 Switch하는 디스패처(Dispachter) 프로그램을 이용하여 처리기를 다른 프로세스에 할당한다.(디스패치)
▷ 2-상태(Two-state) 프로세스 모델
OS는 PCB를 생성하고 주기억장치에 프로세스를 위한 메모리를 할당하며 프로세스를 생성한다. 주로 프로세스는 특정 프로세스의 명시적 요청(Explicit)에 따라 OS가 새로운 프로세스를 생성한다. 특정 프로세스는 OS에 새로운 프로세스를 위한 데이터를 전달한다. 특정 프로세스는 부모 프로세스가 되고 새로운 프로세스는 자식 프로세스가 된다. 그러므로 0번 프로세스는 커널 프로세스가 되고 모든 프로세스의 부모프로세스가 된다.
프로세스가 수행 완료를 OS에 알리면 프로세스는 종료되고 인터럽트가 발생하면 프로세스는 일시중지가 된다.
2-상태 모델의 준비 큐에는 실행준비가 완료된 프로세스와 입출력 등의 이유로 잠시 인터럽트된 프로세스가 혼재되어 있다. 그래서 OS가 인터럽트되어 일시정지된 프로세스를 처리기에 디스패치해도 다시 준비큐로 일시정지시켜야 하는 오버헤드가 발생한다. 2가지 상태 모델은 이런 단점이 있기에 상태를 5가지로 늘린 모델이 등장했다.
▷ 5-상태 모델( A Five State Model )
생성 : PCB는 메모리에 존재하지만 프로세스는 존재하지 않는 상태이다. 너무 많은 프로세스가 메모리를 차지하지 않도록 필요없는 프로세스는 적재시키지 않는 상태이다.
준비 : 수행될 준비가 된 프로세스는 주기억장치에 적재된다.
수행 : 단일처리기를 가정할 때 한 가지 프로세스만이 수행상태이다.
블록/대기 : 입축력 인터럽트 등이 발생하면 블록이 된다. 인터럽트 완료 이벤트(사건)가 발생하면 다시 준비상태가 된다. 문맥을 유지해야 되기에 메모리에 존재한다.
종료 : 수행이 완료되거나 중단되어 프로세스 풀에서 방출된 프로세스를 의미한다.
( 프로세스는 준비, 블록 상태일때 강제적으로 종료될 수도 있다. 부모 프로세스는 자식프로세스를 종료시킬 권한을 갖고 있기 때문이다. )
5-상태 모델은 위와 같이 블록큐를 구현한다. 이벤트(사건)가 발생하면 블록큐에 대기하던 이벤트를 준비큐로 진입시킨다. 그러나 이벤트(사건)는 다양하다. 프로세스는 다양한 이유로 인터럽트되어 블록큐에 들어간다. 특정 이벤트(사건)가 발생하면 블록큐를 스캔하여 해당 사건으로 블록된 프로세스를 찾아야 하는 오버헤드가 발생한다. 이를 해결하기 위해, 사건 별로 블록큐를 둔 멀티 블록큐 구조를 구현하여 스캔으로 인한 오버헤드를 줄일 수 있다.
준비큐도 멀티 코어인 경우 우선순위별로 준비큐를 만들거나 처리기마다 준비큐를 두는 것이 자원보호면에서 좋다. 그러나 큐가 많아지면 관리도 힘들어진다는 점을 기억해야한다.
5-상태 모델도 한 가지 단점이 있다.
처리기는 입출력장치보다 훨씬 빠르다. 입출력이 많은 환경이라면 모든 프로세스를 블록시키고 처리기는 유휴(idle)상태가 된다. 일시정지된 프로세스는 메모리만 차지하고 아무 일도 안하니 새로운 프로세스가 메모리에 상주할 수 없게 된다. 이같은 현상을 방지하려면 '보류상태'를 추가하면 된다.
▷ 보류된 프로세스
보류상태는 스와핑(swapping)으로 구현된다. 프로세스의 일부나 전체를 메모리에서 디스크로 옮기는 작업이다. 그리고 해당 프로세스의 PCB를 보류큐(Queue)에 넣는다. PCB가 보류큐에 들어간 프로세스는 보류상태가 된다.
디스크에 있는 프로세스를 주기억장치로 옮기는 작업은 많은 오버헤드를 필요로 한다. 그러므로 보류된 프로세스 중 다시 준비상태로 복귀시켰는데 아직 입출력이 완료되지 않았다면 다시 블록되고 보류되는 상황이 발생할 수 있다. 그래서 보류 상태도 다시 두 가지로 나뉠 수 있다.
아직 입출력이 완료되지 않은 보류는 블록/보류에 있고 입출력 완료 이벤트가 발생한 프로세스는 준비/보류 상태로 이동한다. 준비/보류 상태에 있는 프로세스는 언제든 프로세스를 수행할 준비가 되어있다. 프로세스 보류는 스와핑을 통해 주기억장치의 충분한 공간을 확보하고 주기적으로 수행되는 프로세스는 다음 프로세스 주기까지 프로세스를 보류 할 수 있다. 또한 부모 프로세스가 자식프로세스를 검사 및 수정하기 위해 보류시킬 수 있다. 버그나 문제를 야기시킬 프로세스는 디버깅 및 오류검사를 위해 잠시 보류 시킬 수도 있다.
참고자료
'CS > OS' 카테고리의 다른 글
[운영체제] KLT( Kernel Level Thread ) VS ULT ( User Level Thread ) (0) | 2021.10.11 |
---|---|
[운영체제] 쓰레드 ( Thread ) (0) | 2021.10.11 |
[운영체제] 프로세스 제어구조 (0) | 2021.10.11 |
[운영체제] PCB의 구성요소 (0) | 2021.10.11 |
[ 운영체제 ] PCB ( Process Control Block ) (0) | 2021.09.29 |