[CS] 운영체제 03 : 프로세스와 스레드

AppleMango·2024년 5월 26일

자료 출처 : HPC Lab 운영체제 강의 + 구글링

프로세스란?

프로세스는 실행중인 프로그램이라고 정의할 수 있다.
맥에서 활성 상태 보기에 들어가면 이렇게 프로세스를 볼 수 있다.

프로그램 VS 프로세스

프로그램

  • 실행 할 프로그램 + 데이터
  • 컴퓨터 시스템에 실행 요청 전의 상태

프로세스

  • 실행을 위해 커널에 등록된 작업
  • 시스템 성능 향상을 위해 커널에 의해 관리됨

프로세스의 정의

  • 커널에 등록되고, 커널의 관리하에 있는 작업
  • 각종 자원들을 요청하고 할당 받을 수 있는 개체
  • 프로세스 제어 블록(PCB)를 할당 받은 개체
  • 능동적인 개체 -> 실행중에 각종 자원을 요구, 할당, 반납하며 진행

Process Control Block(PCB)

PCB는 프로세스 생성시 생성된다.
각 프로세스들에 대한 중요한 정보를 관리하며, 커널공간 내부에 존재한다.
운영 체제는 PCB를 통해 프로세스를 제어하고 스케줄링한다.

PCB가 관리하는 정보

참고 - PCB 정보는 OS마다 조금 다르다.

  • PID : 프로세스 고유 식별 번호
  • 스케줄링 정보 : 프로세스 우선순위 등의 정보
  • 프로세스 상태 : 자원할당, 요청 정보
  • 메모리 관리 정보 : Page Table, segment table...
  • 입출력 상태 정보 : 할당받은 입출력 장치, 파일 등에 대한 정보
  • Context save area : 프로세스의 레지스터 상태를 저장하는 공간 ...
  • 계정 정보 : 자원 사용 시간 등을 관리

프로세스의 종류

자원(Resource)

커널의 관리 하에 프로세스에게 할당/반납 되는 수동적 개체
H/W resource -> processor, memory, keyboard...
S/W resource -> Message, signal, files ...

프로세스의 상태

생성(Created State)

  • 작업을 커널에 등록
  • PCB 할당 및 프로세스 생성
  • 가용 메모리 공간 체크 및 프로세스 상태 전이
    즉 메모리가 있으면 준비(Ready), 없으면 지연 준비(Suspended Ready)

준비(Ready State)

프로세서 외에 다른 모든 자원을 할당 받은 상태

  • 프로세서 할당 대기 상태 (CPU만 있으면 바로 실행 가능)
  • 즉시 실행 가능 상태

    Dispatch

    준비 → 실행 : 우선순위가 높은 프로세스 선정하여 명령어 실행

실행(Running State)

프로세서와 필요한 자원을 모두 할당 받은 상태

Preemption(Time out)

실행 → 준비 : 클럭이 인터럽트를 발생시켜 제어권을 빼앗음(Preemption, 독점 방지)

Block / Sleep

실행 → 대기 : 프로세서가 입출력, 자원 등을 기다리기 위해 대기로 전환

Wake Up

대기 → 준비 : 입출력이 완료되거나 자원이 할당되어 다시 실행

지연 준비(Suspended Ready)

메모리를 할당 받지 못한(빼앗긴) 상태
커널 또는 사용자에 의해 발생

Swap-out(Suspended)

준비(대기) 상태에서 기억 장치를 반납하고 지연 준비(지연 대기) 상태로 전이

Swap-in(Resume)

지연 준비(지연 대기) 상태에서 기억 장치를 할당받아 준비(대기) 상태로 전이

종료(Terminated)

프로세스 수행이 끝난 상태
모든 자원 반납 후, 커널 내에 일부 PCB 정보만 남아있는 상태

  • 이후 프로세스 관리를 위해 정보를 수집

인터럽트

예상치 못한, 외부에서 발생한 이벤트

인터럽트의 종류

I/O interrupt
Clock interrupt
Console interrupt
Program Check interrupt
Machin check interrupt
...

인터럽트 처리 과정

  1. 인터럽트 발생
  2. 프로세스 중단
    이때 Context Saving 발생 (현재까지 수행중이었던 상태를 PCB에 저장)
  3. 인터럽트 처리
    3-1 Interrupt handling - 인터럽트의 발생 장소와 원인을 파악하고 인터럽트를 처리할 것인지, 무시할 것인지 결정
    3-2 Interrupt Service - 인터럽트 서비스 루틴을 호출하여 인터럽트를 처리
  4. 인터럽트 처리 완료
    이때 인터럽트 전에 실행중이던 프로세스가 다시 올라올 수도 있지만, Ready queue의 가장 앞에 있던 프로세스가 올라올 수도 있음

Context Switching (문맥 교환)

Context

프로세스와 관련된 정보들의 집합

Context Saving

현재 프로세스의 레지스터 Context를 저장하는 작업

Context restoring

레지스터 Context를 프로세스로 복구하는 작업

두 작업을 합치면 Context Switching이 된다.
즉 실행중인 프로세스의 Context를 저장하고,
앞으로 실행 할 프로세스의 Context를 복구하는 일

이러한 Context Switching은 자주 발생하기 때문에
OS의 성능에 큰 영향을 준다.
따라서 불필요한 Context Switching을 줄이는 것이 중요하다.
이때 스레드를 사용해 줄일 수 있다.


스레드(Thread)

프로세스가 할당받은 자원을 이용하는 실행흐름의 단위

프로세스는 자원과 제어를 모두 독립적으로 가지고,
스레드는 자원을 같은 프로세스 내의 다른 스레드와 공유하지만 제어는 독립적으로 가진다.

스레드는 Single-thread와 Multi-threads가 있는데 아래의 그림은 멀티스레드..

스레드의 장점

  1. 사용자 응답성 : 일부 스레드의 처리가 지연되어도,
    다른 스레드의 작업은 계속 처리 가능

  2. 자원공유 : 자원을 공유해서 효율성 증가 (커널의 개입을 피할 수 있음)

  3. 경제성 : 프로세스의 생성, Context Switch에 비해 효율적

  4. 멀티 프로세서 활용 : 병렬처리를 통한 성능 향상

스레드 사용의 예시

식당(프로세스)을 운영하는데 직원(스레드)이 여러명 존재
직원1 -> 주방에서 요리
직원2 -> 서빙
직원3 -> 계산

만약에 직원(스레드)가 하나뿐이라면..
모든 업무를 혼자서 수행해야하기에 매우 비효율적이다.

스레드의 구현

스레드에는 User Thread와 Kernel Thread가 있다.

User Thread

사용자 영역의 스레드 라이브러리로 구현된다.
스레드의 생성, 스케줄링 ...

커널은 스레드의 존재를 모른다.
즉 커널의 개입을 받지 않기 떄문에 생성과 관리의 부하가 적고 유연한 관리가 가능하다. 또한 이식성이 높다

Kernel Thread

커널이 각 스레드를 개별적으로 관리하기 때문에 프로세스 내 스레드들이 병행 수행 가능하다.

OS가 직접 관리, 커널 영역에서 스레드의 생성/관리를 수행하기 때문에 오버헤드가 크다.

Multi-Threading Model

다대일(n:1) 모델 - 사용자 수준 스레드
일대일(1:1) 모델 - 커널 수준 스레드
다대다(n:m) 모델 - 혼합형 스레드

혼합형 스레드

n개의 사용자 수준 스레드 - m개의 커널 스레드(n>m)
사용자는 원하는 수만큼 스레드를 사용할 수 있다.
커널 스레드는 자신에게 할당된 하나의 사용자 스레드가 block 상태가 되어도, 다른 스레드 수행 가능

profile
iOS Developer

0개의 댓글