본문 바로가기
Computer Science/Operating System

[운영체제OS]5. 프로세스 관리-2

by ggyongi 2021. 2. 27.
반응형

********************************

##이 글은 제가 공부하고 있는 책을 요약해놓은 것이므로 본문 내용만 봐선 이해가 어려울 수 있습니다.

 

목차

5. 프로세스를 스케줄링하기 위한 큐

6. 스케줄러

7. 프로세스의 생성

8. 프로세스 간의 협력

********************************

 

5. 프로세스를 스케줄링하기 위한 큐

준비 큐(ready queue): 운영체제가 준비 상태에 있는 프로세스들을 줄세우기 위함.

장치 큐(device queue): 운영체제가 특정 자원을 기다리는 프로세스들을 줄 세우기 위해 자원별로 둠. 예를 들어 디스크에 입출력 서비스를 요청한 프로세스들은 디스크 입출력 큐에 줄을 서게 됨.

위의 큐들은 하드웨어 자원을 기다리는 프로세스들을 줄세우기 위한 것이고 소프트웨어 자원을 기다리는 경우에도 필요. 예를 들어 공유 데이터에 대한 접근 권한은 소프트웨어 자원으로 분류됨. 공유데이터에 앞서 접근 중인 프로세스가 다 사용하고 반납할 때까지 다른 프로세스가 CPU를 할당받았다 하더라도 접근하지 말고 기다려야 함.

프로세스 상태 관리는 커널의 주소영역 중 데이터 영역에 다양한 큐를 두어 수행하게 된다. 예를 들어 타이머 인터럽트 발생시 커널은 데이터 영역의 준비큐의 정보를 참조하여 어느 프로세스에 CPU를 할당할 건지 결정.

작업 큐(job queue): 시스템 내의 모든 프로세스를 관리하기 위한 큐로, 프로세스의 상태와 무관하게 현재 시스템 내에 있는 모든 프로세스가 작업 큐에 속함. 작업 큐에 있다고 해서 메모리를 가지고 있는 것이 아님. 준비큐와 장치큐를 포함하며 더 넓은 개념.

장치큐는 자원마다 큐가 하나씩 존재. 큐헤더는 큐의 가장 앞부분. 큐는 각 프로세스의 PCB를 연결 리스트 형태로 관리.

프로세스가 CPU를 할당받고 코드를 수행하다 입출력 요청이 발생하면 해당 장치 큐에 가서 줄을 섬. 장치 큐에 속한 프로세스들은 봉쇄상태에 있다가 해당 장치의 서비스를 받고 나서 장치 컨트롤러가 인터럽트를 발생시키면 준비상태로 바뀌어 준비큐로 이동.

 

6. 스케줄러

스케줄러란 어떤 프로세스에게 자원을 할당할지를 결정하는 운영체제 커널의 코드를 지칭.

장기 스케줄러/단기 스케줄러

장기 스케줄러(long term scheduler): 작업 스케줄러라고도 부르며, 프로세스를 준비 큐에 진입시킬지를 결정. CPU에서 실행되기 위해서는 프로세스가 메모리를 보유해야 하므로 장기 스케줄러는 프로세스에게 메모리를 할당하는 문제에 관여. 처음 프로세스가 생성되면 시작 상태를 거쳐 준비상태에 이르게 되는데 장기스케줄러가 시작상태의 프로세스들 중 어떤 프로세스를 준비큐에 삽입할지 결정. 장기 스케줄러는 수십 초 내지 수 분 단위로 가끔 호출되서 속도가 느린 것이 허용됨. 메모리에 동시에 올라가 있는 프로세스의 수를 조절하는 역할. 

단기 스케줄러(short term scheduler): CPU 스케줄러라고도 함, 준비상태의 프로세스 중 어떤 프로세스를 다음 번에 실행 상태로 만들 것인지 결정. 밀리초 정도의 시간 단위로 매우 빈번하게 호출.

 

현대의 시분할 시스템에서 운영체제에는 일반적으로 장기 스케줄러를 두지 않음. 과거 자원이 매우 빈약하던 시절에 사용됨. 현재는 프로세스가 시작되면 바로 프로세스에 메모리를 할당하여 준비 큐에 넣어주게 됨. 그리고 장기 스케줄러 대신 중기 스케줄러를 사용.

중기 스케줄러(medium term scheduler): 너무 많은 프로세스에게 메모리를 할당해 성능이 저하되는 것을 방지하기 위해 메모리에 적재된 프로세스 수를 동적으로 조절. 메모리양이 극도로 적어졌을 때 메모리에 올라와 있는 프로세스 중 일부를 선정해 이들로부터 메모리를 통째로 빼앗아 그 내용을 디스크의 스왑영역에 저장해둠(=스왑 아웃). 스왑 아웃의 0순위는 봉쇄 상태에 있는 프로세스들. 이들은 당장 cpu를 획득할 가능성이 없기 때문. 그 다음엔 타이머 인터럽트가 발생해 준비 큐로 이동하는 프로세스를 추가적으로 스왑 아웃시킴. 준비 큐에 너무 많은 프로세스들이 존재하면 개별 프로세스에 배정되는 메모리양이 지나치게 적어지고 CPU를 한번 할당받은 후 다시 할당받기까지 오랜 시간 소요되기 때문. 

중기 스케줄러의 등장으로 프로세스의 상태는 실행, 준비, 봉쇄 외에 추가로 중지상태가 추가됨.

중지상태의 프로세스는 외부에서 재개시키지 않은 이상 다시 활성화될 수 없어 메모리 자원이 당장 필요하지 않다. 중기스케줄러에 의해 디스크로 스왑 아웃된 프로세스의 상태가 대표적인 중지 상태의 예. 

중지준비 상태(suspended ready): 준비상태의 프로세스가 중기스케줄러에 의해 디스크로 스왑 아웃된 것.

중지봉쇄 상태(suspended block): 봉쇄상태의 프로세스가 중기스케줄러에 의해 디스크로 스왑 아웃된 것.

*중지봉쇄 상태이던 프로세스가 봉쇄되었던 조건을 만족하게 되면 이 프로세스는 중지준비 상태로 바뀜.

중지 상태의 프로세스들은 중지준비/중지봉쇄 관계없이 메모리를 조금도 보유하지 않고 디스크에 통째로 스왑 아웃된 상태로 존재하게 됨.

 

7. 프로세스의 생성

운영체제가 프로세스 전부를 생성하는 것이 아님. 시스템이 부팅된 후 최초의 프로세스는 운영체제가 직접 생성하지만 그다음부터는 이미 존재하는 프로세스가 다른 프로세스를 복제 생성. 각각 부모프로세스, 자식프로세스라고 함. 프로세스 세계에선 자식이 먼저 죽고, 이에 대한 처리는 부모 프로세스가 담당하는 방식으로 진행. 모든 후손프로세스들을 연속적으로 종료시킨 후에야 본인이 종료될 수 있음. 

프로세스 수행 모델: 부모와 자식 공존하며 수행되는 모델/ 자식이 종료될때까지 부모가 기다리는 모델

공존하는 모델: 자식과 부모가 같이 CPU를 획득하기 위해 경쟁하는 구조.

부모가 기다리는 모델: 자식 프로세스가 종료될 때까지 부모는 봉쇄상태에 머물러 있다가 자식이 종료되면 준비상태가 되어 CPU를 얻을 권한이 생긴다.

 

부모 프로세스가 자식 프로세스를 생성하면 자식은 부모와 별도의 주소 공간을 가지게 되는데, 처음 생성할 때는 부모의 주소 공간 내용을 그대로 복사해서 생성한다. 자식 프로세스가 다른 프로그램을 수행하기 위해선 생성된 주소 공간 위에 새로운 프로그램의 주소 공간을 덮어씌워 실행하게 되는 것. 

 

프로세스 종료 두가지 : 자발적 종료/비자발적 종료

자발적 종료: 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알리면서 종료가 됨. 프로세스는 명령을 모두 수행한 후, 프로그램이 마쳐지는 코드 부분에 exit()라는 시스템 콜을 넣엊도록 되어있다. 즉 프로세스는 시스템 콜을 통해 운영체제에게 자신이 종료됨을 알림. 종료를 통보받은 운영체제는 자원을 회수. exit()함수는 개발자가 명시적으로 호출하지 않아도 프로그램 종료시점에 자동으로 호출됨.

비자발적 종료: 부모 프로세스가 자식 프로세스의 수행을 강제로 종료. abort()라는 함수를 통해 이루어짐. 강제종료가 발생하는 경우는 자식 프로세스가 자원의 한계치를 넘어서는 많은 양의 자원을 요구할 때, 자식 프로세스에게 할당된 작업이 더이상 필요없을 때, 부모프로세스가 종료되는 경우가 있다. 

 

사용자계정으로 서버 컴퓨터에 접속해서 수행시킨 프로그램을 로그아웃 후에도 계속 수행시켜야 하는 경우가 있을 수 있다. 종료되는 프로세스의 자식 프로세스를 계속 실행시키기 위해선 종료되지 않을 다른 프로세스의 양자로 자식을 보내는 방법이 있음.

 

프로세스가 자식 프로세스를 생성하는 방법: 운영체제가 fork() 시스템 콜을 제공. 프로세스가 fork() 시스템 콜을 하면 CPU제어권이 커널에게 넘어가고, 커널은 fork()를 호출한 프로세스를 복제해 자식 프로세스를 생성. 이 자식 프로세스는 부모와 모든 문맥(주소공간, 프로그램 카운터, 레지스터 상태, PCB 및 커널스택)을 동일하게 가짐. 따라서 자식 프로세스는 부모 프로세스의 처음부터 수행을 시작하는 것이 아니라 부모 프로세스가 현재 수행한 시점(프로그램 카운터 지점)부터 수행하게 됨. 다만 운영체제가 관리하기 위하여 각 프로세스는 다른 식별자를 가짐.

*fork() 함수의 결괏값으로 원본에게는 양수를, 복제본에게는 0을 줌. 따라서 조건문을 이용하여 원본 프로세스와 복제본 프로세스가 다른 작업을 하도록 프로그램을 작성할 수 있음. 근데 이는 조건문에 의한 분기(branch)일 뿐 사실상 두 프로세스 모두 동일한 코드의 내용을 가질 수 밖에 없다. 유닉스에서는 프로세스 주소 공간에 새로운 프로그램을 덮어씌우는 exec() 시스템 콜을 지원한다. exec() 시스템 콜은 프로세스가 지금까지 수행했던 상태를 잊어버리고 그 주소공간을 완전히 새로운 프로그램으로 덮어씌운 후 새로운 프로그램의 첫 부분부터 다시 실행하도록 하는 시스템 콜. fork()와 exec()는 사용자 프로세스가 직접 실행할 수 없는 특권명령이기 때문에 운영체제에 서비스의 대행을 요청하는 시스템 콜을 통해서만 수행 가능. 프로세스 관련 시스템 콜은 fork(), exec(), exit() 이외에도 wait()라는 함수가 있다. wait() 시스템 콜은 자식 프로세스가 종료되기를 기다리며 부모 프로세스가 봉쇄 상태에 머무르도록 할 때 사용. 자식 프로세스가 종료되면 부모를 준비상태로 변경. 이때 봉쇄 상태는 일반적인 봉쇄 상태처럼 자원을 기다리며 줄 서 있는 것이 아니라 자식 프로세스가 종료되기를 기다리며 수면 상태에 머무르게 됨. 자식 프로세스가 종료되는 순간 준비큐에 재진입해 다시 CPU를 얻을 권한을 획득. 

 

8. 프로세스 간의 협력

원칙적으로 프로세스 간에는 서로 영향을 미칠 수 없지만 운영체제는 협력 메커니즘을 제공함. 대표적인 협력 메커니즘으로는 IPC(inter-process communication)가 있다. IPC란 하나의 컴퓨터 안에서 실행 중인 서로 다른 프로세스 간에 발생하는 통신을 말한다. 대표적인 IPC 방법으로 메시지 전달 방식공유메모리 방식이 있다. 

메시지 전달 방식:  프로세스 간에 공유 데이터를 일체 사용하지 않고 메시지를 주고받으면서 통신하는 방식. 메시지 전달을 직접 할 수는 없어서 커널이 그 역할을 함. 메시지 통신을 하는 시스템은 커널에 의해 send(message)와 receive(message)라는 두가지 연산을 제공받게 된다. 이 두 연산을 통해 전달할 메시지를 운영체제에게 시스템 콜 방식으로 요청해 전달함. 메시지를 주고받는 연산은 특권명령으로 규정해 커널을 통해서만 가능. 통신을 원하는 두 프로세스는 커뮤니케이션 링크를 생성한후 send()와 receive()를 이용하여 메시지를 주고받음.

메시지 전달 방식은 메시지 전송대상이 다른 프로세스인지 아니면 메일박스인지에 따라 직접통신간접통신으로 다시 나눠짐. 

직접통신: 통신하려는 프로세스의 이름을 명시적으로 표시. send(P,message)는 프로세스 P에게 메시지를 전송하는 것을 의미, receive(Q, message)는 프로세스 Q로부터 메시지를 전달받는 것. 링크는 자동 생성되며 하나의 링크는 한쌍의 프로세스에게 할당. 각 쌍의 프로세스에게는 오직 하나의 링크만 존재. 링크는 단방향성일 수 있으나 대부분 양방향성.

간접통신: 메시지를 메일박스 또는 포트로부터 전달받음. 각 메일박스는 고유 ID가 있으며 메일박스를 공유하는 프로세스들만 서로 통신가능. 하나의 링크가 여러 프로세스들에게 할당될 수 있고 각 프로세스 쌍은 여러 링크를 공유할 수 있다. 링크는 단방향성 또는 양방향성. 간접통신에서는 새로운 메일박스를 생성하는 연산, 메시지를 메일박스를 통해 주고받는 연산, 메일박스를 삭제하는 연산 등이 사용될 수 있다. p1,p2,p3가 메일박스A를 공유하는 경우 p1이 메시지를 보냈다면 p2,p3중 어느 프로세스가 메시지를 받게 되는가? 이러한 의문사항을 해결하기 위한 방법으로 2개의 프로세스에게만 링크를 할당하는 방법이 사용될 수 있다. 또는 링크에 대한 receive()연산을 매 시점 하나의 프로세스만 수행할 수 있도록 하는 방법이 있다.

공유메모리 방식: 프로세스들이 주소 공간의 일부를 공유. 운영체제는 공유메모리를 사용하는 시스템 콜을 지원한다. 프로세스 A와 B가 독자적인 주소 공간을 갖고 있지만, 이 주소 공간이 물리적 메모리에 매핑될 때 공유메모리 주소 영역에 대해서는 동일한 물리적 메모리 주소로 매핑되는 것이다. 공유메모리 방식은 서로의 데이터에 일관성 문제가 유발될 수 있다. 커널은 이에 책임을 지지 않기 때문에 프로세스들끼리 직접 공유메모리 접근에 대한 동기화 문제를 책임져야 한다.

 

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글