3-3. 프로세스의 연산

2021. 5. 2. 19:54Computer Sciences/OS

1. 프로세스의 구조

  • 코드 영역

    프로그램의 본문이 기술된 곳으로 텍스트 영역이라고도 한다. 프로그래머가 작성한 프로그램은 코드 영역에 탑재되며 탑재된 코드는 읽기 전용으로 처리된다.

  • 데이터 영역

    코드가 실행되면서 사용하는 변수나 파일 등의 각종 데이터를 모아놓은 영역이다. 기본적으로 읽기와 쓰기가 가능하며, 상수는 읽기 전용이다.

  • 스택 영역

    운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳이다. 스택 영역은 운영체제가 사용자의 프로세스를 작동하기 위해 유지하는 영역이므로 사용자에게는 보이지 않는다.

2. 프로세스의 생성과 복사

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

프로세스를 새로 생성하는 방법뿐만 아니라 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 방법도 있다.

fork() 시스템 콜

fork() 시스템 콜은 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수이다. 커널에서 제공하는 이 함수는 프로세를 복사하는 일종의 시스템 콜이다. fork() 시스템 콜을 사용하면 실행 중인 프로세스와 똑같은 프로세스가 하나 더 생성된다. 브라우저를 여러 개 열거나, 워드프로세서 프로그램을 여러 개 켤 때 fork() 시스템 콜이 사용된다. 즉 아예 새로운 프로세스를 생성하는 것이 아니라 기존에 실행 중인 프로세스를 복사하는 방식으로, 새로 만드는 방식보다 속도가 매우 빠르다.

프로세스를 복사할 때 기존의 프로세스는 부모 프로세스가 되고 새로 생긴 프로세스는 자식 프로세스가 되며, 두 프로세스는 부모-자식 관계로 연결된다.

동작 과정

fork() 시스템 콜을 하면 PCB를 포함한 부모 프로세스 영역의 대부분이 자식 프로세스에 복사되어 똑같은 프로세스가 만들어진다. 다만 일부 변경되는 항목이 있는데 다음과 같다.

  • PID가 바뀐다.

    복사되었지만 다른 프로세스이기 때문이다.

  • 메모리 관련 정보가 바뀐다.

    부모 프로세스와 자식 프로세스가 차지하고 있는 메모리의 위치가 다르기 때문이다.

  • PPID와 CPID가 바뀐다.

    자식 프로세스에서는 PPID가 부모 프로세스의 PID로 변경되고, CPID는 -1이 된다.

장점

  • 프로세스의 생성 속도가 빠르다
  • 추가 작업 없이 자원을 상속할 수 있다.
  • 시스템 관리를 효율적으로 할 수 있다.

3. 프로세스의 전환

exec() 시스템 콜

기존의 프로세스를 새로운 프로세스로 전환하는 함수이다.

exec() 시스템 콜의 사용 목적은 프로세스의 구조체를 재활용하기 위함이다. 새로운 프로세스를 만들려면 PCB를 만들고 메모리의 자리를 확보하는 과정이 필요하다. 또한 프로세스를 종료한 후 사용한 메모리를 청소(garbage collection)하기 위해 상위 프로세스와 부모-자식 관계를 만들어야 한다. 이때 exec() 시스템 콜을 사용하면 이미 만들어진 PCB, 메모리 영역, 부모-자식 관계를 그대로 사용할 수 있어 편리하다. 새로운 코드 영역만 가져오면 되기 때문에 운영체제의 작업이 수월하다.

  • fork(): 새로운 프로세스를 복사하는 시스템 콜이다
  • exec(): 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 콜이다.

동작 과정

exec() 시스템 콜을 하면 다음과 같은 동작이 실행된다.

  • 코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 바꾼다.
  • 데이터 영역이 새로운 변수로 채워지고 스택 영역이 리셋된다.
  • PCB의 내용 중 각종 프로세스 구분자(PID, PPID, CPID)를 제외한 프로그램 카운터 값을 비롯한 각종 레지스터와 사용한 파일 정보가 리셋된다.

4. 프로세스의 계층 구조

1. 유닉스의 프로세스 계층 구조

유닉스에서 커널이 처음 메모리에 올라와 부팅이 되면 커널 관련 프로세스를 여러 개 만드는데, 그중 init 프로세스는 전체 프로세스의 출발점이 된다. 운영체제는 프로세스를 효율적으로 관리하기 위해 init 프로세스를 만든 다음 나머지 프로세스를 init 프로세스의 자식 프로세스로 만든다.

init 프로세스는 일반 사용자 프로세스의 맨 위에 위치하며, fork()와 exec() 시스템 콜을 이용하여 자식 프로세스를 만든다.

장점

  • 여러 작업을 동시에 처리한다.
  • 자원 회수가 용이하다.

    프로세스를 계층 구조로 만들면 프로세스 간의 책임 관계가 분명해져서 시스템을 관리하기 수월하다. 프로세스가 작업을 마치면 사용하던 자원을 부모 프로세스가 회수하면 되기 때문이다.

2. 고아 프로세스

프로세스가 종료된 후에도 비정상적으로 남아 있는 프로세스를 말한다. 좀비 프로세스라고도 한다.

부모 프로세스는 자원 회수를 위하여 자식 프로세스가 끝날 때까지 기다려야 하는데, 부모 프로세스가 먼저 종료되거나 자식 프로세스가 비정상적으로 종료되어 부모 프로세스와 연결되지 않는 경우가 있다. 이런 문제가 발생하면 자식 프로세스가 종료되지 않거나, 종료되었는데도 사용하던 자원이 그대로 남아있다.

  • 고아 프로세스(orphan process)

    부모 프로세스가 자식보다 먼저 죽는 경우 발생

  • 좀비 프로세스(zombie process)

    자식 프로세스가 종료했음에도 부모가 뒤처리를 하지 않을 때 발생

고아 프로세스나 좀비 프로세스가 많아지면 자원이 낭비됨으로써 효율적인 운영에 방해가 된다. 따라서 운영체제는 반환되지 못한 자원을 회수하는 자원 회수를 주기적으로 해야 한다.

'Computer Sciences > OS' 카테고리의 다른 글

5. 프로세스 동기화  (0) 2021.05.03
4. CPU 스케줄링  (0) 2021.05.03
3-2. PCB와 문맥 교환  (0) 2021.05.02
3-1. 프로세스의 개요  (0) 2021.05.02
2. 컴퓨터의 구조와 성능 향상  (0) 2021.05.02