3-3.[os] 프로세스의 연산

프로세스의 구조

  • 코드 영역 - 요리책
  • 데이터 영역 - 재료
  • 스택 영역 - 조리 도구

image.png

예) 워드

  • 워드 프로그램 - 코드 영역
  • 워드로 편집중인 문서 - 데이터 영역
  • 워드를 작동하기 위해 사용하는 각종 부가 데이터 - 스택 영역

image.png

코드 영역(code area)

  • 프로그램의 본문이 기술된 곳
  • = 텍스트 영역(text area)
  • 프로그래머가 작성한 프로그램
  • 읽기 전용

데이터 영역(data area)

  • 코드가 실행되면서 사용하는 변수나 파일 등의 각종 데이터를 모아놓은 곳
  • 읽기와 쓰기

스택 영역(stack area)

  • 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳
  • 예) 프로세스 내에서 함수를 호출하면 함수를 수행하고 원래 프로그램으로 되돌아올 위치를 이 영역에 저장
  • 사용자에게 안 보임 : 운영체제가 사용자의 프로세스를 작동하기 위해 유지하는 영역이기 때문

프로세스의 생성과 복사

  • 생성: 프로세스는 프로그램을 실행할 때 새로 생성된다. 사용자가 프로그램을 실행하면 운영체제는 프로그램을 메모리로 가져와 코드 영역에 넣고 프로세스 제어 블록을 생성한다. 그리고 메모 리에 데이터 영역과 스택 영역을 확보한 후 프로세스를 실행한다.

  • 복사: 실행 중인 프로세스로부터 새로운 프로세스를 복사

image.png fork() 시스템 호출: 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수

  • 크롬창에서 ctrl + N 하면 크롬이 하나 더 실행됨. 새로 크롬을 실행하는 게 아니라 현재 크롬 프로세스를 복사해줌

  • 부모 프로세스: 기존 프로세스

  • 자식 프로세스: 새로 생긴 프로세스
  • 부모-자식 관계로 연결됨

fork() 시스템 호출 후 프로세스 변화

image.png

  • 프로세스 구분자(PID)가 바뀐다
  • 부모 프로세스와 자식 프로세스가 차지하고 있는 메모리의 위치가 다르므로 메모리 관련 정보가 바뀐다
  • 부모 프로세스 구분자(PPID)와 자식 프로세스 구분자(CPID)가 바뀐다. 자식 없으면 -1

fork(> 시스템 호출의 장점

프로세스의 생성 속도가 빠르다.

  • 하드디스크로부터 프로그램을 새로 가져오지 않고 기존 메모리에서 복사함

추가 작업 없이 자원을 상속할 수 있다.

  • 부모 프로세서가 사용하던 모든 자원을 추가 작업 없이 자식 프로세스에 상속

시스템 관리효율적으로 할 수 있다

  • 부모와 자식이 구분자로 연결되어 있기 때문에, 자식 프로세스를 종료하면 자식이 쓰던 자원을 부모가 정리한다

exec() 시스템 호출의 개념

  • 기존의 프로세스를 새로운 프로세스로 전환하는 함수
  • 이미 만들어진 프로세스의 구조를 재활용
  • 이미 만들어진 프로세스 제어 블록(PCB), 메모리 영역, 부모-자식 관계를 그대로 사용할 수 있어 편리

image.png

  • fork():새로운 프로세스를 복사하는 시스템 호출이다.
  • exec(): 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출. 현재의 프로세스가 완전히 다른 프로세스로 전환된다.

exec() 시스템 호출의 동작과정

  • 코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 바꿔버린다
  • 데이터 영역이 새로운 변수로 채워진다
  • 스택 영역이 리셋된다
  • 안 바뀌는 것: 프로세스 구분자, 부모 프로세스 구분자, 자식 프로세스 구분자, 메모리 관련 사항

image.png

프로세스의 계층구조

  • 유닉스

image.png

  • init 프로세스: 전체 프로세스의 출발점
  • 운영체제에 있는 모든 프로세스는 init 프로세스의 자식이 됨
  • fork()와 exec() 시스템 호출을 이용하여 자식 프로세스를 만든다

프로세스 계층 구조의 장점

여러 작업의 동시 처리

  • fork() 시스템 호출로 프로세스를 login 프로세스를 여러개 만들어 동시에 처리

image.png

  • exec() 시스템 호출을 사용하여 login -> shell 프로세스로 다시 활용
  • 기존의 부모-자식 관계도 유지

image.png

용이한 자원 회수

  • 계층 구조: 프로세스 간의 책임 관계가 분명해져서 시스템을 관리하기가 수월
  • (모든 프로세스가독립적으로 만들어지면 프로세스가 종료될 때마다 운영체제가 직접 자원을 회수해야하기 때문에 작업이 복잡해짐)
  • 부모-자식 관계로 만들면 자식 프로세스가 작업을 마쳤을 때 사용하던 자원을 부모 프로세스가 회수

고아 프로젝트

  • 부모 프로세스는 자원을 회수하기 위해 자식 프로세스가 끝날 때까지 기다려야 한다
  • 부모 프로세스가 먼저 종료되거나 자식 프로세스가 비정상적으로 종료되어 부모 프로세스에 연락이 안 되는 경우
  • 프로세스가 종료된 후에도 비정상적으로 남아 있음
  • 고아 프로세스: 부모 프로세스가 자식보다 먼저 죽는 경우
  • 좀비 프로세스: 자식 프로세스가 종료 했음에도 부모가 뒤처리를 하지 않을 때

exit(), return(): 반환되지 못한 자원을 회수

Did you find this article valuable?

Support Software Engineer at Your Service by becoming a sponsor. Any amount is appreciated!