3-3.[os] 프로세스의 연산
프로세스의 구조
- 코드 영역 - 요리책
- 데이터 영역 - 재료
- 스택 영역 - 조리 도구
예) 워드
- 워드 프로그램 - 코드 영역
- 워드로 편집중인 문서 - 데이터 영역
- 워드를 작동하기 위해 사용하는 각종 부가 데이터 - 스택 영역
코드 영역(code area)
- 프로그램의 본문이 기술된 곳
- = 텍스트 영역(text area)
- 프로그래머가 작성한 프로그램
- 읽기 전용
데이터 영역(data area)
- 코드가 실행되면서 사용하는 변수나 파일 등의 각종 데이터를 모아놓은 곳
- 읽기와 쓰기
스택 영역(stack area)
- 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳
- 예) 프로세스 내에서 함수를 호출하면 함수를 수행하고 원래 프로그램으로 되돌아올 위치를 이 영역에 저장
- 사용자에게 안 보임 : 운영체제가 사용자의 프로세스를 작동하기 위해 유지하는 영역이기 때문
프로세스의 생성과 복사
생성: 프로세스는 프로그램을 실행할 때 새로 생성된다. 사용자가 프로그램을 실행하면 운영체제는 프로그램을 메모리로 가져와 코드 영역에 넣고 프로세스 제어 블록을 생성한다. 그리고 메모 리에 데이터 영역과 스택 영역을 확보한 후 프로세스를 실행한다.
복사: 실행 중인 프로세스로부터 새로운 프로세스를 복사
fork() 시스템 호출: 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수
크롬창에서 ctrl + N 하면 크롬이 하나 더 실행됨. 새로 크롬을 실행하는 게 아니라 현재 크롬 프로세스를 복사해줌
부모 프로세스: 기존 프로세스
- 자식 프로세스: 새로 생긴 프로세스
- 부모-자식 관계로 연결됨
fork() 시스템 호출 후 프로세스 변화
- 프로세스 구분자(PID)가 바뀐다
- 부모 프로세스와 자식 프로세스가 차지하고 있는 메모리의 위치가 다르므로 메모리 관련 정보가 바뀐다
- 부모 프로세스 구분자(PPID)와 자식 프로세스 구분자(CPID)가 바뀐다. 자식 없으면 -1
fork(> 시스템 호출의 장점
프로세스의 생성 속도가 빠르다.
- 하드디스크로부터 프로그램을 새로 가져오지 않고 기존 메모리에서 복사함
추가 작업 없이 자원을 상속할 수 있다.
- 부모 프로세서가 사용하던 모든 자원을 추가 작업 없이 자식 프로세스에 상속
시스템 관리를 효율적으로 할 수 있다
- 부모와 자식이 구분자로 연결되어 있기 때문에, 자식 프로세스를 종료하면 자식이 쓰던 자원을 부모가 정리한다
exec() 시스템 호출의 개념
- 기존의 프로세스를 새로운 프로세스로 전환하는 함수
- 이미 만들어진 프로세스의 구조를 재활용
- 이미 만들어진 프로세스 제어 블록(PCB), 메모리 영역, 부모-자식 관계를 그대로 사용할 수 있어 편리
- fork():새로운 프로세스를 복사하는 시스템 호출이다.
- exec(): 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출. 현재의 프로세스가 완전히 다른 프로세스로 전환된다.
exec() 시스템 호출의 동작과정
- 코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 바꿔버린다
- 데이터 영역이 새로운 변수로 채워진다
- 스택 영역이 리셋된다
- 안 바뀌는 것: 프로세스 구분자, 부모 프로세스 구분자, 자식 프로세스 구분자, 메모리 관련 사항
프로세스의 계층구조
- 유닉스
- init 프로세스: 전체 프로세스의 출발점
- 운영체제에 있는 모든 프로세스는 init 프로세스의 자식이 됨
- fork()와 exec() 시스템 호출을 이용하여 자식 프로세스를 만든다
프로세스 계층 구조의 장점
여러 작업의 동시 처리
- fork() 시스템 호출로 프로세스를 login 프로세스를 여러개 만들어 동시에 처리
- exec() 시스템 호출을 사용하여 login -> shell 프로세스로 다시 활용
- 기존의 부모-자식 관계도 유지
용이한 자원 회수
- 계층 구조: 프로세스 간의 책임 관계가 분명해져서 시스템을 관리하기가 수월
- (모든 프로세스가독립적으로 만들어지면 프로세스가 종료될 때마다 운영체제가 직접 자원을 회수해야하기 때문에 작업이 복잡해짐)
- 부모-자식 관계로 만들면 자식 프로세스가 작업을 마쳤을 때 사용하던 자원을 부모 프로세스가 회수
고아 프로젝트
- 부모 프로세스는 자원을 회수하기 위해 자식 프로세스가 끝날 때까지 기다려야 한다
- 부모 프로세스가 먼저 종료되거나 자식 프로세스가 비정상적으로 종료되어 부모 프로세스에 연락이 안 되는 경우
- 프로세스가 종료된 후에도 비정상적으로 남아 있음
- 고아 프로세스: 부모 프로세스가 자식보다 먼저 죽는 경우
- 좀비 프로세스: 자식 프로세스가 종료 했음에도 부모가 뒤처리를 하지 않을 때
exit(), return(): 반환되지 못한 자원을 회수