10. 프로세스의 연산
📍프로세스의 구조
프로세스 | 설명 | |
코드 영역 code area |
프로세스의 본문이 기술되어 있음 ( 텍스트 영역, text area) - 프로그래머가 작성ㅎ안 프로그램은 코드 영역에 탑재됨 - 탑재된 코드는 읽기 전용으로 처리됨 |
읽기 전용 |
데이터 영역 data area |
프로세스의 데이터 - 코드가 실행되면서 사용하는 변수 variable나 파일 등의 각종 데이터를 모아놓은 곳 |
읽기 / 쓰기 |
스택 영역 stack area |
- 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아 놓은 곳 - 운영체제가 사용자의 프로세스를 작동하기 위해 유지하는 영역이므로 사용자에게는 보이지 않음 |
숨김 영역 |
📍프로세스의 생성과 복사
- 프로세스는 1️⃣ 프로그램을 실행하거나 2️⃣실행 중인 프로세스로부터 새로운 프로세스를 복사하는 방식으로 생성된다
- 사용자가 프로그램을 실행하면 운영체제는 프로그램을 메모리로 가져와 코드 영역에 넣고 프로세스 제어 블록을 생성함
- 메모리에 데이터 영역과 스택 영역을 확보한 후 프로세스를 실행함
📍 fork() 시스템 호출
: 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수
- 커널에서 제공하는 함수로 프로세스를 복사하는 일종의 시스템 호출
- fork()시스템 호출을 사용하면 실행 중인 프로세스와 똑같은 프로세스가 하나 더 만들어짐
◼️ 기존의 프로세스를 복사할 때
- 기존 프로세스 ➡️ 부모 프로세스
- 새로 생긴 프로세스 ➡️ 자식 프로세스
: 두 프로세스는 부모-자식 관계로 연결됨
◼️ fork() 시스템 호출을 하면 프로세스 제어 블록을 포함한 부모 프로세스 영역의 대부분이 자식 프로세스에 복사되어 똑같은 프로세스가 만들어지는데 이때, 프로세스 제어 블록의 내용 중 다음의 내용이 변경됨
- 프로세스 구분자 PID
- 메모리 관련 정보 : 부모 프로세스와 자식 프로세스가 차지하고 있는 메모리의 위치가 다르므로
- 부모 프로세스의 구분자 PPID 와 자식 프로세스 구분자 CPID가 바뀜
◼️ fork() 시스템 호출의 장점
- 프로세스의 생성 속도가 빠름
- 추가 작업 없이 자원을 상속할 수 있음
- 시스템 관리를 효율적으로 할 수 있음
fork() | exec() |
새로운 프로세스를 복사하는 시스템 호출 | 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출 - 현재의 프로세스가 완전히 다른 프로세스로 전환됨 |
📍 exec() 시스템 호출
: 기존의 프로세스를 새로운 프로세스로 전환하는 함수
- 프로세스의 구조체를 재활용하기 위해 사용함
- exec() 시스템 호출을 하면 코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 바꿔버림
+ 데이터 영역이 새로운 변수로 채워지고 스택 영역이 리셋됨
- 프로세스 제어 블록의 내용 중
변경 X : 프로세스 구분자PID, 부모 프로세스 구분자PPID, 자식 프로세스 구분자CPID, 메모리 관련 사항
변경 O : 프로그램 카운터 레지스터 값을 비롯한 각종 레지스터와 사용한 파일 정보
📍 프로세스의 계층 구조
- 운영체제는 프로세스를 효율적으로 관리하기 위해 init 프로세스를 만든 다음 나머지 프로세르를 init 프로세스의 자식으로 만듦
- init 프로세스는 일반 사용자 프로세스의 맨 위에 위치하며, fork(), exec() 시스템 호출을 이용하여 자식 프로세스를 만듦
- init 프로세스의 자식으로는 login 프로세스, shell 프로세스 등이 있음
◼️ 계층 구조의 장점
- 여러 작업의 동시 처리
- 용이한 자원 회수
: 프로세스 간의 책임 관계가 분명해져서 시스템을 관리하기가 수월함
- 프로세스가 작업을 마쳐서 그 프로세스가 사용하던 자원을 회수 garbage collection 할 때 특히 편리함
📍 미아 프로세스 orphan process / 좀비 프로세스 zombie process
: 프로세스가 종료된 후에도 비정상적으로 남아 있는 프로세스
- 부모 프로세스는 자원을 회수하기 위해 자식 프로세스가 끝날 때까지 기다려야 하는데 부모프로세스가 먼저 종료되거나 자식 프로세스가 비정상적으로 종료되어 부모 프로세스에 연락이 안되는 경우, 자식 프로세스가 종료되지 않거나 종료되었는데도 사용하던 자원이 그대로 남게 됨
* 객체지향 프로그래밍 언어
: 상속과 부모-자식 관계 구조는 상위 프로세스의 특징이 하위 프로세스에 상속되어 자원의 사용을 용이하게 하고, 객체를 다 사용하고 난 뒤에 자원을 쉽게 회수되게 한다.