본문 바로가기
Computer Science/컴퓨터공학(김용담 강사님)

프로세스 관리: 생성, 제거, 스케줄링 (feat. PCB)

by 코듀킹 2023. 4. 26.

프로세스 관리(Process management)

목차
1. PCB(Pcrosess Control Block)란?
2. 프로세스 생성: 프로세스가 어떻게 만들어질까? 
3. 프로세스 제거(termination)
4. 프로세스 스케줄링(Proces Scheduling)

 

1. PCB(Pcrosess Control Block)란?

PCB(Process Control Block)는 운영 체제가 프로세스를 관리하기 위해 사용하는 자료구조이다. 각 프로세스마다 하나의 PCB가 할당되며, 해당 프로세스의 상태와 제어 정보를 저장한다. PCB에는 다양한 정보가 저장되는데, 일반적으로는 다음과 같은 정보들이 포함된다.

 

  1. 프로세스 상태 (Process State): 프로세스의 현재 상태를 나타낸다. 예를 들면, 실행중, 대기 중, 정지 중 등의 상태가 있을 수 있다.
  2. 프로그램 카운터 (Program Counter): 현재 실행 중인 명령어의 주소를 저장한다. 이를 통해 다음에 실행될 명령어를 가리킵니다.
  3. 레지스터 (Registers): 프로세스가 사용하는 CPU 레지스터의 값들을 저장한다. 예를 들면, 일반적인 레지스터(AX, BX, CX, DX 등)와 스택 포인터, 베이스 레지스터 등이 있을 수 있다.
  4. 프로세스 식별자 (Process ID): 각 프로세스를 구분하기 위한 고유한 식별자를 저장한다. 보통 정수값으로 표현된다.
  5. CPU 스케줄링 정보 (CPU scheduling information): 프로세스의 우선순위를 나타낸다. 우선순위가 높은 프로세스는 더 많은 CPU 시간을 할당받는 경우가 있다.
  6. 메모리 관리 정보 (Memory Management Information): 프로세스가 사용하는 메모리 공간에 대한 정보를 저장한다. 예를 들면, 프로세스의 주소 공간 범위, 페이지 테이블 정보 등이 있을 수 있다.
  7. 입출력 상태 (I/O Status): 프로세스가 현재 입출력 작업을 수행 중인 경우, 그 상태를 저장한다. 예를 들면, 어떤 파일을 읽고 있는지, 어떤 장치에 출력 중인지 등의 정보가 있을 수 있다.

 

운영 체제는 이러한 PCB를 사용하여 프로세스를 스케줄링하고, 상태 전환이나 제어 정보를 관리한다. 프로세스 상태에는 new, ready, runnung, waiting, terminated 총 5가지 상태가 있다. new 상태에서는 PCB를 기록한다. 이때, 프로세스를 OS가 이해할 수 있게 식별자를 쓴다. 이걸 Pid라고 한다. Pid가 붙는 방식은 랜덤에 가깝다. 다 똑같이 카카오톡을 켜도, 각 컴퓨터마다 pid가 다르다. 프로세스가 현재 내 컴퓨터에서 관리하고 있는 id이다.

 

프로그램 카운터 부터 I/O까지에 대한 정보들을 모두 가지고 있는 걸 PCB라고 한다고 했다. 그래서 PCB는 기본적으로 메모리 상에서 테이블 형태로 관리한다. 즉, PCB는 테이블이라고 생각하면 된다. 테이블 순서대로 정해진 위치에 정해진 숫자를 기록해놓은 형태로 메모리에 기록되어 있다. 메모리 구조는 일자로 쭉 이어져 있는 공간으로 컴퓨터가 해석한다. 마치, 호텔방에 층 개념이 없고, 101호부터 16000002030(16억)호까지 쭉 이어져있는 구조이다. 그 일자로 이루어져있는 메인 메모리는 전부 address로 관리 된다. 예를 들어 '프로세스 pid 8601번은 104호부터 1104호까지의 공간을 쓴다' 이런식으로 관리한다.

 

컴퓨터가 부팅된 순간부터, 끝날때까지 전부다 전부 다 모든 일은 호텔 1층에서 일어난다. 거기에 있는 모든 address를 누가 어떻게 쓰느냐로 관리를 하고, 거기에 왔다갔다하는게 CPU이다. 모든 프로세스들은 메인 메모리 위에 데이터가 기록되어있고, 그걸 계산하는건 CPU가 한다. 

 

 

2. 프로세스 생성: 프로세스가 어떻게 만들어질까? 

컴퓨터가 처음에 켜지면, OS가 로딩 또는 부팅이 된다. 컴퓨터의 부팅 과정에서는 OS가 메인 스토리지(HDD/SSD)에서 불러와져서 실행된다. 부팅과정에서는 ROM에 저장된 BIOS나 UEFI가 먼저 실행되어 하드웨어를 초기화하고, 메인 스토리지의 부트 섹터를 찾아서 OS를 로드하게 된다. 즉, 컴퓨터의 부팅 과정에서는 ROM과 메인 스토리지가 함께 작동하여 OS를 실행시킨다. 

 

parent process에서 child process를 생성 (fork)

부팅이 끝나고 로딩이 되면, OS라는 관리 프로그램이 켜진다. 그리고 OS는 유저가 세팅해놓은 것에 따라 여러가지 프로그램들을 킨다. 즉, 프로세스를 생성한다. OS도 프로세스인데, OS 내부에 들어가있는 굉장히 많은 프로세스들도 함께 켜진다. (운영체제나 프로그램을 실행시키는 과정에서, 해당 프로그램이 메모리에 올라가는 과정을 로딩이라고 하고, 메인 메모리에 올라온 프로그램을 프로세스라고 한다.) 맨 처음에 켜지는 프로세스들은 OS에 있는 프로세스들이고, 이 프로세스들이 켜지면서 자기가 관리할 프로세스들을 만든다. 이때, 관리하는 프로세스를 Parent process라고 하고, 관리받는 프로세스를 Child process(자식 프로세스) 라고 한다. Child 프로세스를 생성하는 과정을 전문용어로 fork라고 한다. 프로세스가 fork한다라고 하면, parent가 child 프로세스 만드는 것이라고 이해하면 된다.

 

더보기

Child process(자식 프로세스)와 Parent process(부모 프로세스)는 운영 체제에서 프로세스 간의 관계를 나타내는 용어입니다.

 

Parent process는 다른 프로세스를 생성하여 자식 프로세스를 만드는 원본 프로세스를 의미합니다. 자식 프로세스는 부모 프로세스에 의해 생성된 프로세스로, 부모 프로세스의 특성과 자원을 상속받을 수 있습니다.

 

자식 프로세스는 부모 프로세스로부터 fork() 시스템 호출이나 다른 프로세스 생성 메커니즘을 통해 생성될 수 있습니다. fork() 시스템 호출은 부모 프로세스를 그대로 복제하여 자식 프로세스를 생성하는 방식으로, 자식 프로세스는 부모 프로세스의 주소 공간, 파일 디스크립터, 환경 변수 등을 상속받게 됩니다.

 

부모 프로세스는 자식 프로세스를 생성한 후에도 계속 실행되며, 자식 프로세스가 종료되면 해당 자식 프로세스의 종료 상태(exit status)를 확인할 수 있습니다. 또한 부모 프로세스는 자식 프로세스를 제어하고 관리할 수 있는 권한을 가지고 있습니다.

 

자식 프로세스는 독립적인 실행 흐름을 가지며, 부모 프로세스와는 별도의 메모리 공간을 가지게 됩니다. 따라서 자식 프로세스는 부모 프로세스와 독립적으로 실행되며, 자신만의 리소스와 상태를 가지게 됩니다.

 

이렇게 부모 프로세스와 자식 프로세스가 협력하여 작업을 수행하면, 프로세스 간의 협력과 병렬 처리를 통해 다양한 기능을 구현할 수 있습니다. 예를 들면, 부모 프로세스가 사용자 인터페이스를 담당하고, 자식 프로세스가 실제 작업을 수행하는 등의 형태로 사용될 수 있습니다.

 

process들은 고유한 pid(process id)를 통해 구분, 관리된다.

프로세스들은 전부 다 pid를 통해 관리한다. pid는 모든 프로세스마다 유니크하다. Parent 프로세스가 Child 프로세스 만들 때, PCB를 복사한다. Child를 만들었다고 하면, 그 Child 프로세스에 pid를 새롭게 부여하면서 Parent 프로세스의 PCB를 그대로 복사해준다는 뜻이다.

 

Resource sharing option(Full/Partial/No sharing)

중요한건, 공유받는다는 말은 Parent 프로세스가 점유하고 있던 리소스를 어떻게 공유받을지를 정한다는 뜻이다. 즉, Parent 프로세스가 가지고 있는 리소스를 공유해주면서 PCB를 복사해주는 것이다. 그래서 부모 프로세스가 갖고 있던 리소스 중에 일부 또는 특정 몇몇가지 것들을 쓸 수 있게 공유 받는다. 그 옵션에는 Full, Parial, 노쉐어링 등이 있다.

 

Execution option(Overlay/Swapping)

지금 실행하고 있는 명령 중에 같이 쓸 수 있는게 있고, 없는게 있다. 같이 쓸 수 있으면 Overlay라고 하고, 같이 못쓰면 Swapping이라고한다. Swapping은 서로 바꿔가면서 사용하는 것이다. 

 

Address space option(Fixed/Variable)

Address space oprion은 정보 공유할 때 주소값을 어떻게 쓸건지를 정하는 옵션이다.

 

이러한 특성으로 인해, 내부적으로는 트리 구조로 만들어진다. 부모 프로세스가 자식 프로세스를 생성할 때, 노드를 insert해가지고, PCB를 복사한 노드를 하나 만들어서 거기에 권한은 부여해주는 식으로 내부적으로 관리한다.

 

 

3. 프로세스 제거(termination)

exit system call을 통해 process를 삭제할 수 있다.

프로세스를 만들면, new라는 상태가 들어가있는 PCB가 하나 만들어지고, 그 pid가 할당이 된다. 그래서 그 프로세스가 필요에 따라서 running도 됐다가 waiting도 됐다가 한다. 그리고 다 끝나면, exit system call을 불러서 termination된다.

 

예를들어 카카오톡 하다가 그만하려고, command + Q(mac기준)를 누르면, 사용자가 키보드로 인터럽트를 거는 건데, 그러면 유저모드에서 exit system call이 간다. 이렇게 할당되어있는 pid를 종료시키라는 call이 가면, 커널모드에서 실행되고 있는 프로세스가  terminated 상태가 되면서, 메인 메모리에서 사라진다.

 

present process는 wait system call을 통해 child가 정상적으로 제거되었는지 확인한다.

그리고 그 외에 시스템 콜이 제대로 일어나는지 확인하기 위해, 지금 child가 있는지 없는지 체크한다. exit system call이 제대로 되면, child가 내 부모 프로세스 밑에 없어야한다. 그래서 진짜 있는지, 없는지 확인을 한다. wait라는 시스템 콜을 부르면, 확인할 수 있다.

 

이 때 제대로 process가 제거되지 않으면 Zombie/Orphan 상태의 process가 만들어진다.

근데 가끔 가다가, 프로그램 내부에 오류가 있거나 이상한 특별한 자극들(메모리가 뜨겁거나, 여러가지 프로그램이 동시에 돌면서 CPU가 오작동하는 등)로 인해 로직이 꼬이거나 등등에 의해서 Zombie Process(좀비 프로세스)라는 게 생긴다. 좀비 프로세스는 parent에서 child가 죽은걸 모르고 process table에 child에 대한 정보가 남아있는 경우이다. 자식 프로세스가 terminated 된 걸 모르고, 있는다고 착각하고 있는 상태를 뜻한다. 실제 시스템에서 엑티비티 모드를 키면, child가 있다고 나온다. 근데, 실제로는 child가 terminated된 상태이다. 그래서 child가 메모리 리소스를 쓰고 있게 된다. 

 

두번째는 Orphan Proces(고아 프로세스)이다. child가 terminated되기 전에 부모 프로세스가 날라가버린 경우이다. 트리구조를 생각하면, 부모가 사라지면, child를 찾을 수 없다. 즉, OS가 못찾는데 메모리에 존재하는 경우이다. 이 경우는 컴퓨터를 끄기 전까지 관리가 안된다.

 

이 둘다 terminated가 제대로 안된 상태라서, 둘 다 리소스 낭비가 발생된다. OS가 추적을 못한다. 이러한 경우가 발생하는 이유는 프로그램을 잘못짠 경우(terminated 하는 코드까지 자놨어야했는데, 그게 없는 경우)도 있고, 또는 코드를 잘 못짜서 child가 종료된 다음 부모가 종료되어야하는데, 부모만 먼저 날려버리는 경우도 있다. 이러한 경우는 없애는 방법은 컴퓨터를 껐다 키는 방법밖에 없다. 물론, 현대 OS는 여러가지를 방법을 쓰긴한다.

 

그래서 프로세스의 제거(termination)가 굉장히 중요하다. 정상 종료라는 개념이 굉장히 중요하다.

 

4. 프로세스 스케줄링(Process Scheduling)

프로세스들을 생성하든, 제거하든 이런걸 하려면, 제일 중요한건 누가 언제 어떻게 일할지 선택해야하는데, 그런걸 프로세스 스케줄링이라고 한다. OS가 골라서 CPU한테 주고, CPU 내부에서 어떤 프로세스를 다음에 실행할지 선택하는 기능이다. Ready queue로 관리를 한다.

 

예를들어, 카카오톡 하나에도 굉장히 많은 프로세스가 있다. 이러한 프로세스들을 동시에 빠르게 처리하기 위해서 필요한게 프로세스 스케줄링이다. OS에서 제일 중요한 개념이므로, 다음 파트에서 다시 다뤄보겠다.

 

댓글