OS: Process 상태 관리

OS

OS(Operating system)은 운영체제로 소프트웨어와 하드웨어 리소스를 관리하는 시스템 소프트웨어다.

구성

OS는 크게 Bootstrap loader, Kernel, Utilites로 구성되어 있다.

  • Bootstrap loader: OS를 실행하는 역할로, 필요한 정보를 메모리로 올리는 역할을 한다. ROM에 firmware 형태로 저장되어 있어 가장 먼저 실행된다.
  • Kernel: OS의 핵심적인 부분으로 주로 리소스 관리를 담당한다. 부팅을 통해 메모리에 상주하게 된다.
  • Utilities: 메모리에 올라오지 않는 기능으로, 대표적으로 UI 함수가 있다.

기능

  • 프로세스 관리: 프로세스 주기(생성~종료)를 모두 관리하며, 이 과정에서 kernel 내에 있는 PCB(Process Control Block) 영역을 사용한다.
  • 프로세서 관리: 프로세서는 일반적으로 CPU를 말하며, scheduling이나 assignment 등을 OS에서 관리한다.
  • 메모리 관리: 메모리 할당을 담당하며, 가상 메모리도 OS에서 담당한다.
  • 네트워크 관리: TCP/IP 같은 네트워크 통신 기능도 OS에 구현되어 있다.
  • 파일 관리: 계층 구조로 파일을 관리한다. 참고로 백업은 OS의 역할이 아니다.
  • I/O 관리: 프로세스에서 system call이 발생하면, kernel에서 요청을 처리한다. I/O 장치에서 발생한 interrupt도 kernel에서 관리한다.

etc-image-0

모드

  • User mode: 응용 프로그램이 실행되는 모드
  • Kernel mode: OS 내부에서만 사용 가능한 privileged instructions가 실행된다. 다시 말해, 사용자가 직접 접근할 수 없는 레벨의 동작을 수행한다.

trap이나 interrupt가 발생하면 모드가 바뀐다.

  • trap: 실행 중인 소프트웨어에서 발생하는 동작으로, 에러(exception)가 발생하거나 system call이 발생할 때가 대표적이다.
  • interrupt: 외부 기기에서 발생하는 예상치 못한 이벤트로, I/O 장치가 요청하는 것이 대표적이다.

Process

Process는 실행을 위해 kernel에 등록된 개체다. (실행되기 전 코드를 Job이라고 한다.)

etc-image-1

  • 실행 중인 프로그램을 말한다.
  • Process는 kernel에 등록된 상태다.
  • 시스템 리소스를 사용할 수 있는 상태다.
  • PCB를 할당받은 상태다.

구성

  • text: 실행 코드
  • data: 전역 변수
  • stack: 임시 정보(local variables, function parameters...)
  • heap: 동적 메모리 할당 공간
  • 등등

PCB

PCB(Process Control Block)는 kernel에 있는 영역으로 각 프로세스에 관한 정보를 담고 있다.

  • PID: Process Identification Number
  • Process 상태
  • 스케쥴링 정보
  • 메모리 관리 정보
  • I/O 상태 정보
  • Context save area

상태 관리

etc-image-2

  • created: PCB를 할당 받고 메모리 위에 올라가면 ready 상태가 된다. 할당 가능한 메모리 공간이 없으면 suspended read 상태가 된다. UNIX에서는 fork() 명령어로 처리된다.
  • ready: 프로세서를 할당받기 위해 기다리는 상태다. 스케쥴러에 의해 프로세서를 할당받으면 running 상태가 된다.
  • running: 메모리와 프로세서를 할당받아 실행 중인 상태다.
    • preemption: 사용 시간(time slice)이 지나거나 우선순위가 밀리면 다시 ready 상태로 돌아간다. 외부에 의해 강제로 실행되는 단계다.
    • block: 리소스를 할당받기 위해 잠시 asleep 상태로 이동한다. 예를 들어, I/O 요청을 받아올 때까지 다른 프로세스가 실행되도록 양보하는 단계다.
  • asleep: 프로세서나 메모리를 제외한 다른 리소스를 받기 위해 대기 중인 상태다 (예: I/O). system call을 보낸 상태이기도 하다.
    • wakeup: 리소스를 할당 받아 interrupt가 발생하면 다시 프로세서를 할당받기 위해 ready 상태로 돌아간다. 주의할 점은 바로 running으로 되돌아가는 것이 아니라 다시 스케쥴러에 의해 자원을 할당받을 때까지 기다린다.
  • suspended ready: 메모리를 반납하고 이미지가 swap device에 저장된 상태다. swap device는 disk 상의 가상 메모리로, 메모리 공간이 없어 임시로 disk에 공간을 할당해 사용하는 것을 말한다.
  • suspended asleep: asleep 상태에서 메모리까지 반납한 상태다. 만약 요청한 이벤트가 끝나지 않았을 때 할당 가능한 메모리가 생기면 다시 asleep으로 돌아간다. 하지만 이벤트가 끝났음에도 여전히 메모리 공간이 부족하다면 suspended ready 상태가 되어 메모리가 할당될 때까지 기다린다.
  • terminated: 프로그램이 완전히 종료된 상태로, 모든 자원을 반납하고 PCB만 일부 정보를 가지고 있다.

Scheduling

스케쥴링이 필요한 프로세스는 queue로 순서를 관리한다.

  • Ready queue: ready 상태에서 프로세스를 관리하는 priority queue이다. ready list라고도 불린다.
  • I/O queue: asleep 상태에서 I/O 처리를 기다리는 프로세스를 관리하는 queue로 asleep 원인에 따라 각 queue에 별도로 저장/관리한다 (예: 네트워크, 디바이스 등). Block queue 또는 block list로도 불린다.

관리하는 정도에 따라 스케쥴링을 분류하기도 한다.

  • Long-term: multi-programming 수준의 프로세스 관리 (job → created)
  • Medium-term: 메모리 자원을 관리하는 swapping 단계의 관리 (ready/asleep ↔ suspended)
  • Short-term: 프로세서 자원의 context switching을 관리하는 단계 (ready → running)

Interrupt

프로세서 외부에서 발생하는 이벤트로, 디바이스의 I/O 요청, IPC 요청 등이 그 예시다.

etc-image-3

  • 외부에서 프로세서로 interrupt를 발생시킨다.
  • 기존에 실행 중이던 프로세스는 잠시 PCB 영역으로 밀려난다.
  • Interrupt handler가 발생한 interrupt를 처리할 것인지 확인한다.
  • Interrupt sevice routine(ISR)가 실행되어 interrupt를 처리한다.
  • 작업이 끝나면 Scheduler는 어떤 프로세스를 실행할지 판단한다.
  • 실행할 프로세스가 올라오는 것을 context switching이라고 한다.

Context switching

Context switching에서 context는 3 가지 구분된다.

  • User-level context: Stack, Heap 등 사용자 프로세스의 메모리 영역
  • System-level context: PCB 같이 OS가 관리하는 프로세스 정보
  • Register context: CPU 레지스터 상태

이러한 정보는 PCB 내 Context save area에 임시로 저장된다. context switching를 세부적으로 구분하면 아래와 같다.

  • Context saving: register context를 저장하는 과정
  • Context restoring: interrupt가 발생하기 전 프로세스로 복귀하는 경우
  • Context switching: interrupt가 종료되고 scheduler에 의해 다른 프로세스가 실행되는 경우