728x90
4.1 Overview
스레드는 스레드 ID, 프로그램 카운터(PC), 레지스터 세트 및 스택으로 구성되는 CPU 활용의 기본 단위이다.
4.1.1 Motivation
멀티스레드의 개념
- 대부분의 현대 소프트웨어는 여러 스레드로 구성된 멀티스레드 방식으로 동작.
- 하나의 프로세스 내에서 여러 작업을 병렬로 처리하여 효율성을 높임.
- 멀티스레드와 멀티코어 시스템:
- 멀티스레드는 멀티코어 CPU에서 병렬 처리를 활용하여 CPU 집약적인 작업을 동시에 수행 가능.
- 데이터 마이닝, 그래픽 처리, 인공지능 등에서 병렬 처리로 성능 향상.
- 멀티스레드의 효율성:
- 단일 스레드 웹 서버의 경우 하나의 클라이언트 요청만 처리 가능 → 대기 시간이 길어짐.
- 전통적인 방식인 프로세스 생성은 리소스와 시간이 많이 소모됨.
- 멀티스레드 방식에서는 클라이언트 요청 시 새로운 스레드를 생성하여 효율적으로 처리.
4.1.2 Benefits
- 반응성 (Responsiveness):
- 멀티스레드는 인터랙티브 애플리케이션에서 프로그램의 일부가 차단되거나 시간이 오래 걸리는 작업을 수행하더라도 사용자에 대한 반응성을 유지.
- 예: 시간이 많이 소요되는 작업을 별도의 스레드에서 처리하면 메인 애플리케이션이 계속 반응 가능.
- 자원 공유 (Resource Sharing):
- 프로세스는 자원 공유를 위해 공유 메모리나 메시지 전달과 같은 명시적인 기술이 필요.
- 반면, 스레드는 기본적으로 동일한 프로세스 내 자원과 메모리를 공유하므로, 여러 스레드가 하나의 주소 공간에서 작업 가능.
- 경제성 (Economy):
- 스레드 생성은 프로세스 생성보다 메모리와 시간 소모가 적음.
- 또한, 스레드 간 컨텍스트 전환이 프로세스 간 전환보다 일반적으로 더 빠름.
- 확장성 (Scalability):
- 멀티프로세서 아키텍처에서는 스레드가 여러 CPU 코어에서 병렬로 실행 가능, 성능 극대화.
- 단일 스레드 프로세스는 하나의 프로세서에서만 실행 가능하므로 확장성 제한.
4.2 Multicore Programming
- 멀티코어 시스템: 단일 프로세싱 칩에 여러 코어를 배치해 각 코어가 OS에 독립된 CPU처럼 보임.
- 멀티스레딩은 멀티코어의 성능을 최대한 활용하고 동시성(concurrency) 및 병렬성(parallelism)을 향상.
- 동시성: 여러 작업이 동시에 진행 중인 상태를 지원 (실제 병렬 실행은 아님).
- 병렬성: 여러 작업이 물리적으로 동시에 실행되는 상태.
4.2.1 Programming Challenges
멀티코어를 효율적으로 활용하기 위해 OS 설계자와 애플리케이션 개발자가 직면하는 도전 과제:
- 작업 식별(Identifying tasks): 병렬로 실행 가능한 독립적 작업을 식별.
- 작업 균형(Balance): 각 코어에서 동등한 작업 부하를 수행하도록 설계.
- 데이터 분할(Data splitting): 각 작업이 처리할 데이터를 적절히 나눔.
- 데이터 의존성 관리(Data dependency): 작업 간 의존성이 있는 경우 실행을 동기화.
- 테스트와 디버깅(Testing and debugging): 병렬로 실행 시 다양한 경로가 생겨 단일 스레드보다 테스트와 디버깅이 복잡.
4.2.2 Types of Parallelism
- 데이터 병렬성(Data parallelism):
- 동일한 데이터를 여러 코어에 분산하고 같은 작업을 실행.
- 예: 배열의 합계 계산 → 각 코어가 배열의 일부를 나눠 합산 후 결과 병합.
- 작업 병렬성(Task parallelism):
- 작업(스레드)을 여러 코어에 분산하며, 각 스레드는 고유한 작업을 수행.
- 예: 배열에서 각 스레드가 다른 통계 계산 수행.
4.3 Multithreading Models
- 사용자 스레드(user threads): 커널 지원 없이 사용자 영역에서 관리.
- 커널 스레드(kernel threads): 운영 체제에서 직접 지원 및 관리.
4.3.1 다대일 모델(Many-to-One Model)
여러 사용자 스레드가 하나의 커널 스레드에 매핑.
- 장점:
- 스레드 관리가 사용자 영역에서 이루어져 효율적.
- 단점:
- 한 스레드가 블로킹 시스템 호출(blocking system call)을 하면 전체 프로세스가 블로킹.
- 멀티코어 시스템에서 병렬 실행 불가.
- 사용 사례
- 초기 Java와 Solaris의 Green Threads. 현재는 잘 사용되지 않음.
4.3.2 일대일 모델(One-to-One Model)
각 사용자 스레드가 하나의 커널 스레드에 매핑.
- 장점:
- 한 스레드가 블로킹 호출을 해도 다른 스레드는 실행 가능.
- 멀티코어 시스템에서 병렬 실행 가능.
- 단점:
- 많은 스레드를 생성하면 커널 스레드가 과부하될 가능성.
- 사용 사례:
- Linux와 Windows 운영 체제.
4.3.3 다대다 모델(Many-to-Many Model)
여러 사용자 스레드가 소수 혹은 동일 수의 커널 스레드에 매핑.
- 장점:
- 병렬 실행 지원.
- 개발자는 원하는 만큼 사용자 스레드 생성 가능.
- 블로킹 호출 발생 시, 다른 스레드가 스케줄링되어 실행.
- 단점:
- 구현이 복잡하며 멀티코어 증가로 인해 중요성이 감소.
블로킹 시스템 호출(blocking system call)0
➡️요청된 작업이 완료될 때까지 호출 스레드나 프로세스가 실행을 일시 중지하도록 하는 시스템 호출 유형. 이 기간 동안 스레드는 다른 작업을 수행할 수 없으며 시스템 호출이 반환될 때까지 제어가 효과적으로 "차단".
4.4 Thread Libraries
스레드 생성 및 관리를 위한 API 제공.
- 사용자 수준 라이브러리:
- 사용자 공간에서 실행, 커널 지원 불필요.
- 함수 호출이 로컬 호출로 처리, 시스템 호출 없음.
- 커널 수준 라이브러리:
- 운영 체제에서 지원, 커널 공간에서 실행.
- API 호출 시 시스템 호출 발생.
4.5 Implicit Threading
스레드 생성 및 관리를 개발자 대신 컴파일러 및 런타임 라이브러리가 수행하는 방식.
- 목적:
- 개발자는 병렬로 실행 가능한 작업(Task)만 식별하면, 스레드의 생성과 관리는 라이브러리가 처리.
- 장점:
- 스레드 생성 및 관리의 복잡성 감소.
- 작업은 라이브러리가 다-대-(Many-to-Many) 모델로 스레드에 매핑.
4.5.1 Thread Pools
시스템 시작 시 일정 수의 스레드를 미리 생성하여 풀(pool)에 저장. 요청 발생 시 새 스레드를 생성하는 대신, 풀의 기존 스레드를 재사용.
- 작동 원리:
- 서버가 요청을 받으면 스레드 풀에 작업을 제출.
- 사용 가능한 스레드가 있다면 즉시 요청을 처리.
- 모든 스레드가 사용 중이라면 요청은 대기열에 추가.
- 작업 완료 후, 스레드는 풀로 복귀.
- 장점:
- 성능 향상: 기존 스레드 재사용으로 스레드 생성 오버헤드 감소.
- 자원 제한: 동시에 실행되는 스레드 수를 제한하여 시스템 자원 고갈 방지.
- 유연성: 작업 실행을 지연시키거나 주기적으로 실행하는 전략 사용 가능.
4.5.2 Fork Join
메인 부모 스레드가 하나 이상의 자식 스레드를 생성(포킹)한 다음, 자녀 스레드가 종료되고 합류할 때까지 기다렸다가 결과를 검색하고 결합할 수 있다
4.6 Threading Issues
4.6.1 The fork() and exec() System Calls
- fork() 호출 시 문제:
- 새 프로세스가 모든 스레드를 복사할지, 호출한 스레드만 복사할지 결정 필요.
- 일반적으로, exec() 호출이 뒤따르면 호출한 스레드만 복사하는 것이 적합.
- 그렇지 않은 경우, 모든 스레드를 복사.
4.6.2 Signal Handling
- 신호 유형:
- 동기 신호: 프로세스 내에서 특정 이벤트 발생(예: 잘못된 메모리 접근).
- 비동기 신호: 외부 이벤트로 인해 발생(예: 키 입력으로 프로세스 종료).
- 신호 전달 방법:
- 신호와 관련된 특정 스레드에 전달.
- 프로세스 내 모든 스레드에 전달.
- 특정 스레드 그룹에 전달.
- 지정된 스레드가 모든 신호를 처리.
4.6.3 Thread Cancellation
- 취소 방식:
- 비동기 취소: 즉시 스레드 종료(권장되지 않음).
- 지연 취소: 대상 스레드가 주기적으로 취소 플래그를 확인 후 종료.
- 문제점:
- 리소스가 할당된 상태에서 취소 시 자원 회수 문제.
- 데이터 업데이트 중 취소 시 데이터 무결성 손상 가능.
4.6.5 Scheduler Activations
- 개념:
- 커널이 애플리케이션에 가상 프로세서(LWP)를 제공, 애플리케이션은 LWP에 스레드를 매핑.
- 커널 스레드와 물리 프로세서 간 스케줄링.
- 업콜(upcall):
- 커널이 특정 이벤트 발생 시 애플리케이션에 알림.
- 예: 스레드가 블록될 때 새 LWP 할당 및 스레드 상태 저장.
- 효율성:
- I/O 집약적 작업의 경우 다수의 LWP 필요.
- 필요 시 가상 프로세서를 동적으로 조정.
728x90
반응형
'운영체제 공룡책' 카테고리의 다른 글
[운영체제 공룡책] 6장 Synchronization Tools(동기화 도구) (1) | 2025.01.02 |
---|---|
[운영체제 공룡책] 5장 CPU Scheduling (2) | 2024.12.14 |
[운영체제 공룡책] 3장 ProcessManagement (4) | 2024.11.20 |
[운영체제 공룡책] 2장 Operating - System Structures (4) | 2024.11.13 |
[운영체제 공룡책] 1장 Overview (2) | 2024.11.07 |