쉽게 배우는 OS Chapter03

Chapter03 프로세스와 스레드

3.1 프로세스의 개요

3.1.1 프로세스의 개념

프로그램은 (보조)저장장치에 저장된 정적인 상태의 코드이며, 프로세스는 메모리에 올라온 동적인 상태 이다.

3.1.3 프로그램에서 프로세스로의 전환.

프로세스 제어 블록(PCB) pcb 커널에서 관리하는, 특정 프로세스에 대한 다양한 정보가 담겨 있는 자료구조. 프로그램이 프로세스가 되러면, 프로그램이 메모리에 올라오면서 커널이 PCB를 생성해야 프로세스가 된다.

PCB에 저장되는 중요한 정보 세가지는 아래와 같다.

상태

대부분의 프로세스는 위의 5가지 상태를 가지며, 이를 활성상태라고 통칭한다. 이외의 상태는 휴식상태, 보류상태가 있다. 특히 보류상태의 프로세스는 메모리 밖의 스왑영역에 저장된다.

3.2 문맥 교환

context switching이미지 출처 : stack overflow

문맥 교환의 의미와 절차 문맥교환이란 실행상태의 프로세스를 변경하는 것으로, 현재의 상태를 실행중이던 PCB에 저장하고 이를 다음것으로 변경하는 것이다.

위의 사진은 P_0에서 P_1으로 문맥교환이 있어났다가 다시 P_0으로 문맥교환이 일어나는 상황이다.

  1. P_0이 실행중 타임아웃 등의 인터럽트가 발생한다.
  2. 문맥전환을 위해 PCB_0에 P_0의 상태를 저장한다.
  3. 기타 작업 후 PCB_1에서 P_1의 상태를 가지고 온 후 P_1을 실행한다.
  4. 다시 타임아웃 등의 인터럽트가 발생한다.
  5. 문맥전환을 위해 PCB_1에 P_1의 상태를 저장한다.
  6. 기타 작업 후 PCB_0에서 P_0의 상태를 가지고 온 후 P_0을 실행한다.

    3.3 프로세스의 연산

    3.3.1 프로세스의 구조

    process memory model 이미지 출처 : packtpub

UNIX시스템은 프로세스가 생성할때 각 프로세스에 4GB의 가상 메모리를 할당한다. 이때 User space는 3GB, Kernel space는 1GB가 할당된다.

3.3.2 프로세스의 생성과 복사

프로그램이 실행될때 운영체제는 프로세스를 새로 생성하거나 복사한다.

프로세스 생성 과정

  1. 사용자가 프로그램을 실행한다.
  2. 운영체제는 프로그램을 메모리의 code영역에 넣고 PCB를 생성한다.
  3. 메모리에서 데이터 영역, 스택영역, 힙 영역 등의 공간(4GB)를 할당 한 후 프로세스를 실행된다.

    3.3.2.1 fork() 시스템 호출

    fork fork() 시스템 호출은 실행중인 프로세스로부터 새로운 프로세스를 복사하는 함수이다. fork()를 하면 자식프로세스를 만들어 원본(호출한 프로세스)과 동일한(PCB의 몇 부분을 제외) 프로세스가 복사된다.

바뀌는 부분

3.3.4 프로세스의 계층구조

3.3.4.1 UNIX의 프로세스 계층구조

UNIX에서는 커널이 처음 메모리에 올라와서 부팅이 되면 커널 관련 여러 프로세스를 fork한다. 그 중 init프로세스는 전체 프로세스의 출발점이 되는 프로세스이다. 운영체제에 있는 모든 프로세스는 init의 자식이 되어 트리구조를 가지게된다.

3.3.4.2 프로세스 계층구조의 장점

  1. 계승을 통해 여러 작업을 효율적으로 차리 가능
  2. 용이한 자원 회수 -> 누가 자원을 회수해야 할지(부모 자식관계) 명확해짐.

    3.3.4.3 고아프로세스와 좀비프로세스

    • 고아프로세스 : 부모 프로세스가 자식프로세스보다 먼저 종료되는 경우. 자식프로세스가 종료되지 못하거나 자원이 회수되지 못하는 문제가 발생한다. -> wait 필요
    • 좀비프로세스 : 자식프로세스가 종료되었음에도 그 자원을 회수하지 못한 경우. 자식이 이상하게 종료되거나, 반환(return, exit)을 하지 않는 경우 발생.