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 함수
- 다른 프로세스를 종료시킴. 이때 다른 프로세스는 주로 자식 프로세스임
- 자식 프로세스가 할당된 리소스보다 많은 리소스를 사용했거나 더 이상 그 자식 프로세스가 필요가 없으면 종료시킴
- 부모 프로세스가 종료되면 자식도 연쇄적으로 종료되기도 하고 고아프로세스가 되기도 함