[운영체제] 4장: Threads

CoCoral·2023년 10월 23일
0

운영체제

목록 보기
4/11
  • 하나의 프로그램이 여러 프로세스를 가질 수 있다.
  • 하나의 프로세스로 여러 프로그램을 실행할 수 있다.
  • 프로그램과 프로세스는 일대일 관계가 아니다.
    • 1:1, 1:M, M:1, M:N 모두 가능
  • 실행 속도: Multiprocess < Multithread
  • Thread는 프로세스 하나에 포함된 것이다.

Process and Threads

  • Unit of Scheduling/Execution
  • Unit of Resource Ownership
  • 위 2가지 특성은 OS 에 의해 독립적으로 처리된다.
  • Thread -> Dispatching 의 단위
  • Process -> 자원 할당의 단위
    • Thread는 프로세스의 자원을 공유하여 사용할 수 있다.

Multithread Environment

  • Process
    • 자원 할당과 Protection 의 단위
    • 프로세스 이미지가 저장되는 가상 주소 공간
    • Protected access to processors, other processes, files, and I/O resources
  • Thread
    • 실행의 단위로, 실행 상태를 가지고 있다.
    • Running 상태가 아닐 때 Thread context 를 저장한다.
    • Thread마다 실행되는 함수가 다르므로 각 Thread 마다 실행 스택을 가지고 관리한다.
    • 지역 변수에 대한 정적 저장 공간을 별도로 관리한다.
    • Thread가 포함된 프로세스의 메모리와 자원을 다른 Thread와 공유한다.

Multithreaded Process Model

  • TCB + PCB = PCB
    • PCB: Process Identification + Process Control Information 의 자원 관련 정보
    • TCB: Processor State Information + Process Control Information 의 실행 관련 정보

  • Benefits of Threads
    • 새로운 프로세스를 생성하는 것보다 새로운 Thread를 생성하는 것이 시간이 적게 걸린다.
    • 프로세스보다 Thread를 종료하는 것이 시간이 적게 걸린다.
    • 동일 프로세스 내에서 Thread switching을 하는 데에 시간이 짧게 걸린다.
    • 동일 프로세스 내의 Thread 들이 서로 데이터를 공유하기 때문에, OS 의 개입 없이 통신이 가능하다.
  • Thread State
    • Spawn: 새로운 Thread 생성
    • Ready
    • Running
    • Blocked
    • Finish
  • 동일한 프로세스 내의 모든 Thread 들은 같은 주소 공간을 공유하기 때문에 Suspend 는 프로세스 단위의 상태이다.
  • 프로세스가 종료되면 모든 Thread 도 종료된다.
  • Suspend 종류에 따라 Thread 전체(프로세스)가 Suspend 될 수 있고, Thread 하나만 Suspend 될 수 있다.
  • User-level threads
    • User Space 의 Threads Library 를 통해 Thread 관련한 모든 작업이 가능하다.
    • Thread switching 에 커널 모드가 불필요하다.
    • User-level 에서는 여러 개의 Thread 가 실행되고 있지만 커널 입장에서는 하나의 프로세스가 실행된다고 인식한다.
    • 어떤 OS 에서든지 실행될 수 있다.
    • 사용자 수준에서 스케줄링 제어가 가능하다.

  • Kernel-level threads
    • 커널에 의해 모든 Thread 관리 작업이 처리된다.
    • 커널이 같은 프로세스 내의 Thread 들을 여러 프로세서에게 동시에 스케줄링시키는 것이 가능하다.
    • 한 Thread 가 Blocked 되어도 다른 Thread 는 스케줄링 될 수 있다.
    • Thread 간의 switching 도 커널에 의해 수행되어 User-level 보다 cost 가 크다.
    • OS 자체가 Multithread 로 동작할 수 있다.

  • Combined Approaches for Threads
    • User-level 에서 몇 개의 Thread 를 생성하는지에 상관 없이 실제로 동시에 실행시키는 Thread 들만 Kernel-level Thread 로 매핑한다.
    • 필요한 만큼의 Kernel-level Thread 를 유지하고 불필요한 User-level Thread 생성을 방지한다.


Windows: Kernel-level Thread

  • Process and Thread
    • 프로세스와 Thread 가 오브젝트로 구현된다.
    • 프로세스는 새로운 프로세스나 기존의 프로세스를 복사한 형태로 생성될 수 있다.
    • 모든 프로세스는 하나 이상의 Thread 를 포함하고 Thread 가 다른 Thread 를 생성할 수 있다.
    • Thread 는 dispatching 의 단위이다.
    • 프로세스와 Thread 모두 동기화 기능을 보유한다.
  • Process Attributes (major)
    • Base priority: 프로세스에 속한 Thread 의 최소 우선선위 값
    • Default processor affinity: Thread 가 실행될 수 있는 프로세서의 기본값
  • Thread Attributes (major)
    • Thread context: Thread 실행을 중단했을 때 저장할 레지스터 값들
    • Base priority: 프로세스의 Base priority 값을 상속 받는다.
    • Dynamic priority: 상황에 따른 우선순위 값
  • Thread States Diagram
    • Ready -> Standby -> Running
    • Running -> Ready: Timeout, 우선 순위 밀림
    • Waiting: Block, Suspend(Swapping X)
    • Waiting -> Ready: I/O 작업 종료, Resource Available
    • Waiting -> Transition: Resource Unavailable
      • Thread 가 포함된 프로세스가 swap out 되어 하드디스크에 존재할 때 transition 으로 상태가 전이된다.


Solaris: User-level Thread + Kernel-level Thread

  • Process and Thread
    • User thread 는 커널이 만든 Lightweight process 와 매핑된다.
    • Lightweight process 는 kernel thread 와 매핑되어 실행된다.
    • Lightweight process 와 매핑되지 않은 kernel thread 는 OS 작업을 수행한다.
  • State Diagram
    • IDLE: Lightweight process 와 매핑되지 않은 상태
    • RUN: Lightweight process 와 매핑된 후 Ready 상태
    • ONPROC: Running
    • SLEEP: Blocked
    • STOP: Thread suspend
    • ZOMBIE: 실행 종료 후 부모 프로세스에게 정보 전달 외에 모든 작업을 마친 상태
    • FREE: 종료
    • PINNED: interrupt 가 발생했을 때 실행 중이던 프로세스를 특정 프로세서에게 꽂아둔 상태
      • 불필요한 프로세스 switching 이나 캐싱을 안해도 된다.
      • 멀티 프로세서 시스템에서는 캐싱 중요!


Linux: Multithread?

  • Task
    • 프로세스와 Thread 를 서로 구분하지 않고 Task 로 통일한다. 프로세스 개념에 더 가깝다.
    • 상태, 스케줄링 정보, Identifier, IPC 등의 정보를 가진다.
  • Thread
    • Linux 는 Thread 와 프로세스 사이의 차이를 인식할 수 없다.
    • User-level Thread 는 Kernel-level 프로세스로 매핑된다.
    • 새로운 프로세스는 기존의 프로세스를 복사하여 생성된다. (= Task 생성)
    • 새로운 프로세스는 클론 명령으로 생성될 수 있는데, 이 방식으로 생성된 Task 는 모든 자원을 공유한다.
    • 클론 명령은 각 프로세스에게 개별적 스택과 PCB 를 제공한다.
  • State Diagram
    • Executing: Running
    • Stopped: Suspend
    • Zombie: Exit
    • Interruptible: 이벤트 발생 뿐만 아니라 시그널을 통해 Ready 로 전환 가능하다.
    • Uninterruptible: 이벤트에 의해서만 Ready 로 전환 가능하다.

profile
언젠간 iOS 개발자가 되겠지

0개의 댓글