본문 바로가기
학교 수업/운영체제

운영체제 7 || thread (2

by Godgil 2021. 4. 17.

현대의 컴퓨터들은 코어의 개수가 올라강메 따라서 멀티스레딩을 좀 쉽게 할 수 있는 여러 방법이 고안됨

 

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가 같으면 스레드이고 다르면 프로세스야

 

댓글