Summary

[운영체제와 정보기술의 원리] 05장. 프로세스 관리

프로그래민 2021. 12. 20. 01:10
반응형

프로세스의 개념

프로세스란 실행중인 프로그램으로써 디스크에 존재하는 프로그램이 메모리에 올라가 있는 형태이다. 프로세는 CPU를 획득해 코드를 수행하기도 하고, CPU를 반환하여 입출력을 하기도 한다. 이때 프로세스의 문맥(Context)를 이용하여 현재 어떤 상태에서 수행되고 있는지 필요한 정보를 얻을 수 있다. 프로세스의 문맥은 프로세스의 주소 공간(코드, 데이터, 스택)을 비롯해 레지스터에 어떤 값을 가지고 있는지와 시스템 콜등을 통해 커널에서 수행한 일의 상태, 그 프로세스에 관해 커널이 관리하고 있는 정보등을 포함한다.

프로세스의 문맥을 구성하는 요소

다시 정리하면 프로세스의 문맥은 크게 하드웨어 문맥, 프로세스의 주소 공간, 커널상의 문맥으로 나눌 수 있다. 하드웨어 문맥은 CPU의 상태를 나타내는 PC값과 각종 레지스터 값등을 의미한다. 프로세스의 주소 공간은 스택, 데이터, 코드 공간을 의미한다. 커널상의 문맥은 PCB와 커널스택을 의미한다.

 

프로세스의 상태

프로세스의 상태 변화도

프로세스의 상태는 실행(Running), 준비(Ready), 봉쇄(Blocked, Wait, Sleep)로 나뉠 수 있다. 실행 상태는 프로세스가 CPU를 보유하고 기계어 명령을 실행하고 있는 상태이다. 준비 상태는 프로세스가 당장 명령을 실행할 수 있지만 CPU를 할당받지 못한 상태이다. 봉쇄 상태는 CPU를 할당받더라도 당장 명령을 실행할 수 없는 상태이다. 대표적인 봉쇄 상태는 입출력 작업이 진행중인 경우이다. 이밖에도 프로세스가 시작되어 프로세스를 위한 자료구조가 생성되었지만 메모리를 획득하지 못한 시작(New) 상태와 프로세스가 종료되었지만 운영체제가 프로세스의 자료구조를 완전히 정리하지 못한 완료(Terminated) 상태가 있다.

프로세스는 하나의 상태에 머물게 된다. 또한 계속 상태 변화가 일어나는데 실행시킬 프로세스를 변경하기 위해 원래 수행 중이던 프로세스의 문맥을 저장하고 새로운 프로세스의 문맥을 세팅하는 과정을 문맥교환(Context Switch)라고 한다. 대표적으로 타이머에 의한 인터럽트나 입출력 시스템콜이 있다.

 

프로세스 제어블록

프로세스 제어블록(Process Controll Block, PCB)는 운영체제가 시스템 내의 프로세스들을 관리하기 위해 프로세스마다 유지하는 정보들을 담는 커널 내의 자료구조이다. 다음과 같은 것들로 구성되어 있다.

프로세스 제어블록(PCB)의 구성

  • 프로세스의 상태 : CPU를 할당 해도 되는 지 여부 결정
  • 프로그램 카운터(PC)의 값 : 다음에 수행할 명령의 위치
  • CPU 레지스터의 값 : CPU 연산을 위한 레지스터 값
  • CPU 스케쥴링 정보 : 프로세스의 CPU 스케쥴링
  • 메모리 관리 정보 : 프로세스의 메모리 할당
  • 자원 사용 정보 :  자원 사용 요금을 계산
  • 입출력 상태 정보 : 입출력 관련 상태 정보

 

문맥교환

문맥교환(Context Switch)란 하나의 사용자 프로세스로부터 다른 사용자 프로세스로 CPU의 제어권이 이양되는 과정이다. 예를 들면 프로세스가 실행중 타이머 인터럽트가 발생하면 CPU의 제어권이 넘어가게 된다. 타이머 인터럽트 처리루틴으로 가서 직전까지 수행중이던 프로세스의 문맥을 저장하고, CPU의 제어권을 새로운 프로세스에게 이양한다. 이때 원래 수행중이던 프로세스는 준비 상태가 되고, 새로운 프로세스는 실행 상태가 된다. 

문맥 교환의 모습

문맥교환 중에 원래 CPU를 보유하고 있던 프로세스는 PC값 등 프로세스의 문맥을 자신의 PCB에 저장하고, 새로운 프로세스는 예전에 저장했던 자신의 문맥을 PCB로부터 실제 하드웨어로 복원시키는 과정을 거친다.

문맥교환이 일어나는 경우와 그렇지 않은 경우의 예

다만 사용자 모드에서 커널모드로 바뀌는 경우는 문맥교환이라 하지 않는다. 그리고 타이머 인터럽트가 발생하거나 프로세스가 입출력 요청 시스템 콜을 하여 봉쇄 상태에 들어가는 경우에는 문맥교환이 일어나지만, 그 밖의 인터럽트나 시스템 콜 발생 시에는 문맥교환이 일어나지 않고 실행모드만 변경될 뿐이다.

 

프로세스를 스케쥴링하기 위한 큐

운영체제는 준비 상태에 있는 프로세스들을 줄 세우기 위해 준비 큐(Ready Queue)를 두고 앞에 있는 프로세스 순서대로 CPU를 할당한다. CPU를 기다리는 프로세스들을 줄세우는 준비 큐 외에도 운영체제는 특정 자원을 기다리는 프로세스들을 줄 세우기 위해 자원별로 장치 큐(Device Queue)를 둔다. 디스크의 경우 디스크 입출력 큐(Disk I/O Queue)에 줄서게 된다. 디스크 컨트롤러는 디스크 입출력 큐에 줄 서 있는 순서대로 프로세스들의 입출력 작업을 수행한다. 

프로세스의 상태 변화와 각종 큐의모습

앞선 큐들은 하드웨어 자원을 기다리는 프로세스들을 줄 세우기 위해 필요한 것이었다. 소프트웨어 있어서도 이러한 큐가 필요하다. 이를테면 공유 데이터에 대한 접근에 있어서도 큐를 사용할 수 있다. 즉 여러 프로세스가 공유 데이터에 동시에 접근하려고 할 경우 공유 데이터를 기다리는 큐에 줄 서게 하여 현재 프로세스가 데이터를 반납하기 전까지 접근을 금하고, 반납할 경우 큐의 순서에 따라 접근 권한을 주는 방법이다. 

프로세스의 상태 변화 큐를 관리하는 운영체제 커널 주소 공간 구조

이와 같이 프로세스의 상태 관리커널의 주소 영역 중 데이터 영역에 다양한 큐를 두어 수행하게 된다. 각 프로세스가 CPU를 기다리는 지, 입출력을 기다리는지 등의 정보를 커널이 총체적으로 관리하게 된다. 

운영체제는 준비 큐, 장치 큐 외에 작업 큐를 추가로 유지한다. 작업 큐는 시스템 내의 모든 프로세스를 관리하기 위한 큐로 프로세스의 상태와 무관하게 현재 시스템내에 있는 모든 프로세스가 작업 큐에 속한다.

 

스케줄러

스케줄러란 어떤 프로세스에게 자원을 할당할지를 결정하는 운영체제 커널의 코드이다. 크게 장기 스케줄러(Long Term Scheduler)중기 스케줄러(Medium Term Scheduler), 단기 스케줄러(Short Term Scheduler)가 있다.

장기 스케줄러작업 스케줄러라고도 하며 어떤 프로세스를 준비 큐에 진입 시킬지를 결정한다. 다시 말해 장기 스케줄러는 시작 상태의 프로세스들 중 어떠한 프로세스를 준비 큐에 삽입할 것인지를 결정하는 역할을 하게 된다. 느린 특성이 있으며 메모리에 동시에 올라가 있는 프로세스의 수를 조절한다.

단기 스케줄러CPU 스케줄러라고도 하며 준비 상태의 프로세스 중에 어떤 프로세스를 다음번에 실행 상태로 만들 것인지 결정한다. 다시 말해 준비 큐에 있는 여러 프로세스들 중 어떠한 프로세스에게 CPU를 할당 할 것인지를 결정한다. 타이머 인터럽트가 발생하면 단기 스케줄러가 호출된다. 장기 스케줄러에 비해 빠르고 빈번하게 호출된다. 

현대의 운영체제는 장기 스케줄러보단 중기 스케줄러를 많이 사용한다. 중기 스케줄러는 너무 많은 프로세스에게 메모리를 할당해 시스템의 성능이 저하되는 경우를 해결하기 위해 메모리에 적재된 프로세스의 수를 동적으로 조절하는 역할을 한다. 프로세스당 보유 메모리야이 지나치게 적어진 경우 이를 완화시키기 위해 일부 프로세스를 메모리에서 디스크로 스왑 아웃시키는 역할을 한다. 중기 스케줄러가 메모리에서 디스크로 스왑아웃 시키는 프로세스는 봉쇄상태있는 프로세스가 0순위이다. 봉쇄 상태 프로세스들은 당장 CPU를 획들할 가능성이 없기때문에 메모리를 보유하고 있는 것 또한 의미가 없기 때문이다.

중지 상태를 포함한 프로세스의 상태 변화도

중기 스케줄러의 등장으로 프로세스의 상태에는 실행, 준비, 봉쇄외에 외부적인 이유로 프로세스의 수행이 정지된 상태중지(Suspended, Stopped)가 추가 된다. 중지 상태의 프로세스는 메모리를 통쨰로 빼앗기고 디스크로 스왑 아웃된다.

 

프로세스의 생성

시스템의 부팅 후, 최초의 프로세스는 운영체제가 직접 생성하지만 그 다음부터는 이미 존재하는 포로세스가 다른 프로세스를 복제 생성한다. 이때 프로세스를 생성한 프로세스를 부모 프로세스, 생성된 프로세스를 자식 프로세스라고 한다. 운영체제는 자식 프로세스의 생성을 위해 fork() 시스템 콜을 제공한다. 새로운 프로그램을 수행시키기 위해서는 fork()를 통해 기존 프로세스와 동일한 프로세스를 복제한 후 exec()를 통해 새롭게 수행시키려는 프로세스를 자식 프로세스의 주소 공간에 덮어씌우면 된다.

프로세스의 수행도

프로세스가 자원을 획득할 때 운영체제로 부터 직접 받을 수도 있고, 부모 프로세스로 부터 자원을 공유해서 사용할 수도 있다. 부모와 자식이 공존 하며 이 둘이 CPU를 획득하기 위해 경쟁하는 모델도 있고, 자식이 종료될 때 까지 봉쇄상태에서 기다리며 자식 프로세스가 종료되면 부모 프로세스가 준비상태가 되는 모델도 있다.

프로세스가 생성되면 자신만의 독자전이 주소 공간을 가진다. 부모 프로세스가 자식 프로세스를 생성하면 자식 프로세스는 부모 프로세스와는 별도의 주소 공간을 가지게 되는데, 처음 에는 부모 프로세스의 주소 공간 내용을 그대로 복사한다.

원칙적으로 부모 프로세스가 종료되기 전에 그 아래 모든 자식 프로세스가 먼저 종료되어야 한다. 프로세스 종료 방법은 크게 두가지다. 첫번째는 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려 이루어지는 자발적 종료이다. 두번째는 비자발적 종료로 부모 프로세스가 자식 프로세스의 수행을 강제로 종료시키는 것이다. 

 

프로세스 간의 협력

프로세스는 각자 독립적인 주소 공간을 가지고 다른 프로세스의 주소 공간을 참조하는 것은 허용되지 않는다. 다만 운영체제는 프로세스 간의 협력 메커니즘을 제공하여 하나의 프로세스가 다른 프로세스에게 영향을 미칠 수 있게 한다.

이러한 협력 메커니즘 중에 대표적인 거에는 IPC(Inter Process Communication)이 있다. 하나의 컴퓨터 안에서 프로세스간 발생하는 통신으로써 하나의 프로세스가 공유 데이터의 값을 변경하는 동안 다른 프로세스는 그 프로세스에 접근할 수 없다. IPC는 동기화를 이루기위한 메커니즘으로 메시지 전달(Message Passing) 방식과 공유메모리(Shared Memory) 방식이 있다. 두개의 차이는 공유 메모리의 사용여부이다.

직접통신과 간접통신

메시지 전달 방식은 공유 메모리를 사용하지 않고 메시지를 커널이 전달하는 방식이다. send, receive 연산을 커널이 제공하며 프로세스는 이를 이용하는 방식이다. 메시지 전달은 프로세스로 직접 전달하는 직접통신과 메일박스라는 일종의 저장공간에 전달하는 간접통신이 있다. 

메시지 전달 방식과 공유메모리 방식

공유메모리 방식은 프로세스들이 주소 공간의 일부를 공유하는 방식이다. 운영체제가 공유메모리를 사용하는 시스템 콜을 지원하여 일부를 고유할 수 있도록 한다.

 

 

출처
운영체제와 정보기술의 원리 - 이화여자대학교출판문화원 출판, 반효경 저
 

운영체제와 정보기술의 원리 - 교보문고

이 책은 총 10장으로 구성되어 있다.1장 ‘컴퓨터 및 정보기술의 역사’에서는 운영체제를 설명하기에 앞서 정보기술의 원리와 철학에 대해 정의하고, 컴퓨터와 정보기술 분야의 역사를 간략히

www.kyobobook.co.kr

반응형