본문 바로가기

CS/오퍼레이팅 시스템

13. 프로세스 시스템콜

부모 프로세스는 프로세스 트리형태를 만들면서 자식 프로세스를 만듦

솔라리스 프로세스

아래 프로세스들의 부모가 프로세스가 되는 sched 프로세스는 pid가 0이 됨

 

* 프로세스 생성시 발생 이슈

- 부모프로세스와 자식프로세스는 리소스를 일부만 공유함

- 두 프로세스는 병렬적으로 수행되기도 하고 

  부모 프로세스가 wait 시스템콜로 자식 프로세스의 종료를 기다리기도 함

- 자식 프로세스는 부모프로세스와 별개의 프로세스이므로 주소 공간이 같으면 안됨 - 복제 후 overwrite

 

* 유닉스 리눅스에서 fork system call

- fork 함수는 프로세스를 생성하는 시스템콜임

- 리소스 공유

  cpu 메모리 리소스는 별도의 프로세스에 별도로 할당되어야 함

  부모 프로세스가 오픈한 파일은 자식프로세스와 공유됨

- 부모프로세스와 자식프로세스는 스케줄러가 별도로 스케줄링하여 실행하는 개체임

- 자식프로세스가 생성되면서 부모프로세스의 주소공간을 그대로 복제해서 그 당시 부모프로세는 같은 주소 공간을 가짐

 (스택, 로컬변수, 힙, 프로그램도 모두 같음)

- call once, return twice

 부모 프로세스가 fork를 호출하면 주소 공간이 복제되어 프로그램이 자식에게 동일하게 할당하는데

 부모 프로세스와 자식 프로세스는 별도의 프로세스이기 때문에 둘을 구분할 수 있어야 한다. 

 둘을 구분하기 위해서 return 값을 사용함

 부모 프로세스에는 자식의 pid를, 자식 프로세스에게는 0 을 반환하게 함

 

* 주소 공간을 복제한다는 개념

1) 프로세스 진행 전에 스택과 힙이 계속 변화하면서 프로세스 수행 중임

2) 수행 중 fork 함수를 호출하면 동일한 주소 공간을 복제

3) 자식 프로세스가 동일한 주소공간을 갖게 됨 = 동일한 프로그램을 병렬적으로 수행 중

4) 다른 프로그램을 자식 프로그램에게 로드하여 새로운 프로그램을 수행하게 함

 

* 새로운 프로그램 overwrite하는 exec함수

- exec함수는 자식 프로세스 주소 공간에 다른 프로그램을 overwrite하는 함수

- 자식 프로세스가 호출 - 자기한테 새로운 프로그램을 로드하라는 말

- 자식 프로세스에 새로은 프로그램이 overwrite되면 힙과 스택영역이 초기화 되고 

  프로그램 카운터가 처음부터 line by line으로 수행함

- 자식 프로세스는 다른 프로그램을 수행하고

  그 와중에 부모 프로세스는 병렬적으로 다른 프로그램 수행하기도 하고, 자식프로세스의 termination을 기다리기도 함

 

* wait함수

- 자식 프로세스의 termination을 기다리는 함수

- 자식 프로세스가 종료됐지만 부모 프로세스에 의해 거둬지지 않은 프로세스

  즉 부모가 wait 함수를 호출하지 않은 상태에서 자식 프로세스가 termination하면 좀비 프로세스가 됨

- 이 함수를 호출했을 때 termination될 때까지 계속 같은 line에 머물고 상태는 waiting임

- 자식 프로세스가 종료되면 state가 ready로 바뀜 -> cpu에 dispatch가 되면 다시 다음 줄 수행

 

* exit 함수

- 프로세스가 자발적으로 자기 프로세스를 종료

- 부모 프로세스는 wait의 인자로 자식 프로세스 종료시 넘겨진 메세지를 확인할 수 있음

- 더 이상 그 프로세스는 수행 안되고 OS는 할당했던 리소스를 회수함

 

* abort 함수

- 다른 프로세스를 종료시킴. 이때 다른 프로세스는 주로 자식 프로세스임

- 자식 프로세스가 할당된 리소스보다 많은 리소스를 사용했거나 더 이상 그 자식 프로세스가 필요가 없으면 종료시킴

- 부모 프로세스가 종료되면 자식도 연쇄적으로 종료되기도 하고 고아프로세스가 되기도 함