Outline
① Motivation
② Overview
③ Multicore programming
④ Multithreading models
⑤ Thread libraries
⑥ Threading issues
⑦ Thread programming API
① Motivation
새 요청 받을 때마다 프로세스 생성 (fork() 호출) 하면 리소스, 시간 많이 필요
쓰레드 사용 시 overhead 줄일 수 있음
② Overview
● Thread
- CPU 이용의 기본 단위
- 같은 프로세스에 속한 다른 쓰레드와 운영체제 자원 공유 (콛, 데이터 섹션, 열린 파일, 신호 등)
● 장점
1. 응답성
- 특정 쓰레드가 block 되어도 나머지 쓰레드 실행 가능
2. 자원 공유
- 프로세스: IPC 통해서 공유
- 쓰레드: 자동적으로 프로세스의 자원, 메모리 공유 (code, data, file)
3. 경제성
- 프로세스 생성을 위해 메모리와 자원 할당 하는 것은 비용 많이 듦
- 쓰레드는 자신이 속한 프로세스의 자원 공유. 쓰레드 생성, 문맥 교환이 더 경제적
4. 규모 적응성
- 다중 처리기 구조이므로 각 쓰레드가 다른 처리기에서 병렬로 수행 (multi processor 활용 가능)
③ Multicore programming
여러 개의 쓰레드 동시에 실행 가능
코어가 여러 CPU 칩 형태를 띠거나, 칩 안에 여러 개의 코어가 존재
1. 병행성 (Concurrent)
- 모든 태스크가 진행되게끔 함으로써 하나 이상의 태스크 지원
- 동시에 수행되는 것처럼 보임
2. 병렬성 (Parallelism)
- 하나 이상의 태스크를 동시에 수행
- 실제 병렬적으로 수행
1) 데이터 병렬 (Data parallelism)
- 동일한 데이터의 부분 집합을 다수의 계산 코어에 분배한 뒤, 각 코어에서 동일한 연산 실행
- 하나의 일을 여러 개로 쪼개서 처리
2) 태스크 병렬 (Task parallelism)
- 태스크를 다수의 코어에 분배. 각 쓰레드는 고유의 연산 실행
- 여러 개의 일을 처리
● 멀티코어 프로그래밍이 어려운 이유
1. 태스크 인식
- 응용 프로그램을 분석하여 독립된 병행가능 태스크로 나눌 수 있는 영역 찾아야 함
- 태스크는 독립적이고 개별코어에서 병렬실행 가능해야 함
2. 밸런싱
- 찾아진 부분들이 균등한 기여도를 가지도록 태스크를 나누어야 함 (전체 성능 저하될 수 있음)
3. 데이터 분리
- 응용 프로그램이 독립된 태스크로 나눠지는 것처럼, 태스크가 접근하고 조작하는 데이터 또한 개별 코어에서 사용가능하도록 나눠져야 함
4. 데이터 종속성
- 태스크가 접근하는 데이터는 둘 이상의 태스크 사이에 종속성이 없는지 검토해야 함
5. 시험 및 디버깅
- 다양한 실행경로 존재
=> 이 때문에 Multi Threading 사용
④ Multithreading models
● 종류
1. 사용자 쓰레드 (user thread)
- 커널 위에서 수행됨. 커널과 관련 없음
2. 커널 쓰레드 (kernel thread)
- 커널 내부에서 생성, 파괴됨.
- 운영체제에 의해서 관리됨
● 모델
1. Many-to-One
- user thread 여러 개
- kernel thread 한 개
- 장점: 쓰레드가 커널이 아닌 사용자 공간의 쓰레드 라이브러리에 의해 행해지므로 빠르고 오버헤드가 적음
- 단점: blocking system call 호출하면 전체 프로세스가 block됨. 다중 코어 시스템에서 병렬로 실행 불가
2. One-to-One
- user thread 한 개
- kernel thread 한 개
- 장점: blocking system call 호출해도 다른 작업 가능. 다중 코어 시스템에서 병렬로 실행 가능
- 단점: 커널 쓰레드 많이 생성하므로 오버헤드 증가
3. Many-to-Many
- user thread 한 개
- kernel thread 한 개
- 다대일, 일대일 모델의 장점 모두 가짐
- 개발자는 필요한 만큼 user thread 생성
- kernel thread는 멀티 프로세서에서 병렬 실행 가능
- blocking system call 호출하면 커널이 다른 쓰레드의 수행을 스케줄링 가능
4. Two-Level
- 다대다, 일대일 둘 다 사용
- Bound thread: One-to-One 모델을 쓰고 있는 쓰레드
⑤ Thread libraries
프로그래머에게 쓰레드를 생성하고 관리하기 위한 API 제공
● 구현
1. 사용자 공간에서만 라이브러리 제공
- 라이브러리 호출 시 사용자 공간의 지역함수 호출. 시스템 콜 호출 안함
2. 커널 수준 라이브러리 구현
- 라이브러리 호출 시 커널 시스템 콜 호출
● 종류
1. POSIX Pthread
- 사용자 / 커널
2. Win32 thread
- 커널
3. Java thread
- 호스트 시스템에 따라 다름
⑥ Threading issues
● 쓰레드가 fork() 호출 시 새 프로세스는 모든 쓰레드 복사? 한 개의 쓰레드만 복사?
1. fork() 호출 후 exec() 호출
- fork()를 호출한 쓰레드만 복사
2. fork() 호출 후 exec() 호출 안함
- 모든 쓰레드 복사
● 신호 처리
- 신호: 프로세스에게 어떤 사건이 일어났음을 알려줌
1. 동기식 신호
- 실행 중인 프로세스에서 발생
- 연산을 수행한 동일한 프로세스에게 전달됨
- ex) 잘못된 메모리 접근, div by 0
2. 비동기식 신호
- 실행중인 프로세스 외부에서 발생
- 다른 프로세스에게 전달됨
- ex) 타이머 만료, ctrl+c
※ 신호 전달: pthread_kill(pthread_t tid, int signal) (프로세스 kill 하는 것 아님!!)
● 쓰레드 취소
쓰레드가 끝나기 전에 그것을 강제종료 시킴
1. 비동기식 취소
- 한 쓰레드가 목적 쓰레드를 즉시 강제종료
- 모든 시스템 자원 다 회수 못하는 경우 있음
2. 지연 취소
- 자신이 취소되어도 안전하다고 판단되는 시점에서 취소 여부 검사
- 목적 쓰레드가 주기적으로 자신이 강제종료 되어야 할 지 점검
- 목적 쓰레드 질서정연하게 강제종료 될 수 있음
● 쓰레드 풀
프로세스를 시작할 때 일정한 수의 쓰레드들을 미리 쓰레드 풀로 만들어 둠
CPU 시간, 메모리 공간 등 시스템 자원의 고갈을 막아줌
일 없으면 기다리다가 요청 들어오면 쓰레드 풀에서 한 쓰레드에 할당
장점: 새 쓰레드 생성하는 것보다 기존 쓰레드 할당하는 것이 더 빠름
쓰레드 개수 재한하면 많은 수의 쓰레드를 병렬처리 할 수 없는 시스템에 도움을 줌
● Thread specific data
- Allows each thread to have its own copy of data
- Most thread libraries provide some form of support for thread-specific data
⑦ Thread programming API
pthread_create: 새 쓰레드 생성
pthread_join: 특정 쓰레드의 종료를 기다림
pthread_exit: 쓰레드를 종료시키고 join 호출한 쓰레드에게 메시지를 전달
'CS 공부 > 운영체제' 카테고리의 다른 글
Chapter 6, 7 Process Synchronization (0) | 2021.09.23 |
---|---|
Chapter 5. Process scheduling (0) | 2021.09.23 |
Chapter 3. Process Concept (0) | 2021.09.16 |
Chapter 2 (0) | 2021.09.16 |
Chapter 1 (0) | 2021.09.16 |