운영체제

[Operating System] 프로세스의 제어 : 프로세스의 생성

짱일모 2023. 3. 20. 20:30

프로세스의 제어 : Creation

프로세스의 생성은 다음과 같은 절차를 따릅니다.

절차만 보고는 프로세스의 생성과정을 이해하기 쉽지 않으니 다음 예시들을 보며 이해해봅시다.

 

프로세스 생성 예시

먼저 위 그림과 같이 fork (자식 프로세스를 생성하는 명령) 하기 전에 부모 프로세스가 있다고 생각해봅시다. PCB 안에는 프로세스 컨텍스트가 가지고 있는 code, data, stack 블럭의 시작과 끝 주소를 pointing 하는 정보가 들어있습니다.

 

 

 

 

다음으로 부모 프로세스 (PCB Id = 11) 에서 fork() 를 통해 자식 프로세스 (PCB id = 12) 를 생성하였습니다. fork 이후 생성된 자식 프로세스 User Context 의 Code 블럭은 부모 프로세스 User Context 의 Code 블럭과 다를 이유가 없습니다. 따라서 자식 프로세스의 data, stack 부분만 부모 프로세스의 data , stack 블럭에서 복제하여 메인 메모리 상에 새로운 위치에 자리하게 됩니다.

 

 

 

 

하지만 여기서 메모리 사용 효율성을 개선하기 위해 이런 의문이 들 수 있습니다.

"fork 이후 부모 프로세스와 자식 프로세스가 아무 작업을 하지 않으면, 굳이 메모리에 똑같은 Context 를 두개 가질 필요가 없잖아?"

 

그래서 COW (COPY ON WRITE) 방식을 도입합니다.

 

COW 방식에 대한 설명

COW 방식은 fork 직후 자식 프로세스가 Main Memory 상의 부모 프로세스의 User Context 를 그대로 가리키고 있게합니다. 그리고 부모 프로세스와 자식 프로세스 둘 중 어떤 프로세스가 새로운 작업을 하게 되면, 그제서야 자식 프로세스만의 User Context 를 Main Memory 상에 복제하여 올리는 것입니다. (COPY ON WRITE)

 

 

 

이번에는 새로운 프로그램을 실행하는 경우를 알아보겠습니다.

exec 에 대한 설명

 

먼저 새 프로그램을 생성하기 위해서는 fork() 가 먼저 일어납니다. 그래서 부모 프로세스의 Context 를 복제한 자식 프로세스의 Context 도 생성됩니다. 이 때, 다른 프로그램을 실행시키기 위해서는 exec 명령을 통해 다른 프로그램의 실행파일의 user context 를 메인 메모리에 적재한 뒤 자식 프로세스의 PCB 의 메모리 포인터가 적재된 새 프로그램의 user context 를 가리키게 합니다.

 

 

프로세스를 생성할 때, 부모 프로세스에서 fork 한 뒤 자식 프로세스를 만들어 exec 으로 실행한다면 최초의 프로세스는 도대체 누가 만드는걸까요??

 

최초의 프로세스 생성 : Booting a computer

컴퓨터의 전원을 키는 순간 어떤 일이 벌어질까요?

 

먼저 컴퓨터 부팅 시, ROM (Read Only Memory) 에 있는 BIOS 를 자동으로 실행시킵니다. ROM BIOS는 컴퓨터의 기본 입력 및 출력 시스템으로, 컴퓨터의 전원이 켜질 때 자동으로 실행되며, 하드웨어를 초기화하고 부팅 디바이스를 선택하고, 부트로더를 실행하기 위한 초기 설정을 수행합니다.

 

그리고 하드 디스크의 부트로더를 메인 메모리에 적재하고 실행시킵니다. 부트로더는 하드 디스크 내에서 OS 를 찾아 커널로 적재시킵니다. 그리고 OS 는 최초의 프로세스인 idle process(혹은 swapper process) 를 생성합니다. 이 때 이 idle process 는 최초의 프로세스이므로 fork-exec 을 통해 생성하지 않습니다. 커널이 직접 이 idle process 를 생성하고 메인 메모리에 적재합니다.

 

다음 그림에 컴퓨터 부팅 시 일어나는 일에 대한 설명이 나타나있습니다.

 

다음 그림에 idle process(swapper process)에 대한 설명이 나타나있습니다.