1 프로세스 개요

1.1 프로그램과 프로세스

프로그램은 저장 장치에 저장된 실행 가능한 파일이며, 프로그램이 메모리에 적재되어 실행 중일 때 프로세스 라고 부른다.

프로세스 특징

  • 운영체제는 프로그램을 메모리에 적재하고 이를 프로세스로 다룬다.
  • 운영체제는 프로세스에게 실행에 필요한 메모리를 할당하고 이곳에 코드와 데이터 등을 적재한다.
  • 프로세스들은 서로 독립적인 메모리 공간을 가지므로, 다른 프로세스의 영역에 접근할 수 없다.
  • 운영체제는 프로세스마다 고유한 번호(프로세스 ID)를 할당한다.
  • 프로세스에 관한 정보는 운영체제 커널에 의해 관리된다.
  • 프로세스는 실행-대기-잠자기-실행-대기-잠자기-실행-종료 등의 생명 주기를 가진다.
  • 프로세스를 만들고, 실행하고, 대기시키고, 종료시키는 모든 관리는 커널에 의해 수행된다.

1.2 프로세스 관리

  1. 메모리 관리
    • 사용자 공간에 프로세스를 위한 메모리 영역을 할당합니다.
  2. 프로세스 식별
    • 각 프로세스에 고유한 프로세스 ID(PID)를 부여합니다.
  3. 프로세스 테이블 관리
    • 커널 영역에 프로세스 테이블을 생성합니다.
  4. 프로세스 스케줄링
    • 여러 프로세스가 CPU를 공유하도록 스케줄링 알고리즘을 사용합니다.
  5. 프로세스 동기화 및 통신
    • 여러 프로세스가 서로 안전하게 공유 자원에 접근하도록 동기화 메커니즘을 제공합니다.
  6. 프로세스 상태 관리
    • 프로세스의 현재 상태를 추적하고 관리합니다.
  7. 프로세스 생성 및 종료
    • 사용자의 요청이나 시스템 필요에 따라 프로세스를 생성합니다.
  8. 프로세스 일시 중단 및 재개
    • 사용자의 요청이나 시스템 오류로 인해 프로세스를 일시 중단합니다.

1.3 프로그램의 다중 인스턴스

프로그램은 실행될 때마다 독립된 프로세스가 생성된다. 이때 동일한 프로그램의 다중 인스턴스 프로세스들은 프로그램 코드가 적재된 메모리 영역을 공유한다.

1.4 프로세스 주소 공간

프로세스의 구성

프로세스를 구성하는 4개의 메모리 영역

프로세스 주소 공간

프로세스의 주소 곡간

프로세스의 크기와 주소 공간의 크기

주소 공간의 크기는 프로세스가 액세스할 수 있는(커져 갈 수 있는) 전체 영역 프로세스의 크기는 프로세스가 주소 공간 내에서 현재 사용중인 코드, 데이터, 힙, 스택을 합친 크기

프로세스의 주소 공간은 가상 공간이다.

프로세스의 주소 공간은 물리 공간이 아니라 운영체제가 만들어 준 가상 공간 운영체제는 각 프로세스마다 프로세스의 가상 주소 공간과 물리 메모리의 물리 주소 공간을 연결하는 매핑 테이블을 두고 두 주소 공간을 관리한다. 프로세스의 가상 주소 공간과 물리 메모리 공간 각 프로세스의 영역은 운영체제에 의해 물리 메모리의 서로 다른 공간에 배치되므로 프로세스들 사이의 가상 주소 공간은 충돌하지 않는다.

2 커널의 프로세스 관리

2.1 프로세스 테이블과 프로세스 제어 블록

프로세스 테이블과 프로세스 제어 블록(pcb) 운영체제 커널은 시스템 전체에 하나의 프로세스 테이블을 두고 모든 프로세스의 정보를 관리 커널은 프로세스를 생성할 때 마다 프로세스 제어 블록(PCB, Process Control Block) 을 생성하여 프로세스의 정보를 저장

2.2 프로세스 제어 블록(PCB, Process Control Block)

프로세스 번호, PID(Process Identification Number)

커널은 프로세스를 생성할 때 프로세스 번호 PID를 할당한다. PID는 프로세스를 식별하는 고 유한 번호로, 사용자나 응용프로그램, 운영체제 모두 PID로 프로세스를 식별한다.

부모 프로세스 번호, PPID(Parent Process Identification Number)

프로세스는 프로세스에 의해 생성되며 이들 사이에는 부모-자식 관계가 형성된다. 부팅할 때 만들어진 최상위 프로세스를 제외하고 모든 프로세스는 부모 프로세스를 가지며, PCB에는 부모 프로세스의 ID(PPID)가 저장된다.

프로세스 상태 정보(Process State)

커널은 프로세스의 상태를 바꿀 때마다 PCB에 상태 정보를 저장한다.

프로세스 컨텍스트 정보(Process Context)

커널은 현재 CPU가 실행 중인 프로세스를 중단시키고 다른 프로세스를 실행시킬 때, 현재 프로세스가 실행 중인 상황 정보, 즉 프로세스 컨텍스트를 PCB에 저장한다.

스케줄링 정보

PCB에는 커널이 스케줄링 시 참고하는 다음 값들이 저장된다.

  • 프로세스의 우선순위(priority 값, nice 값 등)
  • 프로세스가 사용한 CPU 시간, 최근에 CPU를 할당받아 실행한 시간 등 프로세스의 우선순위는 프로세스가 생성될 때 주어지며 시스템 호출을 통해 변경 가능하다.

종료코드(exit code)

종료코드는 프로세스가 종료할 때, 종료 이유를 부모 프로세스에게 전달하기 위한 정수 값으로, 종료한 프로세스의 PCB에 저장된다. 종료코드가 부모 프로세스의 의해 읽혀질 때까지, 프로세스의 PCB를 제거하지 않는다. 부모가 종료코드를 읽어가지 않은 상태의 프로세스를 좀비(zombie) 프로세스라고 부른다.

프로세스의 오픈 파일 테이블(Per-process open file table)

프로세스가 실행 중에 열어 놓은 파일에 관한 정보들을 저장한다. 프로세스가 종료할 때 커널이 오픈 파일 테이블에 기 록된 파일을 모두 닫아준다.

메모리 관리를 위한 정보들

대부분의 운영체제들은 가상 주소를 물리 주소로 변환하는 매핑 테이블(그림 3-6)을 메모리 에 두고, PCB에는 매핑 테이블의 주소를 저장한다.

프로세스 사이의 통신 정보들

프로세스들은 서로의 영역에 접근할 수 없기 때문에, 프로세스 사이의 통신은 커널이 지원하는 프로세스간 통신 방법(IPC, Inter Process Communication)을 이용한다. PCB에는 신호 핸 들러 리스트, 다른 프로세스부터 받은 신호 플래그, 메시지 등이 저장된다.

회계 정보

프로세스의 CPU 사용 총 시간, 프로세스가 실행을 시작하여 경과한 총 시간, 프로세스의 제한 시 간 등이 저장되며, 이들은 사용자의 컴퓨터 사용료를 계산하거나 성능 통계를 낼 때 사용된다.

프로세스의 소유자 정보

프로세스를 생성한 사용자의 로그인 이름이나 사용자 ID(user id) 정보 등이다

기타

프로세스가 현재 사용 중인 입출력 장치의 리스트, 준비 상태에 있는 다른 PCB에 대한 링크등이 저장된다.

2.3 프로세스의 생명 주기와 상태 변이

프로세스의 상태 변이

New

프로세스는 사용자가 프로그램을 실행하거나 운영 체제가 시스템 서비스를 시작할 때 생성됩니다. 프로세스가 생성되면 운영 체제는 프로세스 제어 블록(PCB)을 만들고 프로세스에 필요한 자원(메모리, CPU 시간, 파일 디스크 공간 등)을 할당합니다.

Ready

프로세스가 스케줄링을 기다리는 상태입니다. Ready 상태의 프로세스들은 커널에 있는 준비 큐에 들어간다.

Running

CPU가 프로세스를 실행하고 프로세스의 실행이 완료되면 커널은 Terminated/Zombie 상태로 만든다.

Blocked or Wait

Blocked 상태는 프로세스가 자원을 요청하거나, 입출력을 요청하고 완료를 기다리는 상태 프로세스가 Running 상태에서 시스템 호출을 일으켰을 경우, 커널은 현재 프로세스를 Blocked 또는 Wait 상태로 만든다.

Terminated/Zombie

커널은 프로세스가 차지하고 있던 메모리와 할당받았던 자원들을 모두 반환하고 열어 놓은 파일들고 모두 닫는다. 부모 프로세스가 종료코드를 읽어 갈 때까지 PCB를 남겨둔다

Terminated/Out

부모 프로세스가 Zombie 상태인 자식 프로세스의 종료코드를 읽어갈 때, 비로소 커널은 Zombie 상태의 PCB를 시스템에서 제거하고 프로세스 테이블의 항목도 제거한다.

2.4 프로세스 스케줄링

CPU를 할당할 프로세스를 결정하는 과정 멀티스레드 운영체제에서 실행 단위는 프로세스가 아니라 스레드이다. 프로세스는 프로세스에 속한 스레드들에게 공유 자원을 제공하는 컨테이너로 그 역할이 바뀜 오늘날 운영체제들은 프로세스 스케줄링 없이 시스템의 전체 스레드를 대상으로 스레드를 선택하는 스레드 스케줄링을 실행한다.

2.5 프로세스 정보 보기

3 프로세스의 계층 구조

3.1 프로세스의 부모-자식 관계

생성한 프로세스를 부모, 생성된 프로세스를 자식 프로세스라고 한다. #0, #1, #2 번 프로세스는 모두 부팅 초기에 생성 #0 프로세스는 유휴 프로세스 - 스케줄될 프로세스가 하나도 없을 때 실행 #1 init 프로세스(systemd) - 부팅 과정에서 시스템을 초기화, 부팅을 완료, 시스템 종료 과정 또한 외부 네트워크로부터 연결 요청을 대기하는 sshd 프로세스를 생성한다. #2 kthreadd 프로세스 - 부팅 때 생성되어 커널 공간에서 커널 모드로 실행되면서 커널의 기능을 돕는 프로세스 부모-자식의 계층 관계로 구성되는 리눅스의 프로세스들 사례

3.2 #0 과 #1 프로세스 : idle 프로세스와 init 프로세스

idle 프로세스를 만든 이유는 모든 프로세스가 블록 상태여서 시스템에 실행시킬 Ready 상태의 프로세스가 1개도 없는 상황에 빠지지 않도록 하기 위해서이다.

3.3 부모 자식 프로세스의 실행 관계

부모 프로세스와 자식 프로세스의 실행 관계

3.4 좀비 프로세스: 종료 후 방치된 자식 프로세스

부모 프로세스에서 자식의 종료를 확인하는 wait() 시스템 호출

3.5 고아 프로세스와 입양

어떤 경우든, 부모가 먼저 종료한 자식 프로세스들을 고아 프로세스 라고 부른다. #1 init 프로세스가 고아 프로세스를 입양하는 과정

3.6 백그라운드 프로세스와 포그라운드 프로세스

  • 백그라운드 프로세스: 사용자와의 대화를 필요로 하지 않는 프로세스
  • 포그라운드 프로세스: 터미널 사용자로부터의 입출력을 독점하는 프로세스, 운영체제는 터미널에서의 사용자 입력을 모두 포그라운드 프로세스로 보낸다.

3.7 CPU 집중 프로세스와 I/O 집중 프로세스

  • CPU 집중 프로세스: 프로세스의 작업이 대부분 계산 중심적인 일로 구성되어 실행의 많은 부분에 CPU가 활용 될 때, CPU의 속도가 성능을 좌우하므로 CPU 바운드 프로세스 라고도 함
  • I/O 집중 프로세스: 프로세스의 작업 중 많은 부분이 입출력 작업인 경우, CPU 사용 시간 비중은 매우 낮음, 입출력 장치의 속도가 성능을 좌우하므로 I/O 바운드 프로세스 라고도 함

4 프로세스 제어(fork, exec, wait, exit)

4.1 프로세스 생성과 fork()

  1. 새로운 PID 번호 할당
  2. PCB 생성
  3. 프로세스 테이블에 새 항목 할당 및 PCB 연결
  4. 메로리 공간 할당, 초기화
  5. Ready로 전환
  6. 스케줄링

4.2 프로세스 오버레이와 exec()

프로세스 오버레이(process overlay) 는 현재 실행중인 프로세스의 주소 공간에 새로운 응용프로그램을 적재하여 실행시키는 기법으로 exec() 시스템 호출이 사용된다. PID만 계승하고 주소공간에는 새로운 데이터들이 로드

4.3 프로세스 종료와 프로세스 종료 대기

프로세스 종료 행위는 exit() 시스템 호출레 의해서 이루지며 아래 과정과 같다.

  1. 프로세스에게 할당된 모든 메모리와 자원 반환, 파일이나 소켓 닫기
  2. PCB의 프로세스 상태만 Terminated/Zombie 로 변경 후 종료코드를 PCB에 저장
  3. 현재 프로세스의 모든 자식 프로세스들을 init 프로세스에게 입양
  4. 부모 프로세스에게 SIGCHLD 신호 전송, 부모가 wait() 호출하여 종료코드를 읽으면 완전히 종료

4.4 좀비 프로세스

프로세스가 종료하여 메모리와 할당 받은 모든 자원이 반환되었지만, 자신이 남긴 종료코드가 부모에게 전갈되지 않은 상태로 있을 때 좀비 프로세스 라고 부른다.

Ref.

황기태, “명품 운영체제”, (주)생튼출판사(2021)