OS - [2]프로세스와 스레드

프로세스(Process)란?

프로세스 정의 (definition)

프로세스는 프로그램의 수행 단위다.

Process is a program in execution.

즉, 실행 중인 프로그램을 프로세스라고 말한다.

프로세스 문맥 (process context)

  1. 하드웨어 문맥 (harware context)
    하드웨어인 CPU가 프로세스의 명령어(instruction) 어디까지 수행했는지를 의미한다.
    • program counter
      CPU가 프로세스의 코드를 어디까지 처리했는지 기록함
    • register
      프로세스의 결과값 및 커널(=os)의 주소값을 저장
  2. 프로세스의 주소 공간 (memory)
    메모리 내 프로세스의 위치를 의미한다.
    • stack
      프로그램의 출력값
    • data
      프로그램 내 각종 변수(variale)
    • code
      프로그램 내 코드 (=instruction, 기계어)
  3. 커널(OS) 문맥
    커널은 특정한 자료구조에 프로세스 정보를 저장한다.
    • PCB(Process Control Block)
      커널이 프로세스를 관리하기 위해 프로세스 별로 유지하는 정보이다.
    • Kernel Stack
      프로세스가 system call을 실행하면 커널 함수를 호출하게 되는데, 이 때 커널 함수를 호출한 프로세스 정보를 kernel stack에 저장한다. kernel stack의 역할은 여러 프로세스가 커널 함수를 호출하는 경우 (time-sharing), 프로세스별로 커널 함수 실행 정보를 저장하여 프로세스간 실행 정보가 꼬이지 않게 하기 위함이다.

프로세스 상태 (process status)

  • Running
    • CPU가 프로세스의 명령어(instruction)을 수행 중인 상태
  • Ready
    • 프로세스가 메모리에 올라와있지만(=in memory), 아직 CPU 처리를 기다리는 상태
  • Blocked (=Wait, Sleep)
    • 프로세스가 I/O 작업 완료를 기다리거나 프로세스가 메모리에 올라와있지 않은 상태
  • Suspended (=Stopped)
    • 외부적인 이유 (1. swapper가 메모리에서 프로세스를 내림 2. 사용자가 프로세스 실행을 멈춤 ex. Ctrl+C)로 프로세스의 수행이 정지된 상태. 프로세스가 디스크에 통째로 swap-out 됨.
  • New
    • 프로세스가 새로 생성중인 상태
  • Terminated
    • 프로세스가 종료중인 상태

time-sharing
time-sharing이란 multiprogramming 또는 multitasking의 실행 방식 중 하나로, CPU가 ready 상태의 프로세스들을 번갈아가며 수행하는 방식을 의미.

PCB (Process Code Block)

: 운영체제는 여러 프로세스를 관리(관리의 예시로는 CPU와 같은 자원의 분배)하기 위해 프로세스별로 PCB 구조체를 유지한다. 프로세스별 PCB는 커널 주소공간 중 data에 저장된다.

  1. OS가 프로세스 관리를 위해 필요한 정보
    • 프로세스 상태 (process state)
    • 프로세스 ID (pid)
    • CPU 스케줄링 정보 및 우선 순위 (scheduling information and priority)
  2. 하드웨어 문맥 = CPU 수행 정보
    • program counter : CPU가 프로세스의 코드를 어디까지 처리했는지
    • register : 프로세스의 결과값
  3. 메모리 관련
    • code, data, stack의 위치 정보
  4. 파일 관련
    • open file descriptors

문맥 교환 (Context Switch)

: CPU가 처리 중인 프로세스가 다른 프로세스로 바뀌는 상황. 즉 현재 실행중이던 프로세스가 프로세스A라고 한다면 프로세스A의 상태가 running에서 ready로 변하고 다른 프로세스인 프로세스B의 상태가 ready에서 running으로 바뀔 때 문맥 교환이 일어났다고 한다.

  • 문맥 교환 시 오버 헤드 발생: Cache Memory Flush
    • 프로세스의 timer가 종료되거나 I/O 요청이 필요한 경우 시스템 콜이 발생하게 되는데 이 때 문맥 교환이 일어난다. 이 때, 커널은 프로세스의 CPU 수행 정보를 PCB에 저장하는데, 문맥 교환이 일어나면 다른 프로세의 PCB를 캐시 메모리에 올려야하기 때문에 캐시 메모리를 초기화하는 cache memory flush가 일어나 오버 헤드가 발생한다.
  • 주의
    • 프로세스A의 시스템 콜로 CPU 제어권이 프로세스A에서 커널로 넘어갔다가 다시 프로세스A로 돌아오는 경우는 문맥 교환이 일어나지 않는다. 이 경우에는 프로그램A의 PCB이 캐싱되어있기 때문에 커널 모드에서 유저 모드로 전환하는 과정에서 오버헤드가 발생하지 않기 때문이다.

스케줄러 (Scheduler)

  • CPU scheduler (short-term scheduler)
    • 어떤 프로세스를 running할지 결정
    • millisecond 단위로 빨라야 함
  • Swapper (medium-term scheduler)
    • 메모리에서 어떤 프로세스를 뺄 지 결정
    • degree of multiprogramming을 결정 (즉, time-sharing할 프로세스를 결정)

스레드(Thread)란?

스레드 정의

스레드는 프로세스 내부의 CPU 수행 단위다.

img

스레드 구성

  1. 스레드가 독립적으로 갖는 자원 : CPU 수행과 관련된 자원
    • program counter
    • register set
    • stack space
  2. 스레드간 공유하는 자원 : 하나의 task를 수행하는데 필요한 자원
    • data
    • code
    • os resources

스레드 장점

  1. 빠른 응답 속도
  2. 자원의 효율적인 사용 (커뮤니케이션 비용 낮춤)
  3. 빠른 생성 및 수행 속도
  4. 멀티 코어 (여러 CPU를 사용) 환경에서 병렬 처리 가능

스레드 단점

  1. 하나의 스레드의 문제가 다른 스레드에 영향을 미칠 수 있음

단일 스레드 (single thread) VS 다중 스레드 (multi thread) 구조

img

스레드 구현 (thread implementation)

  1. Kernel thread
    • 커널이 스레드의 존재를 알아 스레드 스케줄링을 직접 한다.
  2. User thread

Additional

파이썬 멀티 프로세싱 패키지 (Python Multi-processing)

Python은 GIL(Global Interpretor Lock)때문에 멀티 코어를 사용하지 못한다. 파이썬 환경에서 프로세스를 다중 CPU에 나눠 병렬로 처리하고 싶을 땐, Python multi-processing library를 사용해 프로세스를 병렬 처리할 수 있다.

Reference

  1. whats-the-diff-programs-processes-and-threads