일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 삼성리서치
- 가상메모리
- segmentation
- dfs
- BFS
- Memory Management
- 완전탐색
- 운영체제
- 프로세스
- Brute Force
- 스케줄링
- 동기화문제
- 시뮬레이션
- samsung research
- exec
- BOJ
- 김건우
- fork
- higunnew
- 백트래킹
- 데드락
- 알고리즘
- pwnable.kr
- paging
- 컴공복전
- 삼성기출
- ascii_easy
- 백준
- Deadlock
- 구현
- Today
- Total
gunnew의 잡설
5-1강. 프로세스 관리(Process Management) 본문
프로세스는 어떻게 관리될까? 프로세스는 어떻게 만들어지고 어떻게 종료될까? 이번 강에서는 프로세스의 관리에 대해 설명한다.
프로세스 생성(Process Creation) |
사람은 어떻게 태어나는가? 부모에 의해서 태어난다. 프로세스도 마찬가지이다. 부모 프로세스(Parent process)가 자식 프로세스(Children process)를 생성한다. 하지만 사람과는 다르게 프로세스가 자식을 생성할 때는 복제 생성을 하며 트리 계층 구조로 프로세스의 hierarchy가 만들어진다.
프로세스는 자원을 필요로 한다. 이 자원은 운영체제로부터 할당 받거나 부모 프로세스와 공유하게 된다. 하지만 부모로부터 자식이 생성되었다고 하더라도 각 프로세스는 서로 다른 프로세스이기 때문에 공유하지 않는 것이 일반적이며, 서로 CPU를 얻기 위해 경쟁한다. 그리고 프로세스가 수행될 때 부모와 자식이 공존하며 수행되는 모델이 있으며, 자식 프로세스가 종료될 때까지 부모 프로세스가 기다리는(wait, blocked) 모델이 있다.
프로세스가 생성되는 경우를 살펴보자. 우선 프로세스는 각각이 할당 받은 주소 공간이 있을 것이다. 그 주소 공간을 포함하여, OS의 data (PCB)와 같은 것들을 그대로 복사한다. 그것이 바로 자식 프로세스가 되며 원래의 프로세스는 부모 프로세스가 된다. 유닉스 계열의 운영체제에서 fork()라는 system call은 부모 프로세스를 그대로 복사하는 것을 의미한다. 그러나 그대로 복사한 프로세스만 잔뜩 있다면 너무 재미가 없지 않을까? 그래서 그 복사된 프로세스에 새로운 프로그램을 덮어 씌워 메모리에 올리는 exec()라는 system call도 존재한다. 두 system call(fork(), exec())는 서로 독립적이기 때문에 프로세스의 복사만 하고, 즉, fork()만 해놓고 새로운 프로그램이 덮어 씌워지지 않을 수도 있으며, 자식은 생성하지 않으면서(fork()를 통해 복사는 하지 않으면서) exec만 하여 프로세스 자체가 새로운 프로세스로 바뀔 수 있다.
물론 부모 프로세스가 자식 프로세스를 생성한다고는 하였으나, 사용자 프로그램(프로세스)가 프로세스를 직접 복사하는 것은 아니고 운영체제를 통해서만 가능하다. 위에서 설명했던 system call을 통해 운영체제에게 요청하는 것이다.
프로세스 종료(Process Termination) |
일반적인 경우에, 그러니까 정상적으로 프로세스의 할 일이 끝나 종료될 때는 exit이라는 system call을 이용한다. 우리가 C언어로 어떤 프로그램을 작성할 때를 생각해보자. main함수 마지막에 중괄호를 닫는 행위에서 자연스럽게 프로그램이 종료되는 것을 확인할 수 있다. 우리가 따로 exit이라는 system call을 하지 않았음에도 C 컴파일러가 가장 마지막 부분에 exit이라는 system call을 집어 넣는 것이다.
만약 자식 프로세스가 종료된다면 wait라는 system call을 통해 자식 프로세스가 가지고 있는 data들을 부모 프로세스에게 보내며 자식 프로세스가 할당 받은 자원(resource)들을 운영체제에게 반납하게 된다. 그러니까 프로세스의 세계에서는 항상 부모보다 자식이 먼저 종료되는 것이다.
그러나 항상 평화롭게 프로세스가 종료된다는 보장은 없다. 할 일이 다 끝나지 않았는데 갑자기 종료되는 경우도 있다. 이 경우는 abort라는 system call을 통해 종료된다. 자식 프로세스가 할당된 자원을 넘어서 쓰려고 하는 경우가 그 첫 번째 경우이다. 두 번째로는 자식 프로세스에게 할당된 일이 더 이상 필요하지 않은 경우이다. 프로세스가 자식을 생성하는 경우는 일을 시키기 위해서이다. 만약 자식이 더 이상 할 일이 없으면 가차없이 자식을 죽인다.(kill) 마지막으로는 부모 프로세스가 종료되는 경우이다. 프로세스의 세계에서는 항상 자식이 먼저 종료되어야 하기 때문에 이 경우에서는 트리를 타고 들어가 자식 프로세스를 단계적으로 종료시키며 올라오게 된다.
본 글들은 이화여대 반효경 교수님 2014학년도 1학기 운영체제 강의를 기반으로 작성됩니다.
링크 : http://www.kocw.net/home/search/kemView.do?kemId=1046323
'Operating System' 카테고리의 다른 글
5-3강. 프로세스 간의 협력 (0) | 2020.01.24 |
---|---|
5-2강. 프로세스와 관련한 시스템 콜 (2) | 2020.01.24 |
4강. 스레드(Thread) (0) | 2020.01.22 |
3-2강. 프로세스(Cont'd) (0) | 2020.01.21 |
3-1강. 프로세스 (0) | 2020.01.21 |