#4 프로세스 관리 - 운영체제와 정보기술의 원리
프로세스란?
간단하다. 디스크에 존재하던 프로그램이 메모리에 올라가 실행 중인 상태를 나타낸다. 다시 말해 CPU를 보유하고 기계어 명령 실행이 가능한 단계입니다.
프로세스 문맥(Process Context)
프로세스가 현재 어떤 상태에서 무엇을 수행하고 있는지를 알기 위한 정보를 의미한다. 다시말해 프로세스 문맥은 그 프로세스의 주소공간을 비롯해 레지스터에 어떤값을 가지고 있었는지 시스템 콜 등을 통해 커널에서 수행한 일의 상태, 그 프로세스에 관해 커널이 관리하는 각종 정보를 말합니다.
프로세스 문맥은 크게 세가지로 분류합니다.
1. 하드웨어 문맥
2. 프로세스의 주소 공간
3. 커널 상의 문맥
프로세스의 상태
프로세스 상태는 크게 생성, 실행, 준비, 봉쇄, 종료 상태로 나눌 수 있습니다. 실행 상태는 CPU를 할당받고 기계어 명령을 수행하고 있는 단계를 말합니다. 준비 상태는 CPU만 할당받으면 당장 명령을 수행할 수 있지만 CPU가 하나밖에 없어 CPU를 할당받지 못한 프로세스의 상태를 말합니다. 봉쇄 상태는 CPU를 할당받더라도 명령을 수행할 수 없는 프로세스의 상태를 말합니다.
프로세스가 실행 중이던 작업을 중단하고 다른 프로세스에게 CPU를 넘겨주는 경우, 현재 수행중이던 문맥을 저장하고 새로운 프로세스의 문맥으 세팅하게 되는데. 이를 문맥 교환(switch context)이라고 합니다.
준비 상태에 이쓴 프로세스들 중에서 CPU를 할당 받을 프로세스를 선택한 후 실제로 CPU의 제어권을 넘겨받는 과정을 CPU 디스패치(dispatch)라고 합니다.
프로세스 제어 블록(PCB : Process Controll Block)
프로세스 제어 블록이란 운영 체제가 시스템 내의 프로세스들을 관리하기 위해 프로세스당 유지하는 정보들을 담는 커널 내의 자료구조를 말합니다. PCB는 다음과 같은 요소들로 구성됩니다.
- 프로세스의 상태 : 프로세스에게 CPU를 할당해도 되는 상태인가?
- 프로그램 카운터 값 : CPU가 다음에 수행해야할 명령어의 주소는 어디인가?
- CPU 레지스터 : CPU 연산을 위해 현 재 레지스터에 어떤값이 저장되어 있는가?
- CPU 스케쥴링 정보 : 어떤 프로세스에게 CPU를 할당할 것인가?
- 메모리 관리 정보 : 메모리 할당을 위해 필요한 정보는 무엇인가?
- 자원 사용 정보
- 입출력 상태 정보
문맥교환
문맥교환이란 하나의 사용자 프로세스로부터 다른 사용자 프로세스로 CPU의 제어권이 이양되는 과정을 말합니다. 다만, 혼동하면 안되는 것이 있습니다. 타이머 인터럽트와 입출력을 위한 시스템콜을 제외한 인터럽트 발생시, 모드 비트(mode bit) 변경을 통한 명령 권한의 차이가 대부분이기 때문에 이런 경우는 문맥교환이 발생했다고 하지 않습니다.
프로세스를 스케쥴링 하기 위한 큐
프로세스를 스케줄링하기 위한 큐에는 작업 큐, 준비 큐, 장치 큐 등이 있습니다.
작업 큐 : 프로세스의 상태와 무관하게 현재 시스템 내에 있는 모든 프로세스가 작업큐에 속하게 됩니다.
준비 큐 : CPU를 할당받고 실행되기 위해 기다리고 있는 프로세스의 집합을 말합니다.
장치 큐 : 각각의 장치마다 서비스를 기다리며 줄 서 있느 프로세스의 큐를 말합니다.
스케줄러(Scheduler)
스케줄러란 어떤 프로세스에게 자원을 할당할지를 결정하는 운영 체제 커널의 모듈을 지칭한다.
장기 스케줄러(long time Scheduler) = 작업 스케줄러(job Scheduler)
어떤 프로세스를 준비 큐에 삽입할지를 결정하는 역할을 합니다. 준비 큐는 CPU만 얻으면 당장 실행될 수 있는 프로세스의 집합이고, CPU에서 실행되기 위해서는 프로세스가 메모리를 보유해야 합니다. 그러므로 장기 스케줄러는 프로세스에게 메모리를 할당하는 문제에 관여하죠하지만 현대의 운영 체제에는 일반적으로 장기 스케쥴러를 두지 않는 경우가 대부분입니다.
중기 스케줄러(medium term schduler)
장기 스케줄러 대신에 중기 스케줄러를 두는 경우가 많아졌습니다. 중기 스케줄러는 너무 많은 프로세스에게 메모리를 할당해 시스템의 성능이 저하대는 경우를 방지하기 위해 메모리에 적재되어 있는 프로세스의 수를 관리하는 역할을 합니다.
메모리에 적재된 프로세스의 수를 왜 관리해야 할까?
메모리에 적재되어 있는 프로세스의 수가 많아지면 그 만큼 각각의 프로세스에 할당되는 메모리양은 당연히 줄어 들게 됩니다.
이런 경우 스왑 아웃(swap out)이 수시로 발생하게 되고 이에 따른 오버헤드 발생으로 인해 시스템 성능이 저하될 수 있기 때문이죠! 중기 스케줄러에 의해 스왑 당한 프로세서의 상태는 중지(suspended, stopped) 상태가 됩니다,
*스왑 아웃(swap out) : 메모리의 내용을 디스크로 이동시키는 행위
*스왑 인(swap in) : 디스크의 내용을 메모리로 이동시키는 행위
단기 스케줄러(short term scheduler) = CPU 스케줄러
준비 상태의 프로세스 중에서 어떤 프로세스를 다음 번에 실행 상태로 만들것인지 결정하는 역할을 합니다. 다시 말해, 준비 큐에 있는 여러 프로세스들 중에서 어떤 프로세스에게 CPU를 할당할 것인가를 결정하게 됩니다.
프로세스 간의 협력
프로세스는 각자 자신만의 독립적인 주소 공간을 가지고 수행되며, 프로세스가 다른 프로세스의 주소 공간을 참조하는 것은 허용되지 않습니다. 그렇다면 여러 개의 프로세스들이 서로의 정보를 주고 받을 수 있는 방법엔 무엇이 있을까요?
프로세스 간의 협력 매커니즘을 위해 운영 체제가 제공하는 대표적인 메커니즘으로는 IPC(inter-process communication)이 있습니다.
IPC란? 하나의 컴퓨터 안에서 실행중인 서로 다른 프로세스 간에 발생하는 통신을 말하며 동기화 또한 보장해 주어야 한다.
이런 IPC의 대표적인 방법으로는 메시지 전달(message passing) 방식과 공유 메모리(shared memory) 방식이 있습니다. 두 방식의 차이점은 공유 변수를 사용하는지에 대한 여부에 따라 달라집니다.
메시지 전달 방식
프로세스 간에 공유 변수를 일체 사용하지 않고 메시지를 주고 받는 통신 방법, 프로세스간 직접 메시지를 전달할 수 없기 때문에 커널이 중간에서 메시지를 발송해주는 역할을 합니다. 프로세스는 시스템 콜을 통해 send(), receive()라는 두 가지 연산을 제공하여 커널에게 메시지 발송 의사를 밝히면 커널은 명령을 수행 합니다.
메시지 전달 방식은 통신 대상에 따라 두 가지로 분류 됩니다.
1. 직접 통신(direct communication) : 직접 메시지를 받을 프로세스를 명시합니다.
2. 간접 통신(indirect communication) : 중간 메시지 메일 받스를 통해 연결된 프로세스들에게 메시지를 전송합니다.
공유 메모리 방식
공유 메모리 방식은 프로세스들이 주소 공간의 일부를 공유하게 됩니다. 일반적으로 프로세스들의 주소 공각은 독립적이기 때문에 운엥체제에서 공유 메모리를 사용하는 시스템 콜을 지원하여 서로 다른 프로세스들이 그들의 주소 공간 중 일부를 고유할 수 있도록 도와줍니다. 공유 메모리 방식에서 데이터에 관한 동기화 문제는 프로세스들이 직접 해결해야 합니다.