운영체제 공룡책

[운영체제 공룡책] 4장 Threads &Concurrency

studyingalone 2024. 11. 26. 19:33
728x90

4.1 Overview

스레드는 스레드 ID, 프로그램 카운터(PC), 레지스터 세트 및 스택으로 구성되는 CPU 활용의 기본 단위이다.

 

4.1.1 Motivation

멀티스레드의 개념

  • 대부분의 현대 소프트웨어는 여러 스레드로 구성된 멀티스레드 방식으로 동작.
  • 하나의 프로세스 내에서 여러 작업을 병렬로 처리하여 효율성을 높임.

Single-threaded and multithreaded processes.

 

 

  • 멀티스레드와 멀티코어 시스템:
    • 멀티스레드는 멀티코어 CPU에서 병렬 처리를 활용하여 CPU 집약적인 작업을 동시에 수행 가능.
    • 데이터 마이닝, 그래픽 처리, 인공지능 등에서 병렬 처리로 성능 향상.

Multithreaded server architecture.

  • 멀티스레드의 효율성:
    • 단일 스레드 웹 서버의 경우 하나의 클라이언트 요청만 처리 가능 → 대기 시간이 길어짐.
    • 전통적인 방식인 프로세스 생성은 리소스와 시간이 많이 소모됨.
    • 멀티스레드 방식에서는 클라이언트 요청 시 새로운 스레드를 생성하여 효율적으로 처리.

 

4.1.2 Benefits

 

  1. 반응성 (Responsiveness):
    • 멀티스레드는 인터랙티브 애플리케이션에서 프로그램의 일부가 차단되거나 시간이 오래 걸리는 작업을 수행하더라도 사용자에 대한 반응성을 유지.
    • 예: 시간이 많이 소요되는 작업을 별도의 스레드에서 처리하면 메인 애플리케이션이 계속 반응 가능.
  2. 자원 공유 (Resource Sharing):
    • 프로세스는 자원 공유를 위해 공유 메모리나 메시지 전달과 같은 명시적인 기술이 필요.
    • 반면, 스레드는 기본적으로 동일한 프로세스 내 자원과 메모리를 공유하므로, 여러 스레드가 하나의 주소 공간에서 작업 가능.
  3. 경제성 (Economy):
    • 스레드 생성은 프로세스 생성보다 메모리와 시간 소모가 적음.
    • 또한, 스레드 간 컨텍스트 전환이 프로세스 간 전환보다 일반적으로 더 빠름.
  4. 확장성 (Scalability):
    • 멀티프로세서 아키텍처에서는 스레드가 여러 CPU 코어에서 병렬로 실행 가능, 성능 극대화.
    • 단일 스레드 프로세스는 하나의 프로세서에서만 실행 가능하므로 확장성 제한.

 

4.2 Multicore Programming

  • 멀티코어 시스템: 단일 프로세싱 칩에 여러 코어를 배치해 각 코어가 OS에 독립된 CPU처럼 보임.
  • 멀티스레딩은 멀티코어의 성능을 최대한 활용하고 동시성(concurrency)병렬성(parallelism)을 향상.
    • 동시성: 여러 작업이 동시에 진행 중인 상태를 지원 (실제 병렬 실행은 아님).
    • 병렬성: 여러 작업이 물리적으로 동시에 실행되는 상태.

Concurrent execution on a single-core system.

4.2.1 Programming Challenges

멀티코어를 효율적으로 활용하기 위해 OS 설계자와 애플리케이션 개발자가 직면하는 도전 과제:

  1. 작업 식별(Identifying tasks): 병렬로 실행 가능한 독립적 작업을 식별.
  2. 작업 균형(Balance): 각 코어에서 동등한 작업 부하를 수행하도록 설계.
  3. 데이터 분할(Data splitting): 각 작업이 처리할 데이터를 적절히 나눔.
  4. 데이터 의존성 관리(Data dependency): 작업 간 의존성이 있는 경우 실행을 동기화.
  5. 테스트와 디버깅(Testing and debugging): 병렬로 실행 시 다양한 경로가 생겨 단일 스레드보다 테스트와 디버깅이 복잡.

Parallel execution on a multicore system


4.2.2 Types of Parallelism

  • 데이터 병렬성(Data parallelism):
    • 동일한 데이터를 여러 코어에 분산하고 같은 작업을 실행.
    • 예: 배열의 합계 계산 → 각 코어가 배열의 일부를 나눠 합산 후 결과 병합.
  • 작업 병렬성(Task parallelism):
    • 작업(스레드)을 여러 코어에 분산하며, 각 스레드는 고유한 작업을 수행.
    • 예: 배열에서 각 스레드가 다른 통계 계산 수행.

Data and task parallelism

 

 


4.3 Multithreading Models

 

  • 사용자 스레드(user threads): 커널 지원 없이 사용자 영역에서 관리.
  • 커널 스레드(kernel threads): 운영 체제에서 직접 지원 및 관리.

 

4.3.1 다대일 모델(Many-to-One Model)

여러 사용자 스레드가 하나의 커널 스레드에 매핑.

Many-to-one model.

 

  • 장점:
    • 스레드 관리가 사용자 영역에서 이루어져 효율적.
  • 단점:
    • 한 스레드가 블로킹 시스템 호출(blocking system call)을 하면 전체 프로세스가 블로킹.
    • 멀티코어 시스템에서 병렬 실행 불가.
  • 사용 사례
    • 초기 Java와 Solaris의 Green Threads. 현재는 잘 사용되지 않음.

 

4.3.2 일대일 모델(One-to-One Model)

 

각 사용자 스레드가 하나의 커널 스레드에 매핑.

One-to-one model

  • 장점:
    • 한 스레드가 블로킹 호출을 해도 다른 스레드는 실행 가능.
    • 멀티코어 시스템에서 병렬 실행 가능.
  • 단점:
    • 많은 스레드를 생성하면 커널 스레드가 과부하될 가능성.
  • 사용 사례:
    • Linux와 Windows 운영 체제.

 

4.3.3 다대다 모델(Many-to-Many Model)

 

여러 사용자 스레드가 소수 혹은 동일 수의 커널 스레드에 매핑.

Many-to-many model

  • 장점:
    • 병렬 실행 지원.
    • 개발자는 원하는 만큼 사용자 스레드 생성 가능.
    • 블로킹 호출 발생 시, 다른 스레드가 스케줄링되어 실행.
  • 단점:
    • 구현이 복잡하며 멀티코어 증가로 인해 중요성이 감소.

 

블로킹 시스템 호출(blocking system call)0

➡️요청된 작업이 완료될 때까지 호출 스레드나 프로세스가 실행을 일시 중지하도록 하는 시스템 호출 유형. 이 기간 동안 스레드는 다른 작업을 수행할 수 없으며 시스템 호출이 반환될 때까지 제어가 효과적으로 "차단".


 

4.4 Thread Libraries

 

스레드 생성 및 관리를 위한 API 제공.

  1. 사용자 수준 라이브러리:
    • 사용자 공간에서 실행, 커널 지원 불필요.
    • 함수 호출이 로컬 호출로 처리, 시스템 호출 없음.
  2. 커널 수준 라이브러리:
    • 운영 체제에서 지원, 커널 공간에서 실행.
    • API 호출 시 시스템 호출 발생.

 

4.5 Implicit Threading

스레드 생성 및 관리를 개발자 대신 컴파일러 및 런타임 라이브러리가 수행하는 방식.

 

  • 목적:
    • 개발자는 병렬로 실행 가능한 작업(Task)만 식별하면, 스레드의 생성과 관리는 라이브러리가 처리.
  • 장점:
    • 스레드 생성 및 관리의 복잡성 감소.
    • 작업은 라이브러리가 다-대-(Many-to-Many) 모델로 스레드에 매핑.

4.5.1 Thread Pools

 

시스템 시작 시 일정 수의 스레드를 미리 생성하여 풀(pool)에 저장. 요청 발생 시 새 스레드를 생성하는 대신, 풀의 기존 스레드를 재사용.

 

 

  • 작동 원리:
    1. 서버가 요청을 받으면 스레드 풀에 작업을 제출.
    2. 사용 가능한 스레드가 있다면 즉시 요청을 처리.
    3. 모든 스레드가 사용 중이라면 요청은 대기열에 추가.
    4. 작업 완료 후, 스레드는 풀로 복귀.
  • 장점:
    1. 성능 향상: 기존 스레드 재사용으로 스레드 생성 오버헤드 감소.
    2. 자원 제한: 동시에 실행되는 스레드 수를 제한하여 시스템 자원 고갈 방지.
    3. 유연성: 작업 실행을 지연시키거나 주기적으로 실행하는 전략 사용 가능.

 

4.5.2 Fork Join

 

메인 부모 스레드가 하나 이상의 자식 스레드를 생성(포킹)한 다음, 자녀 스레드가 종료되고 합류할 때까지 기다렸다가 결과를 검색하고 결합할 수 있다

 

Fork-join parallelism

 

 


4.6 Threading Issues

4.6.1 The fork() and exec() System Calls

  • fork() 호출 시 문제:
    • 새 프로세스가 모든 스레드를 복사할지, 호출한 스레드만 복사할지 결정 필요.
    • 일반적으로, exec() 호출이 뒤따르면 호출한 스레드만 복사하는 것이 적합.
    • 그렇지 않은 경우, 모든 스레드를 복사.

4.6.2 Signal Handling

 

  • 신호 유형:
    • 동기 신호: 프로세스 내에서 특정 이벤트 발생(예: 잘못된 메모리 접근).
    • 비동기 신호: 외부 이벤트로 인해 발생(예: 키 입력으로 프로세스 종료).
  • 신호 전달 방법:
    1. 신호와 관련된 특정 스레드에 전달.
    2. 프로세스 내 모든 스레드에 전달.
    3. 특정 스레드 그룹에 전달.
    4. 지정된 스레드가 모든 신호를 처리.

 


4.6.3 Thread Cancellation

 

  • 취소 방식:
    • 비동기 취소: 즉시 스레드 종료(권장되지 않음).
    • 지연 취소: 대상 스레드가 주기적으로 취소 플래그를 확인 후 종료.
  • 문제점:
    • 리소스가 할당된 상태에서 취소 시 자원 회수 문제.
    • 데이터 업데이트 중 취소 시 데이터 무결성 손상 가능.

 

 


4.6.5 Scheduler Activations

 

  • 개념:
    • 커널이 애플리케이션에 가상 프로세서(LWP)를 제공, 애플리케이션은 LWP에 스레드를 매핑.
    • 커널 스레드와 물리 프로세서 간 스케줄링.
  • 업콜(upcall):
    • 커널이 특정 이벤트 발생 시 애플리케이션에 알림.
    • 예: 스레드가 블록될 때 새 LWP 할당 및 스레드 상태 저장.
  • 효율성:
    • I/O 집약적 작업의 경우 다수의 LWP 필요.
    • 필요 시 가상 프로세서를 동적으로 조정.

 

Lightweight process (LWP)

 

 

 

 

728x90
반응형