운영체제 시리즈 5. 프로세스 관리(Process Management)
큐
프로세스를 스케줄링하기 위해 큐를 사용한다. 큐는 줄을 세우고 순서에 따라 처리하는 방식이다.
준비 큐(ready queue) - 준비상태
운영체제에서 준비상태의 있는 프로세스들은 준비 큐(ready queue)에 줄을 세워 가장 먼저 있는 프로세스에게 CPU를 할당한다.
장치 큐(device queue) - 봉쇄상태
자원별로 장치 큐(device queue)를 둔다. 입출력 장치마다 큐를 두어 일처리를 해준다고 생각하면 된다. 디스크 입출력 큐, 키보드 입출력 큐 등이 있다.
자원 큐 - 봉쇄상태
소프트웨어 자원을 위한 큐이다. 공유 데이터에 대한 접근권한을 예로 들 수 있다. 한 프로세스가 공유 데이터를 사용할 때 다른 프로세스가 접근하게 되면 데이터의 일관성이 깨질 수 있기 때문에 자원 큐를 둔다. 자원을 사용하고 있는 프로세스가 데이터를 반납하기 전까지 다른 프로세스의 접근을 막는다.
작업 큐(job queue)
운영체제는 준비큐, 장치큐 외 작업큐를 가지고 있다. 시스템 내의 모든 프로세스를 관리하기 위한 큐이다. 존재하는 모든 프로세스가 작업큐에 올라와 있다. 프로세스 상태와 무관하게 올라가 있으므로 작업큐에 있는 프로세스라고 메모리를 가지고 있는 것은 아니다. 작업큐가 준비큐와 장치큐를 아우르는 가장 넓은 개념이다.
스케줄러
어떤 프로세스에게 자원을 할당할지 결정하는 운영체제의 코드를 의미한다.
장기 스케줄러 (job scheduler)
어떤 프로세스를 준비큐에 넣을지 결정하는 역할을 하며 메모리를 할당하는 문제에 관여한다. 수십초 내지 수십분 단위로 호출되기 때문에 상대적으로 속도가 느려도 된다. 메모리의 할당 승인여부를 결정하기 때문에 메모리에 동시에 올라가있는 프로세스의 수를 조절하는 역할을 한다. 하지만 현대의 시분할 시스템에서는 장기 스케줄러를 두지 않는 것이 일반적이며 중기 스케줄러로 관리한다. (과거에 자원이 부족하던 시절에 사용했다고 한다.)
중기 스케줄러
현대의 시분할 시스템에서는 프로세스가 시작상태가 되면 장기스케줄러 없이 곧바로 메모리를 할당해 준비큐에 넣어준다. 중기 스케줄러는 메모리에 적재된 프로세스의 수를 동적으로 조절하는 역할을 한다. 너무 많은 프로세스에게 메모리가 할당되어 시스템 성능 저하를 막기 위함이다. 많은 프로세스가 메모리에 오르면 개별 프로세스당 가지고 있는 메모리양이 적어지므로 빈번한 입출력이 일어날 수 있어 시스템 성능저하가 일어난다. 중기 스케줄러는 일부 프로세스를 선정해 메모리리 빼앗아 스왑아웃 시킨다. 봉쇄상태에 있는 프로세스를 우선 순위로 스왑아웃 시키며 다음은 타이머 인터럽트가 발생해 준비큐로 이동하는 프로세스를 스왑아웃 시킨다.
중기 스케줄러로 프로세스 상태(실행, 준비, 봉쇄)에 중지(suspended, stopped)상태가 추가된다. 스왑 아웃된 프로세스가 대표적인 중지 상태이다. 중지상태는 중지준비상태(준비상태에 있던 프로세스의 스왑아웃)와 중지봉쇄(봉쇄상태에 있던 프로세스의 스왑아웃)로 나뉘어진다. 두 상태 관계없이 중지상태에서는 메모리를 조금도 보유하지 않으며 디스크에 통째로 스왑아웃된 상태이다.
단기 스케줄러(CPU scheduler)
준비 상태의 프로세스 중에서 어떤 프로세스를 실행상태로 만들 것인지 결정하는 역할을 한다. 시분할 시스템에서는 타이머 인터럽트가 발생하면 단기 스케줄러를 호출한다. 밀리초 단위로 빈번하게 호출되기 때문에 수행속도가 충분히 빨라야 한다.
프로세스 생성과 종료
시스템이 부팅된 후 최초의 프로세스의 운영체제가 직접 생성하지만 그 이후에 생성되는 프로세스는 부모의 복제 생성으로 만들어진다. 부모가 자식 프로세스를 복제 생성하고 자식 프로세스는 그 공간에 새로운 프로그램을 올려서 작동되는 방식이다. 프로세스 간의 계층구조(트리)가 만들어진다. 따라서 프로세스가 종료될 때도 자식 프로세스가 먼저 죽고 부모가 종료되는 방식으로 이루어진다.
생성
fork() 시스템콜
fork 시스템콜은 부모의 프로세스 내용을 그대로 복제하여 새로운 프로세스를 생성한다. 부모의 프로세스 문맥을 모두 복사하며 주소공간(코드,데이터,스택)과 PC레지스터를 복제 생생한다. 부모의 프로세서 ID를 제외한 모든 정보를 그대로 복사한다. 부모 프로세스에서 fork가 일어나면 자식 프로세스는 부모와 동일한 정보를 가진다. 다만 차이가 있다면 fork의 결과 값으로 부모는 양수값을 갖고 자식은 0의 값을 가진다.
exec() 시스템콜
fork로 복제된 자식프로세스는 exec로 새로운 프로그램으로 주소공간을 덮어 씌운다. COW(Copy On Write) 방식은 부모의 프로세스를 그대로 사용하다가 write가 발생할 경우 복사하는 방식을 뜻한다.
종료
자식이 먼저 종료된 후 부모가 종료된다는 원칙이 있다.
exit() 시스템콜
운영체제에게 자신이 종료됨을 알리는 시스템 콜이다.
wait() 시스템콜
wait() 시스템콜은 자식이 종료되기를 기다리며 부모를 봉쇄상태에 머무르게 할 때 사용된다. fork 후 wait 시스템콜을 하게되면 자식이 종료될 때까지 부모는 봉쇄상태가 되는 것이다. 이를 통해 자식과 부모간의 동기화(synchronization)이 가능하다.
자발적 종료
프로세스가 마지막 명령까지 실행되면 exit 시스템콜을 호출하여 종료된다. 이는 운영체제에게 자신이 종료됨을 알리는 것이다. 개발자가 명시적으로 exit()을 넣어주지 않아도 종료될 때 자동으로 삽입되어 종료 직전에 항상 호출된다.
비자발적 종료
부모가 자식의 수행을 강제종료 시키는 경우이며 abort()라는 함수를 통해 진행된다.
1. 자식이 할당 자원의 한계치를 넘는 경우
2. 자식에게 더이상 할당된 작업이 필요하지 않는 경우
3. 부모프로세스가 종료(exit)되는 경우
프로세스간 협력
프로세스는 독립적인 주소공간을 가지고 수행되며 다른 프로세스의 주소공가을 참조하는 것이 허용되지 않는다. 하지만 경우에 따라 프로세스 간 협력이 필요할 때가 있다. 운영체제의 대표적은 협력 메커니즘은 IPC(Inter-Process Communication)이 있다. IPC란 하나의 컴퓨터 안에서 실행중인 서로 다른 프로세스 간 통신을 뜻한다. 이때 의사소통과 동기화 보장이 필요하다. 공유 데이터를 사용하는지 여부에 따라 메세지전달과 공유메모리 방식으로 나뉜다.
메세지 전달(message passing)
메세지를 주고받는 방식을 특권명령으로 규정하여 커널을 통해 메세지를 주고받는 방식이다. send(), receive()를 이용해서 메세지를 주고받는다. 메세지가 프로세스에게 전송되는지, 메일박스(일종의 저장공간)를 통해 전송되는지에 따라 직접통신과 간접통신으로 나뉜다.
직접통신(direct communication)
통신하려는 프로세스의 이름을 명시적으로 표시한다.
간접통신(indirect communication)
메세지를 메일박스(mail box) 또는 포트(port)로 전달하는 방식이다. 메일박스에는 고유의 ID가 있고, 메일박스를 공유하는 프로세스 간에만 커뮤니케이션 링크가 생성된다. 하나의 링크가 여러 프로세스에게 할당될 수 있으며 프로세스는 여러 링크를 공유할 수 있다. 직접통신에서는 프로세스의 이름을 명시적으로 표시했다면 간접통신에서는 메일박스의 이름을 명시적으로 표시한다.
공유 메모리(shared memory)
프로세스들이 주소공간의 일부를 공유하는 방식이다. 운영체제에서 공유메모리를 사용하는 시스템콜을 지원해 서로 다른 프로세스가 주소공간 중 일부를 공유할 수 있게 한다. 초기화 할때만 커널의 도움을 받아 shared memory를 만들고 그 이후는 커널의 도움을 받지 않고 프로세스 간에 공유가 일어난다. 따라서 공유메모리 접근에 대한 동기화 문제를 각 프로세스 선에서 책임져야 한다.
정리
큐를 두어 프로세스 간의 일처리에 순서를 두고 동기적으로 진행한다. 프로세스의 생성은 부모의 fork 시스템콜로 인해 복제 생성되며 자식이 새로운 공간으로 덮어 씌우는 방식으로 진행된다. 종료에는 항상 자식이 먼저 종료되고 부모의 프로세스가 종료되는 방식으로 진행된다. 프로세스 간에 협력이 필요한 경우 운영체제는 IPC 메커니즘을 통해 협력을 진행한다. 커널을 직접적으로 메세지를 전달하는 방식과 커널이 공유메모리 공간을 생성해주어 프로세스간에 공유메모리 공간을 활용하는 방식으로 진행된다.
운영체제 시리즈는 반효경 교수님의 운영체제 강의 와 "운영체제와 정보기술의 원리"라는 책을 바탕으로 정리한 내용입니다.