본문 바로가기
교육, 학습/CS스터디_반효경 운영체제

운영체제 - fork시스템 콜, exec시스템 콜(자식, 부모 프로세스 관련), 프로세스의 생성과 종료

by 개발하는 경제학도 2022. 1. 8.

강의 소개

현재 수강하고 있는 KOCW 내 이화여자대학교 운영체제(2017, 반효경) 강의의 내용을 정리하였습니다.

개발자 관점에서 운영체제 기초를 학습하는 무료 강의로 자세한 강의 내용은 수강을 추천드립니다.


 

프로세스의 생성

부모 프로세스가 자식 프로세스를 생성한다. 

이 경우 복제 생성을 한다. 따라서 자식 프로세스는 부모 프로세스와 똑같은 나이를 가지게 된다.

** 참고로 모든 프로세스들은 부모 프로세스를 가진다.

 

fork() 시스템 콜

프로세스 자체가 프로세스를 생성할 수 없으니 운영체제에게 '시스템 콜'을 걸어 요청한다. 이 시스템 콜을 fork라 한다.

이때, 자식 프로세스는 부모 프로세스의 context를 그대로 복사해서 가져온다.

 

[왼쪽: 부모 프로세스, 오른쪽: 자식 프로세스]

출처: 운영체제(이화여자대학교, 2017년 1학기 반효경)

 

- pid

이때 부모 프로세스와 자식 프로세스는 pid로 구분한다. (fork의 return 값으로 pid가 반환된다)

부모 프로세스는 pid를 양수를 갖고( pid > 0 ), 자식 프로세스는 pid를 0을 갖게 된다.

이런 구분을 통해 서로 다른 작업을 수행할 수 있게 된다. (만약 구분이 없다면 부모, 자식 프로세스가 같은 작업을 수행하게 될 것이다)

사진에서는 왼쪽 부모 프로세스는 else if(pid>0) 부분의 구문이 실행될 것이고, 오른쪽 자식 프로세스는 if(pid == 0) 부분의 구분이 각각 실행될 것이다.

 

- 특징

fork() 시스템 콜을 통해 복제된 자식 프로세스는 메인 함수의 시작 부분부터 실행되는 것이 아니라, 부모 프로세스에서 fork()된 바로 다음 위치부터 실행하게 된다.

 

exec() 시스템 콜

하나의 프로세스를 완전히 새로운 프로세스로 덮어 씌워서 실행하는 것이다.

자식 프로세스는 보통 새로운 작업을 수행하기 위해 생성된다. 하지만 fork()만 수행하면 부모, 자식 프로세스가 동일한 작업만을 수행하거나 pid로 분기하여 실행하는 정도만 사용할 수 있기 때문에, 자식 프로세스에 독자적인 프로그램 수행이 가능하도록 exec() 시스템 콜로 새로운 프로세스로 덮어 씌우는 것이다.

 

[왼쪽: 부모 프로세스, 오른쪽: 자식 프로세스]

출처: 운영체제(이화여자대학교, 2017년 1학기 반효경)

여기서 우측 자식 프로세스는 exec() 시스템 콜에 해당하는 execlp 라인에 이르면 새로운 프로그램으로 덮어진다.

 

fork()와 exec() 시스템 콜

부모가 메인 함수를 끝까지 실행하고, 자식에게 다른 프로그램을 수행시키고 싶을 때, 

fork를 한 뒤 exec으로 자식에게 새로운 작업을 시키게 된다.

 

주소 공간(Address space)

프로세스는 생성되면, 그 프로세스만의 독자적인 주소 공간이 생긴다.

아래와 같은 순서로 복사를 한다.

 

1) 자식은 부모의 공간을 복사한다.

fork() 하게 되면 code, data, stack 모두 복사하게 된다.

data를 복사한다는 것은 전역 변수도 복사한다는 것이고, stack이 복사된다는 것은 부모의 프로그램 카운터를 복사해서 부모가 실행한 위치부터 자식 프로세스가 수행할 수 있는 것이다.

2) 자식은 그 공간에 새로운 프로그램을 올린다.

1번과 같은 복사만 진행하면 세상의 모든 프로세스는 같은 작업을 수행하게 될 것이다.

일단은 부모 프로세스를 복제해둔 뒤(= fork(): 복제 생성 ), 수행하고 싶은 프로그램을 위에 덮어 씌워서(= exec() 시스템 콜: 새로운 프로그램으로 덮어 씌워 메모리에 올리는 것이다) 새로운 프로그램을 수행하는 것이다. 

 

프로세스의 트리(계층 구조)

프로세스의 트리(계층 구조)를 형성한다. 맨 위에 최초의 프로세스가 있고 그 아래에 자식 프로세스들이 있다.

 

프로세스는 자원을 필요로 한다

필요한 자원을 받는 경우는 2가지가 있다.

1) 운영체제로부터 받는다. 

2) 부모와 공유한다.

(프로세스 간의 자원 공유. 사실은 부모, 자식은 별개의 프로세스이기 때문에 자원을 공유하는 것이 아니라, 자원을 가지고 경쟁하는 것이다.)

 

자원의 공유

1) 부모와 자식이 모든 자원을 공유하는 모델

2) 일부를 공유하는 모델

3) 전혀 공유하지 않는 모델

 

수행(Exectution)

원칙은 자식을 생성하면, 부모와 자식이 별개로 돌아가는 것이다.

그러나 자식이 종료(terminate)될 때까지 부모가 기다리는(wait) 모델도 있다.

 


 

프로세스 종료(Process Termination)

종류는 아래와 같다

1) 자식 프로세스가 자발적으로 종료하는 경우(exit 시스템 콜)

자식 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려준다.

자식이 부모에게 output data를 보내고(wait 하여) ** 프로세스에서는 자식이 먼저 죽는다. 따라서 자식이 죽을 때는 부모에게 알리게 된다.

프로세스의 각종 자원들이 운영체제에게 반납된다.

 

2) 부모 프로세스가 자식의 수행을 종료시키는 경우(abort)

아래와 같은 3가지의 경우 부모 프로세스가 자식 프로세스를 종료시킨다.

- 자식 프로세스가 할당 자원의 한계치를 넘는 경우

- 자식에게 할당된 task가 더 이상 필요하지 않은 경우

- 부모가 종료(exit)하는 경우

운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되지 않도록 한다.

단계적인 종료를 수행을 통해 특정 프로세스가 종료되면 그 아래 자손 프로세스들을 모두 종료시킨다

(트리 계층구조에서 가장 하단의 자식 프로세스를 죽이고 그 위의 부모에게 통보 -> 그 부모 프로세스를 죽이고 그 위의 부모에게 통보를 반복한다)

 

 

출처: 운영체제와 정보기술의 원리(반효경 )

댓글