Implicit Threading
과도한 쓰레드 생성을 막기 위해 사용자가 쓰레드를 생성하는것이 아닌 컴파일러나 run-time library가 직점 쓰레드를 요청하는것
개발자는 병령로 수행할수 있는 task를 식별하는데 집중하고, 쓰레드는 컴파일러나 런타임 라이브러리가 담당하는걸로..
thread pool
시스템에 필요한 쓰레드를 미리 생성해놓고 필요할때 할당함 -> 상대적으로 빠름
어차피 생성되어있는 thread에서 할당되는것이기 때문에 pool의 크기가 넘어갈 일은 없음
Task의 실행과 Task 생성을 분리하여 Task가 효율적으로 처리될수 있도록 함
Fork-Join Parallelism
어떤 Task를 실행할때 해당 Task를 실행하기 위해 2개의 Task로 Fork를 나누고 종료되었을때 다시 Join하고 다시Fork하는 방식으로 divide-conqure 방식과 비슷하기 구동된다.
![Fork-Join算法解析- 知乎](https://pic1.zhimg.com/v2-89b583e5b8eaf07d22cf0bd955be91ec_720w.jpg?source=172ae18b)
Open MP
컴파일러 지시문의 일종으로 특정 지시문을 기기의 코어의 개수만큼 쓰레드를 생성함
그래서 각 코어가 내뿜는 출력값으로 인해 출력들이 겹쳐보일수 있음
#pragma omp parallel
N개의 iteration 만큼 코어의 갯수 만큼 분할 매핑 할수도 있다.
#pragma omp parallel for for(i=0; i< N; i++){ c[i] = a[i] + b[i]; } //위 예제의 경우 data의 종속성이 없어서 병령실행이 가능하지만 만약 종속되어 있을경우 주의해야한다.
Grand Central Dispatch
MAC OS에서 Thread pool의 크기를 자동조절하는 기능 으로 POSIX pthread로 구현되어 C,C++, object-C로 구현가능
^{printf("I'm a blcok")} //해당 지시문을 Thread로 실행한다.
유저 입장에서는 thread를 직접 생성할 필요없이 편하게 thread 이용가능
Block자체는 dispatch queue에 들어갔다가 사용가능한 thread가 생기면 그때 할당하는 방식
dispatch queue의 종류
- Serial: block을 한번에 1개씩 Queue에서 block를 제거하면서 동작을 진행함, main queue라고 불림. 프로그래머는 프로그램 내에서 추가적인 Serial queue를 생성할수 있음
- Concurrent: 시스템전체에서 block이 한번에 어러개씩 실행될수 있도록 관리하는 queue로 4개의 level로 나뉨
- QOS_CLASS_USER_INTERACTIVE: 신속한 응답을 요구함
- QOS_CLASS_USER_INITIATED : 적당한 시간의 응답을 요구함
- QOS_CLASS_USER_UTILITY : 긴 시간을 요구함
- QOS_CLASS_USER_BACKGROUND :시간에 관계없음
- Concurrent(System-wide queue / global dispatch queue)의 4가지 종류
Threading에서 생길수 있는 문제
- Sementic of Fork()와 Exec()에 대한 이슈
- 내부에서 발생하는 Sychronous Signal Handling (illegal memory access, divided by zero)
- 외부에서 발생하는 Asynchronous Signal Handling (Ctrl+C, timer)
- Thread 중지하기 : Asychronous, deffer(지연)
Sementic of Fork()와 Exec()에 대한 이슈
- fork()를 했을때 호출한 thread만 복사할 것인가? 아니면 모든 thread를 복사할것인가?(UNIX는 일단 둘다 지원하고는 있다.)
- exec()이 수행되었을때 어차피 진행중이던 프로세스에 새로운 프로세스가 덮어 씌워지는 것이므로 호출한 thread만 복사하는 것이 유리하다.
Signal Handling
Signal: UNIX시스템에서 특정 이벤트가 일어났다는 것을 프로세스에게 알리는 신호
이 신호를 처리해주는 것을 **handler**이라고 한다.
- 특정이벤트에 의해 발생
- 프로세스에게 전달됨
- default: 시스템에 기존에 정의된 handler도 있고 user-define으로 사용자가 개조 가능한 handler도 있다.
- user-define signal handler는 default signal handler를 덮어 씌울수있다.
- 만약 Multi thread라면 여러가지 thread 중에 signal이 발생될 thread로 가야한다.
- 경우에 따라 여러 thread 혹은 특정 thread에 전달되기 도 해야한다. (ex: kill, pthread_kill)
- 대부분의 UNIX계열 OS에서는 스레드 마다 signal을 받을지 말지를 설정해줄수 있다.
Thread Cancellation
- 쓰레드가 종료되기 전에 강제 종료시키는 행위
- Asynchronous cancellation: 목표 thread가 즉시 종료됨 -> 할당 자원을 미반납 할수가 있음
- Deferred cancellation: thread의 철회를 지연시켜서 철회 준비 작업후 종료시킴
- 위에서 종료시점을 blocking system call이 호출될때 cancellation point가 되어짐
- 각 프로세스는 Cancellation을 받을지 말지를 설정할수 있는 Mode가 있으며 off, defferred, Asynchronous 모드가 있다.
- 만약 Cancellation signal이 들어왔는네 thread가 off라면 해당 신호는 적용되지 않고 멈취져 있다.
pthread_testcancel() // 인위적으로 cancellation_point를 지정할수 있음 // thread의 mode에 따라 리턴될수도 리턴되지 않을수도..
Thread local storage
- Thread 자체도 자신만의 data가 필요할수 도 있기 때문에 마련된 자체 공간
- 튿히 thread pool과 같이 유저가 thread의 생성을 관할할 권한이 없는 경우에 유용함
- static변수와 비슷한 느낌
'공부 학습' 카테고리의 다른 글
컴퓨터 네트워크 - Transport Layer (0) | 2021.04.06 |
---|---|
컴퓨터 네트워크 - Application Layer (1) | 2021.04.06 |
시스템프로그래밍 - 함수정리 (0) | 2021.03.24 |
운영체제 4주차 -1 (0) | 2021.03.22 |
운영체제 3주차 - 2 (1) | 2021.03.16 |