운영체제 수업을 수강하며 정리한 내용을 작성하려고 합니다.
Brief review of Process
- Process - abstraction for
- Execution unit : (CPU) 스케줄링 단위
- Protection domain : 소유하고 있는 자원 (메모리 등)에 대한 보호
- Program과 Process의 관계
- Executing program with a single thread of control
- 지금까지 프로세스 개념
- 하나의 실행 흐름을 가지고 실행 중인 프로그램
싱글스레드 프로세스 vs 멀티스레드 프로세스

스레드란?
- 스레드
- 프로세스 내부의 실행 단위
- 소스코드가 같아도 서로 다른 프로그램 카운터, 레지스터셋, 스택을 가짐
- 멀티스레드 프로그램
- 실행 지점을 둘 이상 가지고 있음
- 여러 개의 프로그램 카운터
- 스레드를 왜 사용하는가?
- 하나의 프로세스에는 하나의 control만이 존재하기 때문에 한 번에 하나의 일만을 처리
- 프로세스에서 할 작업을 여러 개로 나눈 후에 각각을 스레드화 한다면 병렬적으로 작업을 완수할 수 있음
- IPC 기반의 협력적 프로세스와의 차이점
- 프로세스간 통신이 필요 → 비용 소모
- 프로세스 간의 문맥 교환 비용
- 스레드로 만든다면 보다 적은 비용으로 동일한 일을 수행할 수 있음
프로세스 vs 스레드
- 프로세스
- 프로세스 간 Protection Domain 존재
- 직접적으로 다른 프로세스의 메모리에 접근 불가
- 무거움: 문맥 교환에 더 많은 작업이 필요함
- 스레드
- 코드, 데이터, 힙 영역이 스레드 간 공유됨
- 가벼움: 프로세스 내 스레드 간 더욱 효율적인 스위칭
멀티스레드 프로그램의 장점
- 반응성
- 프로그램의 어느 부분을 담당하는 스레드가 block되거나 시간이 걸리는 작업을 하더라도, 다른 스레드들은 실행되고 있기 때문에 사용자의 입장에서는 그 프로그램이 interactive하다고 볼 수 있음
- 자원 공유
- 스레드간 프로세스의 메모리 다수와 다른 자원들을 공유
- Scalability
- 여러 개의 스레드가 각각 다른 프로세서에서 동시에 실행 가능(병행)
- 경제성
- 스레드들은 단일 프로세스 메모리 영역에서 실행되기 때문에 새로운 프로세스를 생성하는 것보다 스레드를 생성하는 것이 비용이 적게 들어감
스레드 간 문맥 교환
- 스레드 간에도 문맥 교환이 필요한가?
- 각각의 스레드는 프로그램 카운터와 레지스터 셋을 가지고 있음
- 하나의 스레드에서 다른 스레드로 스위칭할 때
- 레지스터 상태 T1이 저장됨
- 레지스터 상태 T2를 가져옴
- 주소 공간은 동일하게 유지
- 각 스레드별로 지니는 정보를 저장하기 위한 자료구조가 필요함
스레드 구성 요소(커널의 자료구조)
- TCB
- 스레드 ID - 스레드 식별자
- 프로그램 카운터 - 현재 실행중인 instruction의 주소
- 레지스터 셋 - CPU의 레지스터 값들
- 스레드 별 스택
- 동일한 프로세스 내에 있는 스레드가 공유하는 것
- 코드 - 프로그램의 코드 영역
- 데이터 - 프로세스의 데이터 영역
- 파일 - 프로세스에서 open한 file
- 위의 이유로 스레드 스위칭 비용이 적음
Concurrency vs Parallelism
- Concurrent execution: 단일 프로세서/코어가 concurrency를 제공할 수 있음


병렬처리
- 멀티코어 혹은 멀티프로세서 시스템이 개발자에게 challenging함
- Dividing activities
- Balance
- Data splitting
- Data dependency
- Testing and debugging
- 병행: 시스템이 동시에 하나의 task보다 더 수행할 수 있음
병행의 종류
- Data parallelism
- 다른 데이터 집합에 각각 동일한 작업

- Task parallelism
- 동일한 데이터에 각각 다른 작업

AI 학습에서의 parallelism
- 기계들 사이에서의 병행
- 커뮤니케이션 개입

스레드의 종류
- Kernel thread와 User thread
- Kernel thread와 User thread의 관계(매핑)
- 스레드 관리 이슈
유저 스레드
- User level의 라이브러리를 통해 구현
- 유저레벨 라이브러리에서 스레드를 생성, 스케줄링과 관련된 관리를 해줌
- e.g., POSIX Pthreads, Windows threads, Java threads
- 장점: 동일한 메모리 영역에서 스레드가 생성, 관리되므로 속도가 빠름
- 단점: 여러 개의 유저 스레드 중에서 하나의 스레드가 system call 요청으로 block이 된다면 나머지 모든 thread 역시 block됨
- 커널은 여러 개의 유저 스레드를 하나의 프로세스로 간주하기 때문
커널 스레드
- 운영체제에서 스레드를 지원
- 커널 영역에서 스레드의 생성, 스케줄링 등을 관리
- e.g., 대부분의 general-purpose OS (윈도우, 리눅스, 맥 등)
- 장점: 높은 수준의 concurrency
- 스레드가 시스템 콜을 호출하여 block이 되면, kernel은 다른 스레드를 실행함으로써 전체적인 thread blocking이 없음
- 단점: 스레드 생성 관리 비용이 큼
- 유저 스레드보다 생성 및 관리가 느림
- 커널 레벨의 context와 metadata 관리 필요.
User to Kernel: mapping methods
-
Many-to-One

- 여러 개의 유저 레벨 스레드들이 하나의 커널 스레드로 매핑됨
- 커널 스레드를 지원하지 못하는 시스템에서 사용됨
- 한계점: 한번에 하나의 스레드만 커널에 접근 가능
- 하나의 스레드가 커널에 접근(시스템 콜 호출)하면 나머지 스레드들은 대기
- 진정한 concurrency는 지원하지 못함
- 동시에 여러 개의 스레드가 시스템 콜 사용 불가
- 커널의 입장에서 여러 개의 스레드는 하나의 프로세스이기 때문에 멀티프로세서라도 여러 개의 프로세서에서 동시에 수행 불가능
-
One-to-One

- 유저 스레드 생성 시 그에 따른 커널 스레드가 생성됨
- 즉, 각 유저 스레드 별 커널 스레드가 1대1로 매핑됨
- 장점: Many-to-One에 비해 높은 concurrency 제공 가능
- Many-to-One의 한계 - 시스템 콜 호출 시 다른 스레드들이 Block되는 문제를 해결
- 한계
- 커널 스레드도 한정된 자원이기 때문에 무한정 생성할 수 없음
- 스레드를 생성, 사용하려 할 때 그 개수에 대한 고려가 필요
- e.g., Windows, linux
-
Many-to-Many

- 여러 개의 유저 스레드를 여러 개의 커널 스레드로 매핑
- Many-to-One과 One-to-One model의 문제점을 해결
- 장점: 운영체제가 필요한 수 만큼의 커널 스레드를 생성할 수 있음
- One-to-One처럼 사용할 스레드의 수에 대해 고민할 필요 없음
- Many-to-One처럼 스레드가 시스템 콜을 사용할 경우, 다른 스레드들이 block되는 현상에 대해 걱정할 필요 없음
- 단점: 관리 복잡도
- 생각보다 빈번히 사용되지 않음