[OS] 3. 프로세스와 스레드

CYS·2024년 1월 4일

운영체제(OS)

목록 보기
3/3

프로세스

프로그램(program)과 프로세스(process)

  • 프로그램
    - 파일 시스템에 파일 형태로 존재하는 실행 파일
  • 프로세스
    - CPU와 메모리를 사용하여 실행 중인 프로그램
    - OS에서 하나의 작업(job) 단위로써 태스크(task)라고도 함
    - Process = job = task
    - 각 프로세스가 생성될 때 프로세스를 제어하는데 필요한 정보인 PCB(process control block)가 생성됨

프로세스 상태

  • new (생성)

    • 프로그램이 메모리에 올라와 프로세스가 생성되는 상태
    • PCB가 생성됨
  • ready (준비)

    • 준비 큐(queue)에서 프로세스가 CPU를 할당 받기위해 기다리는 실행 준비 상태
  • running (실행)

    • 프로세스가 CPU를 사용하여 실행 중인 상태
    • 문맥 교환이 이뤄짐
      예) 시분할 시스템에서 프로세스에게 할당된 CPU 사용시간(time slice)이 완료(timeout, interrupt의 일종)되면 실행이 다 끝나지 않아도 프로세스는 준비 상태로 되고 다음에 실행 상태가 될 차례를 기다림 -> 준비 상태에 있는 다른 프로세스가 실행 상태로 바뀌어 작업을 수행함
  • terminated (완료)

    • 프로세스의 실행이 완료된 상태
    • PCB가 삭제됨
  • waiting (대기)

    • 실행 중인 프로세스가 데이터 I/O를 처리해야 하는 경우, I/O controller를 사용하여 I/O가 완료될 때까지 대기하는 상태
      - CPU는 실행 중인 프로세스에서 I/O를 처리해야 하는 경우 직접 I/O를 처리하지 않고 I/O controller에게 요청한 다음 다른 프로세스를 처리함
      -> I/O를 처리해야 하는 프로세스는 I/O controller의 I/O 처리가 완료될 때까지 대기해야함
      -> I/O 처리가 완료되면 해당 프로세스는 준비 상태가 되고 다음에 실행 상태가 될 차례를 기다림


프로세스 상태 전이

  • admitted (승인)

    • 새롭게 생성된 프로세스들이 승인 받아 준비 상태에 이르는 과정
  • scheduler dispatch (스케줄러 디스패치)

    • CPU 스케줄러에 의해 준비 상태의 준비 큐(queue)에서 프로세스 중 하나를 선택하여 실행시키는 것
  • interrupt (인터럽트)

    • 예외, 입출력, 이벤트 등이 발생하여 현재 실행 중인 프로세스를 준비 상태로 바꾸고, 발생한 작업을 먼저 처리하는 것
  • I/O wait (입출력 대기)

    • 실행 중인 프로세스가 입출력을 처리해야 하는 경우, 입출력 처리가 모두 끝날 때까지 대기 상태로 만드는 것
  • I/O completion (입출력 완료)

    • 입출력이 끝난 프로세스를 준비 상태로 전환하여 스케줄러에 의해 선택될 수 있도록 만드는 것

PCB (process control block)

  • PCB
    • OS가 프로세스를 제어하는데 필요한 정보를 담고 있음
    • 프로세스가 생성될 때 메모리의 OS영역에 생성됨
    • 프로세스 상태 전이문맥 교환(context switch)을 위해 사용됨

  • PCB의 구조
  • Pointer

    • 준비상태(ready state)의 준비 큐(ready queue)와 대기상태(waiting state)의 대기 큐(waiting queue)내에서 다음 프로세스의 PCB를 가리키는 포인터로 사용됨
  • Process state

    • 프로세스 상태인 생성(new), 준비(ready), 실행(running), 대기(waiting), 종료(terminated)를 나타냄
  • Process number (PID)

    • OS 내에서 여러 프로세스를 구분하기 위해 사용됨


PCB (문맥 교환을 위해 레지스터 값 백업)

  • Program counter (PC)

    • 다음에 실행될 명령어의 주소 또는 코드의 행 번호가 저장됨
  • Registers

    • 프로세스가 실행되는 중에 사용하던 register 값이 저장됨
    • 예 (시분할 시스템에서 문맥 교환 시)
      - 시분할 시스템에서 각 프로세스는 프로세스에게 할당된 CPU 사용시간(time slice 또는 time quantum) 동안 작업을 마치짖 못하면 다른 프로세스에게 CPU를 넘겨줌
      - 이때, 프로세스 A가 103번 행까지 작업한 후 다른 프로세스에게 CPU를 넘겨준 다음 시간이 흘러 다시 프로세스 A의 차례가 되면 104번 행부터 작업을 시작해야 한다.
      - 이를 위해, 프로세스 A가 실행상태에서 준비상태로 전환될 때 프로세스 A의 PCB내에 다음과 같이 저장됨
      -> PC에는 다음에 실행될 코드의 행 번호 (104번 행)가 저장됨
      -> Register 정보에는 프로세스가 실행되는 중에 사용하던 register 값이 저장됨
  • Memory management information

    • 프로세스의 메모리 시작 주소를 저장하고 있는 경계 레지스터(boundary register) 값과 프로세스가 차지하고 있는 메모리의 크기를 저장하고 있는 한계 레지스터(limit register) 값이 저장됨

PCB

  • CPU scheduling information

    • 프로세스 우선순위(process priority) 정보가 저장됨
    • 준비 큐와 대기 큐에서 높은 우선순위의 프로세스가 낮은 우선순위의 프로세스보다 먼저 실행됨
  • I/O status information

    • 프로세스를 실행하기 위해 사용된 입출력 장치이나 파일에 대한 정보가 저장됨 (예: file list)
  • Accounting information

    • 프로세스 실행을 완료하기 위해 사용된 총 CPU 시간이 시간의 한도가 저장됨
  • PPID & CPID

    • 부모 프로세스(parent process)의 PID(PPID)와 자식 프로세스(child process)의 PID(CPID)가 저장됨

문맥 교환(context switch)

  • 문맥 교환
    • Timeout 또는 인터럽트에 의해 CPU에서 현재 실행 중인 프로세스를 다른 프로세스로 전환하는 과정
    • Context: CPU가 프로세스를 실행하기 위해 필요한 정보로써 CPU의 register에 저장
    • 프로세스의 PCB를 통해 CPU의 register를 다시 설정함(context switch)
      - 예: 프로세스 P1과 P2의 문맥 교환
      -> Timeout 또는 인터럽트에 의해 실행상태에 있는 P1의 register 값은 P1의 PCB에 저장되고 P1은 준비상태가 됨
      -> 준비상태에 있는 P2의 PCB에 저장된 register 값을 register로 읽어와서 P2은 실행 상태가 됨


프로세스의 메모리 구조

  • 프로세스의 메모리 구조
    • 프로세스가 생성될 때
      - 메모리의 OS 영역: PCB가 할당 됨
      - 메모리의 사용자 영역: 코드 영역, 데이터 영역, 힙 영역, 스택 영역이 할당됨
    • 코드 영역
      - 디스크에서 읽어온 실행하려는 빌드된 프로그램이 저장됨
    • 데이터 영역
      - 전역(global) 변수 또는 정적(static) 변수가 저장됨
    • 스택(stack) 영역
      - 지역(local) 변수가 저장됨
      - 변수는 범위 밖으로 이동하면 스택에 할당된 변수는 소멸됨
    • 힙(heap) 영역
      - 프로세스 실행 중에 동적으로 메모리를 할당 및 해제하기 위해 사용됨
      - malloc() 과 free() 함수를 사용하여 동적으로 메모리를 할당하고 해제


프로세스 복사

  • fork()
    • 프로세스를 복사하는 함수
    • 실행 중인 프로세스는 부모 프로세스가 되고 이 프로세스를 복사한 것은 자식 프로세스가 됨
      - 부모 프로세스와 자식 프로세스의 코드, 데이터, 힙, 스택 영역은 모두 같음
      - 부모 프로세스와 자식 프로세스의 PCB는 아래의 정보만 다르고 모두 같음
      -> PID, PPID, CPID
      -> 메모리 관련 정보(자식 프로세스는 메모리에서 부모 프로세스와 다른 위치에 생성되기 때문임)

프로세스 전환

  • exec()
    • 프로세스에서 프로그램(실행파일, 유틸리티, 명령어)을 실행하도록 하는 함수
      - 프로세스에서 PCB는 변경되지 않고 프로그램을 실행시키기 위해 코드, 데이터, 힙, 스택영역이 변경됨


좀비 프로세스

  • 자식 프로세스의 실행이 완료되면 자식 프로세스가 사용한 자원을 부모 프로세스가 회수함
  • 그러나, 아래의 경우 부모 프로세스는 자식 프로세스의 자원을 회수하지 못함
    - 자식 프로세스보다 부모 프로세스가 먼저 종료된 경우
    - 자식 프로세스가 비정상적으로 종료된 경우
  • 이러한 경우, 자식 프로세스는 종료되었으나 프로세스에 대한 자원이 사라지지 않고 남아있는 좀비 프로세스(zombie process 또는 defunct process)가 됨
  • 부모 프로세스가 먼저 종료된 경우 발생하므로 고아 프로세스(orphan process)라고도 함
  • 좀비 프로세스는 kill 명령어를 이용하여 종료시켜야 함



스레드

  • 스레드(thread)
    • 프로세스 내에서 실행되는 흐름의 단위
      - 프로세스에서 실질적인 작업 실행은 스레드에 의해 이뤄짐
    • 한 프로세스 내의 메모리를 공유함
    • 싱글 스레드(single thread): 한 프로세스에서 하나의 스레드를 가지고 실행하는 방식
    • 멀티 스레드(multithread): 한 프로세스에서 둘 이상의 스레드를 동시에 실행하는 방식


TCB (thread control block)

  • TCB는 다음과 같은 구조체의 형태로 되어 있음

  • Pointer

    • 준비상태(ready state)의 준비 큐(ready queue)와 대기상태(waiting state)의 대기 큐(waiting queue)내에서 다음 프로세의 TCB를 가리키는 포인터로 사용됨
  • Thread state

    • 생성(new), 준비(ready), 실행(running), 대기(waiting), 종료(terminated) 상태
  • Thread number (TID)

    • 프로세스 내의 여러 스레드를 구분하기 위해 사용됨
  • Program counter (PC)

    • 다음에 실행될 명령어의 주소 또는 코드의 행 번호가 저장됨
  • Register

    • 스레드가 실행되는 중에 사용하던 register 값이 저장됨

멀티 스레드

  • 멀티 코어 CPU에서 스레드를 이용한 프로그램
    • 싱글 스레드를 이용한 순차 프로그램
      - 하나의 코어에서 하나의 스레드를 통해 실행됨
      - 2개의 코어를 가진 CPU에서 ½의 자원만 사용하는 것이고 4개의 코어를 가진 CPU에서 ¼의 자원만 사용하는 것
    • 멀티 스레드를 이용한 병렬 프로그램
      - 2개의 코어를 가진 CPU에서 2개의 스레드를 생성하면 병렬 구간의 데이터 처리량은 2배로 증가하여 처리시간은 ½로 감소할 수 있음
      - 4개의 코어를 가진 CPU에서 4개의 스레드를 생성하면 병렬 구간의 데이터 처리량은 4배로 증가하여 처리시간은 ¼로 감소할 수 있음


멀티 프로세스와 멀티 스레드

  • 멀티 프로세스(multiprocess)와 멀티 스레드(multithread)
    • 공통점: 양쪽 모두 한 프로그램이 여러 흐름으로 동시에 실행됨
    • 차이점
      - 멀티 프로세스
      -> 각 프로세스는 독립적으로 실행되며 각각 별개의 메모리를 차지하고 있음
      -> Distributed-memory 방식
      -> 구현방법: MPI를 이용한 병렬 프로그래밍
      - 멀티 스레드
      -> 각 스레드는 독립적으로 실행되지만 한 프로세스 내의 메모리를 공유함
      (공유 변수를 여러 스레드가 동시에 참조하거나 쓰기를 실행하기 때문에 문제가 발생할 수 있음)
      -> Shared-memory 방식
      -> 구현방법: 윈도우의 CreateThread, 리눅스의 pthread, OpenMP를 이용한 병렬 프로그래밍

profile
Android Developer

0개의 댓글