본문 바로가기

CS/운영체제

[ 운영체제 ] 프로세스는 누가 생성하고, 어떻게 생성될까?

반응형
프로세스는 누가, 어떻게 만드는 걸까?

 

우리는 프로세스에 대해 공부하면서 위와 같은 질문을 아직 하지 않았다. 딱히 의심도 하지 않았던 것 같다. 교수님께서 위와 같은 질문을 했을 때 '헐..그러네' 라는 생각을 했었던 기억이 난다. 그러면 바로 본론으로 들어가자. 프로세스는 과연 누가 만드는 것일까?

1. Who?

정답부터 말하자면 프로세스는 부모 프로세스로부터 생성된다. 따라서 모든 프로세스는 부모 프로세스를 가진다. 부모와 자식 관계이기 때문에 OS는 프로세스를 트리 자료구조로 관리한다. 모든 프로세스는 PID라는 고유 식별자를 가진다. PID는 PCB에 저장되어 있다. 

 

OS는 프로세스를 트리 자료구조로 관리한다

 

그렇다면 태초의 프로세스, 그러니깐 모든 프로세스의 조상 프로세스는 어떻게 생성될까? 태초의 프로세스는 OS 입장에서 매우 중요하기 때문에 특별히 init process라고 부른다. Init process는 컴퓨터 부팅시 마지막 단계에서 생성되고  PID는 1번이다. 이제 프로세스를 누가 만드는지에 대한 질문은 해결됐다. 이제 프로세스를 어떻게 만드는지 알아보자.

 

2. How?

프로세스의 생성 과정은 크게 fork()와 exec()로 설명할 수 있다.

[1] fork()

fork()는 시스템 콜로 프로세스를 생성하는 명령어다. 엄밀하게 말해서 fork()는 부모 프로세스의 메모리 공간을 그대로 복사해서 자식 프로세스에게 할당하는 명령이다. 즉, '메모리 할당' 과정으로 이해하면 된다. fork()가 실행되는 순간 fork()의 리턴값만 제외하고 메모리에 그대로 복사후 같이 실행된다. 그림으로 보면 아래와 같다. 

그런데 여기서 끝내면 문제가 있다. 자식 프로세스가 생성되기는 했는데 부모 프로세스의 내용을 그대로 복사 붙여넣기 했기 때문에 부모 프로세스와 똑같은 프로그램이 한 개 더 실행되는 것과 다름없기 때문이다. 자식 프로세스는 할당 받은 메모리 공간을 새로운 프로그램으로 새롭게 대치 시켜줘야 한다. 이런 기능을 하는 명령어가 exec() 이다. 

[2] exec()

exec()는 시스템 콜로 메모리를 초기화 하는 명령어다. 좀 더 자세하게 말하면 자식 프로세스가 부모 프로세스로부터 할당받은 메모리 공간에 새로운 프로그램을 로드해서 메모리를 초기화한 뒤, 그 프로그램에 대한 프로세스를 시작하는 명령어다.

 

 

 

 

잠시만, 부모 프로세스가 먼저 끝나면 자식 프로세스는 어떻게 되는거지?

 

모든 프로세스는 부모 프로세스를 가진다고 했다. 그렇다면 위와 같은 질문을 할 수 있다. 이론상으로는 부모 프로세스가 자식 프로세스보다 먼저 끝나면 자식 프로세스는 수행중이라도 종료된다. main 함수가 return 된 상황과 같다. 이러한 상황을 방지하기 위해 wait()라는 시스템 콜이 있다.

 

💡 wait() : 자식 프로세스가 종료될때까지 부모 프로세스가 대기하도록 하는 명령어

 

여기까지 종합해봤을 때 프로세스의 수행 구조는 아래와 같다. 

 

반응형