⛳ 운영체제에서 active하게 될 때의 작업의 단위인 프로세스, 관리는 어떻게 해야 하는 걸까?
운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스
여기서는
fork(), exec(), wait()와 같이 프로세스 생성과 제어를 위한 함수를 알아보겠습니다.
새로운 프로세스 생성 시 사용하는 함수
fork()로 생성된 프로세스 : child, 자식 프로세스
fork()를 실행한 프로세스 : parent, 부모 프로세스
child는 parent과 거의 동일한 복사본을 가진다. pid를 제외하고 부모프로세스의 영역 PCB를 포함한 대부분(변수, 스택, 힙)을 공유함.
자식 프로세스가 또 다시 fork()를 하면 손자 프로세스가 생성됨.
부모 프로세스에서 wait()함수가 불려지면 자식 프로세스가 끝날 때까지 기다린 후에 진행
✨ 장점
✔️ fork가 사용되는 목적
프로세스는 그대로 둔 채 내용만 변경하는 기능
✔️ exec를 사용하는 목적
기존방법 | exec 사용 |
---|---|
* 새로운 프로세스를 만들기 위해서는 PCB가 필요, 메모리 자리 확보프로세스 종료 후에는 사용한 메모리를 청소하기 위해 상위 프로세스와 부모-자식 관계를 생성해야 함 | 이미 만들어진 PCB, 메모리, 부모-자식 관계 재활용할 수 있음, 기존 코드 영역에 있는 것을 지우고 새로운 코드 영역만 가져오면 됨. 또한 데이터 영역이 새로운 변수로 채워지고, 스택 영역이 리셋됨, 그 외에 프로그램 카운터 레지스터 값 & 각종 레지스터 & 사용한 파일 정보 리셋 |
자식 프로세스가 동작 중이면 호출 차단이 차단되기 때문에 상태를 얻어올 때까지 대기
wait() 함수 호출자(=부모프로세스)가 시그널을 받을 때까지 대기
자식 프로세스가 종료된 상태라면 즉시 호출이 반환되어 상태를 얻음, 이 때 wait() 함수는 자식 프로세스의 프로세스 ID를 반환
자식 프로세스가 없다면(비정상) 호출이 즉시 반환되며, 에러값을 반환
1) 부모가 자식 프로세스보다 먼저 종료되면? -> 고아 프로세스
- 이때 init 프로세스(부팅 과정 중 생성되는 최초의 프로세스)가 새로운 부모로 되며 고아 프로세스를 종료시키기 위해 wait 함수를 대신 호출
2) 자식 프로세스가 종료되었는데도 부모가 종료 상태를 보고받지 못하면 ? -> 좀비 프로세스
- 인자값(종료상태)를 부모에게 전달되기 위해서는 부모 프로세스가 운영체제게 함수호출로 요청해야 함 (방법 : wait()함수를 사용하면 자식 프로세스가 전달한 값을 부모 함수가 거둬감)
- 부모 프로세스가 요청하지 않으면 자식 프로세스가 좀비 프로세스가 됨