OS

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

shininghyunho 2023. 11. 15. 20:06

프로세스

프로세스 : 실행중인 프로그램. 디스크에 존재하던 프로그램이 메모리에 올라와 실행상태가 됨.
(프로세서는 CPU를 칭함.)

 

CPU를 여러 프로세스가 점유했다가 뺐기므로 이전 프로세스를 복구할 수 있어야함.

이때 이전 프로세스를 복구하기위한 정보를 프로세스 문맥이라고함.

 

하드웨어 문맥 : CPU의 수행상태. PC(Program Counter), 각종 레지스터 값

프로세스의 주소공간 : Code,Data,Stack,... 같은 독자적인 주소공간

커널상의 문맥 : 프로세스가 되면 운영체제는 해당 프로세스를 위한 PCB와 커널스택을 생성함.

 

PCB

PCB는 프로세스를 저장 및 복구하기 위한 운영체제의 정보(자료구조)이다.

CPU dispatcher가 다음 실행할 프로세스를 결정할때(문맥교환시) 해당 PCB를 보고 복구한다.
그러므로 복구에 필요한 모든 정보가 있어야한다.
(그밖에 타이머 인터럽트나 프로세스 I/O 요청시 모드 변경에도 PCB가 사용됨)

  • pointer : 부모 프로세스 pointer, 자식 프로세스 pointer, 해당 프로세스 pointer 등등
  • process state : 프로세스 상태. ready, running, block, suspend, new, terminated.
  • CPU scheduling information : CPU 스케쥴링 정보. 우선순위, 마지막 실행시간, CPU 점유시간
  • proces number : 프로세스 번호.
  • program counter : PC라고하며, 다음 수행할 명령의 위치를 나타냄.
  • registers : CPU 연산을 위해 레지스터에 값들을 저장.
  • memory management information : 메모리 관리 정보. 해당 프로세스의 주소 공간 등등
  • I/O status information : 해당 프로세스가 오픈한 파일 정보 등등

 

프로세스 스케쥴링을 위한 큐

자원은 한정적인데 프로세스는 여러개이므로 자원마다 각각의 큐(queue)가 존재함.

큐에서 어떤 프로세스에게 자원을 할당할지는 운영체제가 결정.

 

  • ready que(준비 큐) : 프로세스들이 CPU를 기다리는 큐.
  • device que(장치 큐) : 각 자원들(디스크, 키보드, ...) 을 점유하기 위한 큐. block state가 됨.
  • job queue(작업 큐) : 시스템 내 모든 프로세스를 관리하는 큐.
    시스템내 모든 프로세스가 할당됨. 메모리에 올라와 있는지와는 무관함.

이밖에 주소공간의 공유 데이터는 여러 프로세스가 접근해 충돌이 나면 안되므로 이를 위한 큐가 존재함. 

 

아래의 그림과 같이 각 큐들은 PCB들의 연결리스트 형태로 존재.

프로세스의 상태 및 스케줄러

  • 프로세스는 new -> ready 상태로 생성이된다.
  • 이후 ready queue에서 기다리다가 dispatcher 에 의해 running 상태가 된다.
  • running 상태에서 I/O 요청이 들어오거나하면 block 상태가 된다.
  • 또는 running 상태에서 할당된 시간을 모두 사용하면 timer 에 의해 인터럽트가 발생되고 다시 ready 상태가 된다.
  • 이렇게 진행되다가 프로세스 수가 많아져 memory 가 부족해지면 block 상태나 ready 상태가 suspend 된다.
  • suspend 상태는 디스크의 swap 영역으로 내려옴(out) 됨을 의미하고 메모리를 사용하지 않게된다.

아래는 각 스케줄러의 세부적인 역할이다.

  • 장기 스케줄러 : new -> ready state. 옛날에 메모리가 부족할때 어떤 프로세스를 메모리에 올릴지 결정했었음.
    현재는 장기 스케줄러 없이 바로 메모리를 할당해 ready queue에 넣어줌.
  • 중기 스케줄러 : block state -> suspended block state. ready state -> suspended ready state.
    suspended 가 되는 상태를 말함. 메모리에 너무 많은 프로세스가 생겨서 특정 프로세스를 디스크로 swap out 된다.
    메모리에 너무 많은 프로세스가 올라와있으면 프로세스당 할당받을 메모리 자체가 줄어든다.
    suspend 되는 0순위는 메모리가 당장 필요없는 block 상태다.
    이후 ready 상태에도 너무 많은 프로세스가 생기면 swap out 될 수 있다.
  • 단기 스케줄러 : ready state -> running state. ready queue에서 대기중인 프로세스들 중에서 어떤 프로세스를 실행시킬지 (이를 dispatch 라고 함) 결정한다. FIFO, 우선순위, Round Robin, Multi Level Queue, 등등.
    이름이 단기인 이유는 굉장히 자주일어나고 빠른시간내에 수행되기 때문.

프로세스의 생성

컴퓨터가 부팅될때 최초의 프로세스는 운영체제가 생성해주지만,

이후의 프로세스들은 부모 프로세스가 자식 프로세스를 생성하는 방식으로 생성된다.

 

부모와 자식의 관계는 트리 형태이므로 부모 프로세스는 자식이 모두 종료되어야 종료가 가능함.
반대로 말하면 부모 프로세스가 종료되면 자식 프로세스들은 강제적으로 순차적인 종료가 됨.

부모가 exit() 이라는 시스템 콜을 하면 자식도 모두 종료가 된다는 말.

 

 

유닉스의 예시로 프로세스의 생성과정을 설명하자.

  1. 부모 프로세스는 fork() 라는 시스템 콜을 호출해 자식 프로세스를 생성.
  2. 자식 프로세스는 부모와 독립된 주소공간을 갖지만 문맥은 부모의 것과 동일(PID 만 다름)
  3. 자식 프로세스는 exec() 시스템 콜을 통해 새로운 주소공간에 덮어 씌우기가 가능.

 

코드를 통해 보자면 fork() 호출하면 부모와 자식은 fork()의 결과값부터 분기가 됨.

부모는 결과값이 양수이고 자식은 0이됨.

 

자식 프로세스는 부모와 동일한 코드를 가지므로 독자적인 프로그램 실행을 위해서는 exec() 이라는 시스템 콜을 호출해야함. 이를 통해 주소공간의 새로운 프로그램을 덮어씌울 수 있음.

 

터미널에서 특정 명령어를 실행시키면 생성된 프로그램은 동작하지만 터미널은 멈춰있게됨.

이는 터미널이 부모 프로세스인데 wait() 이라는 시스템 콜을 호출하기 때문.

wait()은 자식 프로세스가 종료될때까지 부모 프로세스가 block 상태로 기다리게됨.

이를 통해 부모와 자식의 동기화가 가능.

 

프로세스간 협력

프로세스들끼리는 독자적인 주소공간을 갖기때문에 원칙적으로는 소통이 불가능함.

그러나 프로그램 특성상 다른 프로세스와 통신이 필요한 경우가 생김.

대표적인 매커니즘으로 IPC(Inter-Process Communication)이 있음.

 

IPC는 두가지 방식으로 구현 가능.

  • 메시지 패싱(message passing) : 공유 메모리 사용없이 메시지를 전달.
  • 공유 메모리(shared memory) : 공유 메모리를 사용하여 데이터를 공유.

메시지 패싱

메시지 패싱은 send(), receive() 라는 시스템 콜을 통해 진행되며,

2가지 방식으로 구현이 가능하다.

  • 직접 통신 : 링크를 생성해 단방향 또는 양방향으로 통신한다.
  • 간접 통신 : 중간에 메일 박스(mail box) 또는 포트(port)를 두고 이를 매개체로 통신한다.
    간접통신은 send, receive외에 메일 박스 생성,삭제 명령어가 가능.
    메일 박스에 할당되는 링크가 여러개일 경우 링크를 따로따로 설정하든지, 매시점 한 프로세스만 받게해야한다.

 

공유 메모리

공유 메모리 방식에서는 두 프로세스가 각자의 주소 공간중 일부를 공유 메모리 공간으로 사용한다.
그래서 공유 메모리 공간은 두 프로세스가 볼때 서로 자신의 주소 공간으로 본다.

 

공유 메모리 방식은 동기화 문제가 발생할 수 있지만,

이는 운영체제가 아닌 공유 메모리를 사용하는 프로세스들끼리 해결해야한다.