현대의 컴퓨터들은 코어의 개수가 올라강메 따라서 멀티스레딩을 좀 쉽게 할 수 있는 여러 방법이 고안됨
1. Implicit Threading
스레드를 만들고 관리하는걸 개발자가 직접 하는게 아닌 컴파일러와 런타임 라이브러리를 통해 OS의 도움을 받아서 관리하는것.
즉 개발자는 멀티스레딩을 고려하지 않아도 백그라운드에서 멀티 스레딩으로 변환됨
1-1. Thread Pools
> 개발자가 스레드를 직접 만들긴 함, 하지만 라이브러리나 OS가 공간을 할당받고, 미리 정해진 개수의 스레드를 만듦 이러한 공간을 스레드 풀이라고 함.
> 스레드 풀에서 만들어진 스레드들은 Sleep상태로 대기함
1-2. Fork Join
> 멀티 스레딩은 결국 연산속도를 빠르게 하기 위함.
> 분할 정복과 비슷한 매커니즘
> 메인 스레드에서 분리해서 각자의 일을 수행하고 다시 join으로 합치기
1-3. OpenMP
> #include같은 컴파일러 지시문을 사용함
> Shared Memory 환경에서 병렬 프로그래밍을 지원함
1-4. GCD
a. seial queue
> 프로그래머가 필요에따라 serial한 큐를 만들고 추가할 수 있음 프로그램 내에
b. Concurrent queue
> 기본적으로 FIFO 하지만 여러개를 한번에 빼서 concurrent하게 처리 가능
2. Issues in Threading
2-1. Fork() and exec()
스레드가 Fork()를 호출 할 경우, 두 가지 옵션이 존재한다.
a. 프로세스가 가지고 있는 전체의 스레드가 fork되는 경우
b. fork를 호출한 해당 스레드만 fork되는 경우
UNIX시스템에서는 두 가지 버전을 모두 지원한다.
Exec()은 별 생각 안해도 되는데, 왜냐하면 exec()자체가 다 밀어버리고 새로운 이미지를 씌우는 것이기 때문임.
따라서 가지고있던 스레드가 다 사라지고 새 프로세스 이미지의 스레드가 생성될 것
3. Signal Handling
>신호는 UNIX에서 프로세스에게 어떤 사건이 일어남을 아렬주는 것.
> 신호는 경우에 따라서 동기적, 비동기적으로 진행될 수 있음
멀티 스레드 프로그램에서 신호처리는 다음과 같은 선택지가 있다.
>> 신호를 적용하는 스레드에게 전달된다.
>> 프로세스의 모든 스레드에게 전달된다.
>> 몇몇 프로세스들에게만 선택적으로 전달된다.
>> 특정 스레드가 모든 신호를 전달받도록 가정한다.
위의 방법들은 신호의 유형에 따라 다르다.
4. Thread Cancellation
> 스레드도 다른 스레드를 kill 신호를 통해 죽이기 가능
a. Asynchronous cancellation
>> thread가 kill신호를 받는 경우 즉각 종료가 됨.
>> 이 경우 kill()을 받은 스레드가 리소스를 가지고 있다면 문제가 됨. 왜냐면 자원을 free시키지 못한 상태에서 스레드가 죽어버리니까.
위와 같은 문제를 해결하려고 나온 방식이
b. Deferred cancellation.
>> 이 구조는 타겟이 되는 스레드가 즉각적으로 종료되지 않음. 스레드는 몇몇 구간마다 자기가 죽어야되는지 확인을 하고, 이후에 자원을 free시켜 준 다음 죽음
5. TLS (thread Local Storage)
> 앞서 말했듯이 프로세스 내에서 스레드들은 Data, Code, Open files, Heap영역을 공유함
> 여기에서 한가지 문제가 발생하는데, 전역변수들은 스레드들이 공유하는 상태이기 때문에 syncronization문제가 발생함. 따라서, 전역변수라고 해도, 각 스레드마다 고유의 변수가 되도록 만들 수 있는데 이게 바로 TSL임
6. 리눅스에서의 스레드
>기본적으로 리눅스는 스레드와 프로세스에 차이를 두지 않음
> 그럼 어떻게 구분해?
>> 프로세스는 각자 PCB를 가지고있는데, 이 PCB안에 있는 pid가 같으면 스레드이고 다르면 프로세스야
'학교 수업 > 운영체제' 카테고리의 다른 글
운영체제 || 10. Process Scheduling III (0) | 2021.04.17 |
---|---|
운영체제 || 9. Process Scheduling II (0) | 2021.04.17 |
운영체제 6 || 스레드(threads) (0) | 2021.04.17 |
운영체제 || 5. Inter Process Communication (0) | 2021.03.29 |
운영체제 || 4. Process (0) | 2021.03.19 |
댓글