관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

프로세스와 스레드 2 - 프로세스 상태와 계층 구조 본문

알고리즘 및 자료 관리/컴퓨터 구조 & 운영체제

프로세스와 스레드 2 - 프로세스 상태와 계층 구조

huenuri 2024. 10. 17. 20:35

이어서 프로세스 상태에 대한 학습을 시작해 본다. 오후에 충분히 쉬었으니 오늘 저녁부터 내일 새벽까지 열심히 달려볼 생각이다. 여기까지만 공부하고 저녁을 먹을 생각이다.

프로세스들은 각자의 상태를 가지고 계층적인 구조를 이루고 있다. 프로세스 상태란 무엇인지, 프로세스 계층 구조란 무엇인지 알아보고 코드를 통해 확인해 볼 것이다.

 

 

 

프로세스는 모두 저마다의 상태가 있다. 운영체제는 이런 프로세스의 상태를 PCB에 기록하여 관리한다. 많은 운영체제는 이처럼 동시에 실행되는 수많은 프로세스를 계층적으로 관리한다. 이번 절에서는 프로세스들의 상태와 계층적 관리에 대해 자세히 알아보겠다.


 

 

 

프로세스 상태

컴퓨터를 사용할 때 여러 프로세스들이 빠르게 번갈아 가면서 실행된다. 그 과정에서 하나의 프로세스는 여러 상태를 거치며 생행된다. 그리고 운영체제는 프로세스의 상태를 PCB를 통해 인식하고 관리한다. 프로세스의 상태를 표현하는 방식은 운영체제마다 조금씩 차이가 있지만, 프로세스가 가질 수 있는 대표적인 상태는 아래와 같다.

 

 

 

생성 상태를 거쳐 실행할 준비가 완료된 프로세스는 곧바로 실행되지 않고 준비 상태가 되어 CPU의 할당을 기다린다.

 

 

 

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

 

 

실행 상태인 프로세스는 할당된 일정 시간 동안만 CPU를 사용할 수 있다. 

 

 

입출력 작업을 요청한 프로세스는 입출력장치가 입출력을 끝날 때까지(입출력 완료 인터럽트를 받을 때까지) 기다려야 한다. 입출력 작업이 완료되면 해당 프로세스는 다시 준비 상태로 CPU 할당을 기다린다.

 

 

 

 

 

위와 같은 도표를 프로세스 상태 다이어그램이라고 한다. 이처럼 컴퓨터 내의 여러 프로세스는 생성, 준비, 실행, 대기, 종료 상태를 거치며 실행된다. 운영체제는 이 상태를 PCB에 기록하며 프로세스들을 관리한다.

 

대기 상태의 일반적인 정의

프로세스가 대기 상태가 되는 이유에 입출력 작업만 있는 것은 아니다. 조금 더 일반적으로 표현하자면 특정 이벤트가 일어나길 기다릴 때 프로세스는 대기 상태가 된다. 다만 프로세스가 대기 상태가 되는 대부분의 원인이 입출력 작업이기 때문에 '프로세스가 입출력 작업을 하면 대기 상태가 된다'라고 생각해도 된다.


 

 

 

 

프로세스 계층 구조

 

 

컴퓨터가 부팅될 때 실행되는 최초의 프로세스가 자식 프로세스들을 생성하고, 생성된 자식 프로세스들이 새로운 프로세스들을 낳는 형식으로 여러 프로세스가 동시에 실행되는 것이다. 

 

이 과정을 도표로 그리면 위와 같은 트리 구조를 띄는데, 이를 프로세스 계층 구조라고 한다.

 

 

예를 들어 사용자가 컴퓨터를 켜고 로그인 창을 통해 성공적으로 로그인해서 bash 셸(사용자 인터페이스)로 Vim이라는 문서 편집기 프로그램을 실행했다고 가정해보자.

이 경우 ① 사용자가 컴퓨터를 켠 순간에 생성된 최초 프로세스는 로그인을 담당하는 프로세스를 자식 프로세스로 생성한 것이고, ② 로그인 프로세스는 사용자 인터페이스(bash 셸) 프로세스를 자식 프로세스로 생성한 것이고, ③ 사용자 인터페이스 프로세스는 Vim 프로세스를 생성한 셈이다.

데몬이나 서비스 또한 최초 프로세스의 자식 프로세스이다.

 

 

 

최초의 프로세스

프로세스의 가장 위에 있는 최초의 프로세스는 무엇일까? 최초의 프로세스는 유닉스 운영체제에서는 init, 리눅스 운영체제에서는 systemd, macOS에서는 launched라고 한다. 최초의 프로세스 PID는 항상 1번이며, 모든 프로세스 최상단에 있는 부모 프로세스이다.

pstree 명령어는 프로세스 계층 구조를 보여주는 명령어이다. 리눅스에서 pstree 명령어를 입력하면 systemd가 최상단에 있다는 것을 확인할 수 있고, macOS에서 pstree 명령어를 입력하면 launched가 최상단에 있는 것을 확인할 수 있다.


 

 

 

 

프로세스 생성 기법

이 내용은 윈도우 운영체제와는 관련이 없으나 수많은 운영체제의 핵심 개념이니 꼭 알아두는 것이 좋다.

 

 

부모 프로세스를 통해 생성된 자식 프로세스들은 복제와 옷 갈아입기를 통해 실행된다.

fork와 exec는 시스템 호출이다.

 

자식 프로세스는 부모 프로세스의 복사본이기 때문에 부모 프로세스의 자원들, 이를테면 메모리 내의 내용, 열린 파일의 목록 등이 자식 프로세스에 상속된다. 복사된 자식 프로세스라 할지라도 PID 값이나 저장된 메모리 위치는 다르다.

fork를 통해 복사본이 만들어진 뒤에 자식 프로세스는 exec 시스템 호출을 통해 새로운 프로그램으로 전환된다. 

 

 

 

 

예를 들어, 사용자가 bash 셸에서 ls라는 명령어를 쳤다고 가정해 보자. 셸 프로세스는 fork를 통해 자신과 동일한 프로세스를 생성하고, 그로부터 탄생한 자식 프로세스(셸의 복제 프로세스)는 exec를 통해 ls 명령어를 실행하기 위한 프로세스로 전환되어 실행된다. 그렇게 셸의 복사본으로 탄생한 자식 프로세스는 ls 명령어를 실행하기 위한 프로세스로 바뀌고, 메모리 공간에는 ls 명령어를 실행하기 위한 내용들이 채워진다.

 

정리하면, 부모가 자식 프로세스를 실행하여 프로세스 계층 구조를 이루는 과정은 fork와 exec가 반복되는 과정이라 볼 수 있다. 쉽게 말해 부모 프로세스로부터 자식 프로세스가 복사되고, 자식 프로세스는 새로운 프로그램으로 옷을 갈아입고, 또 그 자식 프로세스로부터 자식 프로세스가 복사되고, 옷을 갈아입는 방식으로 여러 프로세스가 계층적으로 실행된다.

 

부모 프로세스가 자식 프로세스를 fork한 뒤에 부모 프로세스, 자식 프로세스 누구도 exec를 호출하지 않는 경우도 있다. 이 경우 부모 프로세스와 자식 프로세스는 같은 코드를 병행하여 실행하는 프로세스가 된다.


 

 

 

 

단원 마무리하기

 

 

 

 

fork 시스템 호출과 폴더 생성은 관련이 없다. 4번에서 준비 상태는 CPU를 할당받기 기다리는 있는 상태가 맞다. 준비 상태 프로세스가 차례가 되면 CPU를 할당받아 실행 상태가 된다.

 


 

 

 

학습을 마치고

이렇게 프로세스 상태에 대한 학습을 진행했다. 이 단원은 좀 더 재미있기도 하고 알아가는 즐거움이 있었다. 프로세스를 다루는 예제를 깃허브에서 제공하고 있는데 아직 이 부분까지 실습하기에는 이해력이 부족한 것 같아 다음에 실습을 진행해보려고 한다.

파이썬과 C/C++ 프로그래밍 언어로 실습하는 부분이 있는데, 파이썬 프로그래밍 실습은 강의 영상이 있어 이 내용은 시청해보려고 한다. 실습은 나중에 하더라도.