Process (프로세스)

프로세스

Posted by Seohyun Park, Aileen on January 18, 2024 · 8 mins read
OS, PROCESS

프로세스 (Process)

1
프로세스는 실행 중인 프로그램이다.

그렇다면, 프로그램은 무엇일까?

1
2
3
4
5
6
7
8
9
10
11
프로그램은 디스크에 저장되어 있고, 프로세스는 메모리에 올라와 실행 중인 프로그램이다.

컴퓨터는 이러한 프로그램을 메모리에 Load 하고, 이를 CPU 에서 처리한다.

모든 프로세스는 실행을 위해서, CPU 를 필요로 하지만, CPU 자원은 한정되어 있다.

그렇기 때문에, CPU 는 여러 프로세스를 번갈아가며 실행한다.

프로세스들은 차례로 돌아가며, 한정된 시간만큼만 CPU 를 사용하고, 시간이 끝났음을 알리는 인터럽트가 발생하면, 다음 프로세스가 실행된다.

운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU 를 비롯한 자원을 배분한다. 이를 위해, 운영체제는 프로세스 제어 블록 (Process Control Block, PCB) 를 사용한다.

프로세스 제어 블록 (Process Control Block, PCB)

1
2
3
4
5
프로세스 제어 블록은, 프로세스와 관련된 정보를 저장하는 운영체제의 자료구조이다.

프로세스 제어 블록에는, 해당 프로세스를 식별하기 위해 꼭 필요한 정보들이 저장된다.

PCB 는 커널 영역에 생성되며, 프로세스가 생성될 때, 생성되며, 프로세스가 종료되면, 제거된다.

PCB 에 저장되는 정보는 다음과 같다.

- 프로세스 식별자 (Process ID, PID)

특정 프로세스를 식별하기 위해 부여하는 고유 번호이다. 같은 일을 수행하는 프로그램이더라도, 두 번 실행하면, PID 가 다른 두 개의 프로세스가 생성된다. 개발하면서, 이 PID 를 자주 마주했었는데, 이 PID 를 이용해서, 프로세스를 종료시키거나, 프로세스의 상태를 확인했다. (ex. kill -9 PID)

- 프로세스 상태 (Process State)

1
2
3
프로세스의 현재 상태를 나타낸다.
프로세스는 생성되어서, 실행되고, 종료된다.
프로세스의 상태는, 생성 (New), 준비 (Ready), 실행 (Running), 대기 (Waiting), 종료 (Terminated) 다섯 가지가 있다.

- 프로그램 카운터 (Program Counter, PC)

1
2
3
프로세스가 다음에 실행할 명령어의 주소를 가리킨다.
프로세스가 실행되면, PC 는 해당 프로세스가 실행되는 동안, 다음에 실행할 명령어의 주소를 가리킨다.
프로세스가 실행되다가, 인터럽트가 발생하면, PC 는 해당 프로세스가 다시 실행될 때, 다음에 실행할 명령어의 주소를 가리킨다.

- CPU 레지스터 (CPU Register)

1
2
프로세스는 자신의 실행 차례가 돌아오면, 이전까지 사용했던 레지스터의 중간값들을 모두 복원한다.
그래야지, 이전까지 진행했던 작업들을 그대로 이어 실행할 수 있기 때문이다.

- CPU 스케줄링 정보 (CPU Scheduling Information)

1
프로세스가 언제, 어떠한 순서로 CPU 를 할당받을지에 대한 정보를 나타낸다.

- 메모리 관리 정보 (Memory Management Information)

프로세스마다 메모리에 저장된 위치가 다르기 때문에, PCB 에는 프로세스가 메모리를 어떻게 사용하는지에 대한 정보가 있어야 한다. (ex. 메모리 주소, 메모리 크기 등)

- 입출력 상태 정보 (I/O Status Information)

1
프로세스가 사용하는 입출력 장치의 현재 상태를 나타낸다. (ex. 어떤 입출력 장치를 사용하는지, 입출력 장치의 상태는 어떠한지 등)

프로세스 API

운영체제가 반드시 API 로 제공해야하는 몇 몇 프로세스 관련 기본 기능들이 있다.

  • 프로세스 생성 (Process Create) 운영체제는 새로운 프로세스를 생성할 수 있는 방법을 제공해야 한다. 쉘에 명령어를 입력하거나, 응용 프로그램의 아이콘을 더블-클릭하여 프로그램을 실행시키면, 운영체제는 새로운 프로세스를 생성한다.

  • 프로세스 제거 (Process Destroy) 프로세스 생성 인터페이스를 제공하는 것처럼 운영체제는 프로세스를 강제로 제거할 수 있는 인터페이스를 제공해야 한다. 물론, 많은 프로세스는 실행되고 할 일을 다하면 스스로 종료한다. 그러나 프로세스가 스스로 종료하지 않으면 사용자는 그 프로세스를 제거하길 원할 것이고, 필요없는 프로세스를 중단시키는 API는 매우 유용하다.

  • 프로세스 대기 (Process Wait) 때론 어떤 프로세스의 실행 중지를 기다릴 필요가 있기 때문에, 여러 종류의 대기 인터페이스를 제공해야 한다. 예를 들어, 부모 프로세스는 자식 프로세스가 종료될 때까지 기다릴 수 있어야 한다.

  • 프로세스 각종 제어 (Miscellaneous Control) 프로세스의 제거, 대기 이외에, 여러 가지 제어 기능들이 제공된다. 예를 들어, 대부분의 운영체제는 프로세스를 일시정지하거나 재개 시킬 수 있는 인터페이스를 제공한다.

  • 프로세스 상태 (Process Status) 프로세스 상태 정보를 얻어내는 인터페이스를 제공해야 한다. 프로세스가 실행 중인지, 대기 중인지, 종료되었는지 등의 정보를 얻을 수 있어야 한다.


프로세스 상태 (Process State)

workspace-Page-7 drawio

- 생성 (New)

1
2
프로세스를 생성 중인 상태를 말한다.
이제 막 메모리에 적재되어, PCB 를 할당받은 상태를 말한다.

- 준비 (Ready)

1
2
3
4
프로세스가 CPU 를 사용하기 위해, 기다리고 있는 상태를 말한다.
당장이라도, CPU 를 할당받아 실행할 수 있지만, 아직 자신의 차례가 아니기에, 기다리고 있는 상태이다.

--> 준비 상태인 프로세스가 실행 상태로 전환되는 것을 ***디스패치(dispatch)*** 라고 한다.

- 실행 (Running)

1
2
3
프로세스가 CPU 를 사용해서, 실행 중인 상태를 말한다. 실행 상태인 프로세스는 할당된 일정 시간 동안만 CPU 를 사용할 수 있다.
이 때, 프로세스가 할당된 시간을 모두 사용한다면, 인터럽트가 발생하고, 프로세스는 다시 준비 상태로 전환된다.
실행 도중, 입출력 장치를 사용하여, 입출력 장치의 작업이 끝날 때 까지 기다려야 한다면, 대기 상태가 된다.

- 대기 (Waiting)

1
2
3
프로세스가 실행 도중, 입출력 장치를 사용하는 경우가 있는데, 이 때, 입출력 장치의 작업이 끝날 때 까지 기다려야 한다면, 대기 상태가 된다. 대기 상태인 프로세스는 입출력 장치의 작업이 끝나야, 다시 준비 상태로 전환된다.

대부분 입출력 작업 시, 대기 상태가 되지만, 입출력 작업이 아닌 경우에도, 대기 상태가 될 수 있다.입출력 장치 작업 시, 말고도, 프로세스가 어떤 이벤트를 기다리고 있는 경우에도, 대기 상태가 된다.

- 종료 (Terminated)

1
프로세스의 실행이 끝난 상태를 말한다. 프로세스가 실행을 마치고, 운영체제에 의해 종료된 상태를 말한다. 종료된 프로세스는, PCB 를 반환하고, 메모리에서 제거된다.

프로세스 계층 구조

1
2
3
4
5
6
7
8
9
프로세스는 실행 도중, 시스템 호출을 통해 다른 프로세스를 생성할 수 있다.

이렇게 생성된 프로세스는, 부모 프로세스 (Parent Process) 와 자식 프로세스 (Child Process) 로 구분된다.

부모 프로세스와 자식 프로세스는 엄연히 다른 프로세스이기에, 각기 다른 PID (Process ID) 를 가진다. 일부 운영체제에서는, 자식 프로세스의 PCB 에 부모 프로세스의 PID 인, PPID (Parent Process ID) 를 저장한다.

최초의 부모 프로세스가 자식 프로세스들을 생성하고, 이렇게 생성된 자식 프로세스들은 또 다른 자식 프로세스들을 생성할 수 있다. 이렇게 생성된 프로세스들은, 부모 프로세스와 자식 프로세스의 관계를 나타내는 트리 구조를 이룬다.

이러한 프로세스들의 트리 구조를 "프로세스 계층 구조 (Process Hierarchy)" 라고 한다.

프로세스 생성 기법 (Process Creation)

1
2
3
프로세스는 다른 프로세스를 생성할 수 있다. 이렇게 생성된 프로세스는, 부모 프로세스와 자식 프로세스의 관계를 가진다.

프로세스는 다른 프로세스를 생성할 때, fork() 와 exec() 라는 시스템 호출을 사용한다.

- fork()

1
부모 프로세스는 fork() 를 통해, 자신의 복사본을 자식 프로세스로 생성해낸다.

- exec()

1
fork() 로 만들어진 자식 프로세스는 exec() 를 통해, 자신의 메모리 공간을 다른 프로그램으로 교체한다.