본문 바로가기
카테고리 없음

[운영체제] #8. Thread

by whiteTommy 2024. 11. 26.
반응형
더보기

목차

  • Review of Process
  • Thread 란 무엇인가?
    • Thread 와 CPU Utilization
    • Process 와 Theads
    • Thread 의 구성요소
  • Single-Thread 와 Multi-Threaded Process
  • Multicore Programming
  • User and Kernel Threads
  • Thread 로 인한 OS 의 변화
  • Thread Issues
    • Creation
    • Cancellation
    • Thread Pools
    • Thread 간 IPC

 

Review of Process

  • Process 정의
    • 실행 단위(Execution Unit)이며, 스케줄링 단위로 사용됨.
    • Protection Domain: 프로세스가 소유하고 있는 자원을 보호.
  • Program과 Process의 관계
    • 프로그램은 단순히 실행 코드이며, 프로세스는 실행 중인 프로그램.
    • 지금까지의 프로세스는 단일 실행 흐름(single thread of control)을 가짐.
    • "여러 실행 흐름을 가지면 어떻게 될까?" → 스레드(Thread)의 등장.

 

Thread 란 무엇인가?

  • Thread의 정의:
    • 실행 단위(Execution Unit).
    • 프로세스 내부의 실행 흐름을 더 세밀하게 나눈 것.
    • 프로세스보다 가벼운 단위(Finer Grain).
    • Process 가 제공한 Protection Domain 은 없음
  • 동기
    • 하나의 프로세스에는 하나의 제어(Control)만 존재 → 한 번에 하나의 일만 처리.
    • Process 에서 할 작업을 여러 개로 나눈 후에 각각을 Thread 화 한다면, 병렬적으로 작업을 완수할 수 있음
    • Cooperative Process 와의 차이점
      • 여러 개의 프로세스가 협력하여 작업 수행.
      • 하지만 IPC와 Context Switching 비용이 큼.
    • Thread:
      • 프로세스 내부에서 여러 실행 흐름 생성 가능.
      • Thread 간의 협력을 통해 비용 절감.

 

Thread 와 CPU Utilization

 

  • Thread 수와 Throughput(처리량):
    • Thread가 많을수록 CPU Utilization(활용률)이 증가.
    • 하지만 일정 한계 이후에는 성능이 감소 → Thread Switching 비용 증가 때문.
      (thread가 CPU 사용량을 넘어섰다.)
  • CPU 활용도 증가:
    • 멀티 프로세서 환경에서 Thread를 활용하면 CPU 활용도가 높아짐.
    • Multi-processing:
      • 여러 프로세스가 병렬로 실행됨.
    • Multi-threading:
      • 하나의 프로세스 내에서 여러 Thread가 병렬로 실행됨.

 

Process 와 Threads

  • Process:
    • 각각 독립된 실행 흐름을 가짐.
    • thread 는 process 가 가진 자원을 공유한다.
    • 메모리와 자원을 독립적으로 사용.
    • Switch 비용이 높음: 프로세스 간 전환(Context Switching)은 상대적으로 비용이 큼.
  • Thread:
    • 하나의 프로세스 내에서 여러 개의 실행 흐름.
    • 프로세스의 코드(Code), 데이터(Data)를 공유.
    • Switch 비용이 낮음: 동일 메모리 공간을 공유하므로 전환 비용이 적음.

 

Thread 의 구성 요소

 

  • Thread 는 하나의 실행 흐름이므로 이와 관련된 자료 구조가 필요
    • Thread의 필요 구성 요소 (다르다)
      • Thread ID: Thread를 식별하는 고유 ID.
      • Program Counter: 실행 중인 명령어의 주소.
      • Register Set: CPU 레지스터 값.
      • Stack: 각 Thread마다 고유한 스택을 가짐.
  • 동일한 Process 내에 다른 Thread 와 공유하는 것 (같다)
    • Code: 동일 프로그램의 코드 섹션.
    • Data: 동일 프로세스의 데이터 섹션.
    • File: 동일 프로세스의 열린 파일(Open File).

 

Single-Thread 와 Multi-Threaded Process

  • Single-Threaded Process:
    • 하나의 실행 흐름.
    • 코드, 데이터, 파일, 레지스터 등을 독립적으로 소유.
  • Multi-Threaded Process:
    • 여러 실행 흐름(Thread)을 포함.
    • 공유 자원: 코드, 데이터, 파일.
    • 고유 자원: 각각의 레지스터, 스택, 프로그램 카운터, ID

 

Multi-Threaded Program 의 장점

  • Responsiveness
    • 일부 작업이 블록(Block)되어도 다른 스레드가 계속 실행되므로 프로그램의 **인터렉티브 성능(Interactive Performance)이 유지.
  • Resource Sharing
    • 동일 프로세스 내 스레드들은 프로세스 자원을 공유(Code, Data, Files).
  • Economy
    • 새로운 프로세스를 생성하는 것보다 스레드 생성 비용이 훨씬 낮음.
    • 스레드는 프로세스 메모리를 공유하기 때문에 메모리 소모도 적음.
  • Scalability
    • 여러 Thread 가 각기 다른 processor 에서 병렬로 실행 가능
    • 멀티 코어 CPU 와 잘 맞는 구조

 

Multicore Programming

  • 최근 Processor 동향은 하나의 Chip 에 여러 개의 Computing Core 를 탑재 (Multicore Processor)
    • 각 코어(Core)가 독립적으로 작업을 수행.
    • 스레드가 여러 코어에 분산되어 병렬 실행 가능.
  • MultiThread Programming 은 Multicore 시스템에서도 효율적임
    • Multicore Processor 는 OS 에서 각각의 core 를 하나의 processor 로 인식하고 scheduling
    • 각각의 thread 에 Core 를 할당하여 실행 가능
    • Multiple Processor 가 달린 Multicore 는 Cache 를 공유하기 때문에 Data, Code 등 Process의 자원을 공유하는 Multithreaded Programming 에 보다 효율적임

 

User and Kernel Threads 

Thread 를 지원하는 주체에 따라 2가지로 나뉜다.

 

1. User Thread

 

  • 정의:
    • 커널 지원 없이 유저 공간에서 관리되는 스레드.
    • 일반적으로 사용자 수준 라이브러리를 통해 생성, 관리. Scheduling 과 관련된 관리.
  • 장점:
    • 동일한 Memory 영역에서 Thread 가 생성되므로 빠르다.
    • Thread 관리가 커널과 독립적으로 이루어짐.
  • 단점:
    • 단일 커널 스레드에 종속:
      • 특정 User Thread가 System Call을 호출하거나 Block 상태에 들어가면  같은 프로세스 내 모든 스레드가 멈춤. (Kernel 은 여러 User Thread 들을 하나의 Process 로 간주하기 때문)
    • 멀티프로세서 활용이 어려움.

 

2. Kernel Thread

 

  • 정의:
    • 커널이 직접 생성, 관리하는 스레드.
    • 커널이 스케줄링, 자원 관리, 블록킹 등을 처리.
  • 장점:
    • 한 스레드가 Block되어도 다른 스레드는 계속 실행 가능. (Thread Blocking 이 없음)
    • 멀티프로세서 환경에서 병렬 처리 가능.
  • 단점:
    • 생성 및 관리 비용이 높음(커널 호출 필요).

 

 

Mapping of User & Kernel Thread 

1. Many-to-One

 

  • 정의:
    • 여러 User Threads가 하나의 Kernel Thread에 매핑.
    • 스레드 관리가 유저 레벨에서 이루어짐.
  • 특징:
    • 장점:
      • 관리가 간단하며 유저 스페이스에서 스레드를 제어.
    • 단점:
      • 동시성 지원이 어려움
        • 하나의 커널 스레드만 실행 가능하므로 여러 코어 활용 불가.
        • 하나의 User Thread가 Block되면 모든 스레드가 멈춤.
  • 사용 제한:
    • Many-to-One은 Kernel Thread를 지원하지 않는 시스템에서 사용.
    • 현대 시스템에서는 사용 빈도가 낮음.

 

 

2. One-to-One

 

  • 정의
    • 각 User Thread가 하나의 Kernel Thread와 매핑.
    • User Thread가 생성되면, 대응되는 Kernel Thread가 생성됨.
  • 특징
    • 동시성 문제 해결
      • 하나의 User Thread가 Block되어도 다른 Thread는 별도의 Kernel Thread를 통해 계속 실행 가능.
      • 병렬 실행을 위해 멀티코어(Multiprocessor) 활용 가능
      1.  
    • 장점
      • System Call 호출 문제 해결:
        • Many-to-One 모델에서 발생했던 문제(하나의 Thread가 Block되면 전체가 멈추는 문제)가 해결됨
    • 단점
      • Kernel Thread 생성 비용
        • Kernel Thread의 수는 User Thread의 수와 동일하므로, 많은 User Thread를 생성하면 커널 자원을 많이 사용.
      • 제한된 자원
        • 운영체제에서 생성할 수 있는 Kernel Thread의 개수는 시스템 자원에 의해 제한.
  •  

 

3. Many-to-Many

 

  • 정의
    • 여러 User Thread를 여러 Kernel Thread에 매핑.
    • User Thread와 Kernel Thread의 수는 반드시 동일하지 않음.
    • User Thread는 필요에 따라 Kernel Thread와 연결되며, 스케줄링에 의해 관리됨.
  • 특징
    • 동시성 및 유연성:
      • Kernel Thread의 수가 제한되어 있어도, User Thread는 상대적으로 더 많은 수를 생성 가능.
      • 동시 실행 및 System Call 처리 중에도 다른 Thread 실행 가능.
    • 장점:
      • Thread 수에 대해 고민할 필요가 없음
      • Block 되는 현상에 대해 걱정할 필요가 없음
    • 단점:
      • User Thread와 Kernel Thread 간의 매핑을 조정하는 스케줄링 로직이 필요.

 

 

Thread 로 인한 운영체제의 변화

  • Process 기반에서 Thread 기반으로 변화
    • 기존 Process 중심의 운영체제에서 Thread 중심의 운영체제로 전환:
      • System Call 및 스케줄링이 Process 단위에서 Thread 단위로 변경.
    • Thread 기반 시스템에서 고려해야 할 사항:
      • Thread의 생성 및 종료:
        • fork(), exec()와 같은 System Call은 Thread의 구조를 반영해 구현.
      • 종료 처리:
        • Multi-threaded 프로세스에서 함께 일하는 Thread 의 종료는 Process 보다 복잡해짐
  • Multi-Threaded Programming 에 대한 지원
    • 운영체제는 Multi-Threaded 프로그래밍을 지원하기 위해 다음 기능을 제공:
      1. Thread Scheduling:
        • 여러 Thread를 효율적으로 스케줄링하여 CPU 자원을 분배.
      2. Thread 간 동기화 방법:
        • Mutex, Semaphore와 같은 동기화 기법 제공.
      3. 메모리 공간의 분할:
        • 스택, Thread-specific 데이터 등을 각 Thread에 할당.

 

Thread Issues

1. Creation

 

Multithreaded Program 에서 fork 와 exec 의 의미가 달라져야 함

  • fork
    • 하나의 Program 내의 Thread 가 fork 를 호출하면, 모든 Thread 를 가지고 있는 Process 를 만들 것인지, 아니면 fork 를 요청한 thread 만 복사한 Process 를 만들 것인지 문제
      • 리눅스에서는 2가지 버전의 fork 를 만들어 각각의 경우를 처리하도록 한다.
  • exec
    • fork 를 하여 모든 Thread 를 복사한 경우 exec 를 수행하면 모든 Thread 들은 새로운 Program 으로 교체가 됨
      • 교체될 Thread 들의 복사는 불필요한 작업
    • fork 를 하고 exec 를 할 경우 fork 를 요청한 Thread 만이 복사되는 것이 더 바람직함
    • 그러나 fork 를 하고 exec 를 수행하지 않은 경우에는 모든 Thread 의 복사가 필요하기도 함

 

Process Creation in Memory View

 

  • 프로세스 생성 시 메모리 구조 변화:
    • Parent Process:
      • 부모 프로세스는 실행 중인 프로그램을 포함.
    • Child Process:
      • fork() 호출로 생성된 자식 프로세스는 부모 프로세스의 메모리를 복사.
      • 메모리 복사는 **텍스트(Text)**와 데이터(Data) 섹션 포함.
  • Unix 방식:
    • fork():
      • 부모 프로세스의 메모리를 복사하여 자식 프로세스를 생성.
    • exec():
      • 기존 메모리를 새 프로그램으로 대체

 

2. Cancellation

  • 정의:
    • 특정 스레드 작업이 완료되기 전에 외부 요청으로 강제 중지.
    • 하나의 스레드를 중지시키는 명령이 다른 스레드의 자원을 잠글 수 있음.
  • 문제점
    • 자원 잠금:
      • 스레드가 자원을 사용하는 동안 중지되면, 다른 스레드가 동일 자원을 사용할 수 없음.
        ex) 웹 브라우저에서 Image 를 읽어 오는 과정에 사용자가 Stop 버튼을 눌러 취소할 경우, Image 를 읽어오는 Thread 역시 중지가 되어야 함
    • System Call에 의한 중지 문제:
      • 시스템 호출 도중 스레드가 중지되면, 할당된 자원을 함부로 해제할 수 없음 (다른 Thread 가 그 자원을 사용하고 있을지도 모르기 때문)

 

3. Thead Pools

  • 도입 배경
    • Thead 가 자주 생성되고 제거되는 상황에서 새로이 Thread 를 만드는 시간이 실제 Thread 가 동작하는 시간보다 긴 경우가 있음
  • 정의:
    • Process 가 새로이 실행 할 때 정해진 수 만큼 (휴리스틱 하게) 의 Thread 를 만든 후 Pool 에 할당
    • 새로운 Thread 가 필요하면 Pool 에서 가져오고, 작업이 끝나면 그 Thread 를 제거하지 않고 다시 Pool 에 넣어둠
    • 새로운 스레드 생성 및 종료 비용을 줄이기 위해 사용.

 

4. Thread 간 IPC

  • 정의:
    • 멀티스레드 프로그래밍에서는 스레드 간 통신 및 동기화가 필요.
    • 스레드는 동일한 프로세스 내 자원(Code, Memory, File)을 공유하므로 효율적.
  • Thread 간 IPC 구현은?
    • 동일한 Process 내의 Thread 간 통신은, 공유 Memory 가 효율적임
      • Thread 들은 같은 Process 의 Data 영역을 공유하므로 자연스런 공유 Memory 가 가능해짐
  • 결국 IPC 가 최소화 됨
    • Thread 들 간의 자원 공유로 인하여 가능해짐
  • 다른 Process 에 존재하는 다른 Thread 와의 통신은?
    • 다른 프로세스에 존재하는 스레드와 통신하려면 IPC 필요:
      • 프로세스 간에는 메모리를 공유하지 않으므로, 별도의 IPC 메커니즘 필요.
        ex) 메시지 큐, 소켓, 공유 메모리 등.
       
    • Process 의 경우와 비슷한 성능을 보임
    • 이런 통신이 빈번하다면, Program 설계의 잘못

 

반응형