코학다식
[OS] 프로세스 생성과 종료 본문
Operating System
chapter 3, Processes (2)
프로세스 생성
- 부모 프로세스는 자식 프로세스를 생성하는데, 이는 프로세스들의 트리를 구성하게 된다.
- 프로세스는 프로세스 식별자(pid)를 통해 식별되고 관리된다.
- Resource sharing option
- 부모와 자식은 모든 자원을 공유한다.
- 자식은 부모의 자원의 부분집합을 공유한다.
- 부모와 자식은 자원을 공유하지 않는다.
- Execution option
- 부모와 자식은 동시에 실행된다.
- 부모는 자식이 종료될 때까지 기다린다.
- Address space option
- 자식은 부모의 복사체다.
- 자식은 그것의 안에 로드된 프로그램을 가진다.
- 리눅스 시스템에서의 프로세스 트리(tree)
UNIX에서의 프로세스 생성
먼저 그림을 보자.
> a.out
쉘로 위와 같은 명령을 실행하면 새로운 프로세스가 생성된다. 그 과정은 다음과 같다.
-
fork
라는 시스템 콜이 새로운 프로세스를 생성한다. -
새로운 프로세스는 원래 프로세스의 주소 공간의 복사본으로 구성된다.
- 복사본으로 구성되었기 때문에, 내용은 같지만 다른 메모리 공간에 존재한다.
- 따라서 부모의 전역 변수 등을 변경해도 자식의 내용은 바뀌지 않는다.
-
두 프로세스는
fork()
명령 이후에 (스케줄러를 통해) 동시에 실행을 계속한다.- 가령, 부모가 다음과 같다고 하면
fork()
문 이후 부모와 자식은if
문부터 동시에 실행을 계속한다.
int i; main { int pid; pid = fork(); if (pid == 0) { ... } else { ... } }
- 가령, 부모가 다음과 같다고 하면
- 반환된 pid 값은 다르다.
- 부모는 자식의 pid, 자식은 0을 반환받는다.
- 그래서
fork()
이후의 코드에서 pid 값을 통해 분기를 실행하는 경우가 많다.
- 그래서
- fork를 통해 반환받은 pid 변수의 값은 로컬 변수의 return 값이다. 이는 실제 프로세스 식별자(pid)와 다르다.
- exec 시스템 콜이 fork 이후에 자식 프로세스에서 사용되어 프로세스 메모리 공간이 새 프로그램으로 오버라이드되고, 새 프로그램이 실행된다.
프로세스 종료
- 프로세스는 마지막 명령을 수행하고 운영체제에게
exit(status)
시스템 콜을 사용해서 자신을 삭제하기를 요청한다.- 부모는 자식의 상태 값을 얻을 수 있다. (
wait(&status)
을 통해) - 프로세스의 자원은 운영체제에 의해 해제된다.
- 부모는 자식의 상태 값을 얻을 수 있다. (
- 부모는 자식 프로세스의 실행을
kill
을 통해 끝낼 수 있다.- 자식이 할당된 자원을 초과한 경우
- 자식에게 할당된 task가 더 이상 필요하지 않은 경우
- 부모가 exiting 중일 때
- 운영체제는 부모가 종료되는 경우 자식이 계속 실행되는 것을 허락하지 않는다.
- 이를 Cascading termination이라고 한다.
좀비 vs 고아 프로세스
- 좀비 프로세스 또는 defunct 프로세스는 실행이 완료되었음에도 PCB가 사라지지 않고 프로세스 테이블에 엔트리를 가진 프로세스이다.
- 프로세스가 종료되었음에도 부모가
wait
을 통해 자식의 자원을 정리하지 않은 프로세스 - 자식이 죽은 동안 부모가 실행중인 경우
- 부모가
wait
을 요청하면 자식은 정상적으로 종료된다. - 모든 프로세스는 보통 짧은 시간동안 좀비로 존재한다.
- 프로세스가 종료되었음에도 부모가
- 부모가
wait
을 일으키지 않고 종료된 경우, 그의 자식 프로세스들은 고아 프로세스가 된다. (이때 고아가 된 자식 프로세스들은 실행 중이다.)init
프로세스가 이 프로세스들의 새 부모로 할당된다.init
프로세스는 고아 프로세스의 exit status를 모으기 위해 주기적으로wait
을 일으킨다.- 자식 프로세스가 실행 중인 동안 부모 프로세스가 죽으면 고아 프로세스가 된다.
'Fundamentals > OS' 카테고리의 다른 글
[OS] 병행성(concurrency)과 스레드(thread) (0) | 2020.09.01 |
---|---|
[OS] 협력하는 프로세스들 (0) | 2020.09.01 |
[OS] 프로세스와 프로세스 스케줄링 (0) | 2019.09.24 |
[OS] Boot, 운영체제의 구조, VM (0) | 2019.09.19 |
[OS] System Call (0) | 2019.09.17 |
Comments