티스토리 뷰

📌 프로세스의 연산

 

실행되는 동안 프로세스들은 여러개의 프로세스들을 생성한다. 

이 때 생성하는 주체는 부모 프로세스, 새로운 프로세스는 자식 프로세스이다. 

 

대부분의 운영체제는 고유의 프로세스 식별자 (pid)를 사용하여 프로세스를 구분한다. 

 

프로세스가 자식 프로세스를 생성할 때 

- 자식 프로세스는 운영체제에게 자원을 직접 얻을 수 있다.

- 혹은 부모 프로세스가 가진 자원의 부분 집합만을 사용하도록 제한 -> 자바의 상속같은..!

 

프로세스가 새로운 프로세스를 생성할 때

- 부모 프로세스는 자식 프로세스와 동시에 실행.

- 혹은 부모 프로세스는 자식 프로세스 전부/일부가 종료될 때까지 대기 

 

 

📝 프로세스의 생성 흐름 

 

 

 

 

 

1) fork() 시스템 콜로 새로운 프로세스(자식) 생성. (프로세스 혼자만으론 자식 프로세스 생성이 불가하므로 시스템콜로 OS에게 요청)

자식은 부모의 프로세스 복붙. 그래서 자식 프로세스의 시작점은 부모와 같음. 이 때 자식의 pid는 0이됨. 

 

2) 두 프로세스 중 한 프로세스가 exec() 시스템 콜을 사용. 자신의 메모리 공간을 새로운 프로그램으로 교체.

부모는 exec()를 통해 부모 PCB를 자식으로 교체하여 실행시킴. 

 

3) exec() 시스템 콜을 바이너리 파일을 메모리로 적재. 프로그램 실행 시작. -> 비로소 프로세스가 됨. 

부모는 wait

 

4) 자식 프로세스가 종료될 때 부모 프로세스는 exit() 하여 자원 반납. 

 

 

즉 fork() 로 자식 프로세스 생성하고, 그 자식의 pid는 0이 됨. 

exec()를 통해 자식이 실행됨, 그동안 부모는 웨이팅.

자식 끝나면 부모도 나머지 실행할거 하다가 exit()

 

 

📝 프로세스의 종료

 

최종 실행이 종료된 뒤 exit() 를 통해 운영체제에 삭제를 요청함.

- 대기중인 부모 프로세스에게 상태 값을 리턴. 

- 운영체제에 의해 모든 프로세스의 자원들은 할당 해제

 

부모 프로세스가 자식 프로세스를 종료시키는 경우 (abort())

- 자식이 할당된 자원의 사용량을 초과하는 경우

- 자식 task가 더 이상 필요하지 않은 경우

- 부모가 종료되었고, 자식이 종료되지 않았을 때 자식만 실행될 순 없음. 

 

좀비 프로세스 (zombi process) 

- 종료 처리 중 멈춰있는 상태의 프로세스: 완전히 종료된 것이 아니지만 실행중도 아닌 프로세스

- 종료되었지만, 부모 프로세스가 아직 wait() 콜 하지 않는 프로세스

- 부모가 wait() 콜하면 좀비 프로세스의 pid와 프로세스 테이블 항목이 운영체제에게 반환.

- 그래서 되게 짧은 시간동안 좀비 프로세스가 되다가 반환됨. 

 

고아 프로세스 (orphan process)

- 부모 프로세스가 wait() 콜하는 대신 종료하게 되면 자식은 고아 프로세스가 됨.

- Linux, UNIX 계열은 고아 프로세스의 새로운 부모 프로세스로 init 프로세스를 지정하여 문제를 해결함.