본문 바로가기

ComputerScience/Operating System

OS - 4 Threads

728x90

1. 프로세스와 쓰레드의 차이

- 프로세스는 자원을 소유하는 단위이다.

- 프로세스는 자기가 할당받은 메모리 공간 혹은 i/o모듈을 소유하고있다. 즉 프로세스는 리소스를 할당 받는 단위가 된다.

- 반면에 쓰레드는 운영체제와 cpu scheduling, 실행의 단위이다. dispatcher에 의해 cpu를 점유하는 단위이다. (dispatch unit)

- 하나의 프로세스에는 한개 이상의 쓰레드가 존재할 수 있다.

https://www.unf.edu/public/cop4610/ree/Notes/PPT/PPT8E/

- 즉 프로세스가 컴퓨터에게 시킬 작업이라면 이 작업을 수행하는 작업자(쓰레드)가 여러명 있는 것이다.

- 쓰레드는 가는 실타래처럼 그림에서 묘사되는데 이는 직접 cpu에 의해 수행되는 instruction의 궤적(trace)이다.

- 이 쓰레드들은 같은 프로세스에 존재하기 때문에 결국 프로세스가 할당받은 자원을 나누어 사용하게 된다.

- 운영체제가 여러 프로세스를 PCB를 교체해 가면서 번갈아 작업했던 것 처럼 쓰레드도 thread control block이 존재하고 이 TCB를 교체해 가면서 여러 쓰레드가 돌아간다.

https://www.unf.edu/public/cop4610/ree/Notes/PPT/PPT8E/

- 하나의 프로세스에 세개의 쓰레드가 존재하는 모습이다. 각각의 쓰레드는 TCB를 가지고 있다.

https://www.unf.edu/public/cop4610/ree/Notes/PPT/PPT8E/

2. 쓰레드의 장점

- 그럼 cpu작업의 단위를 쓰레드로 사용하는 이유는 뭘까?

- 일단 멀티프로그래밍을 지원하기 위해서는 작업의 switching이 반드시 필요한데 process switch보다 thread switch가 더 빠르고 효율적이다. 왜냐하면 쓰레드들은 하나의 프로세스에 대하여 같은 메모리 공간을 공유하고 있기 때문에 context를 교환할때 cpu register값들만 복사하면 되기 때문이다.

- 또한 마찬가지로 같은 작업을 처리하기 위해 프로세스를 만드는 것 보다 thread를 만드는 것이 다 빠르고 가볍다.

- 쓰레드를 활용하면, 예를들어 FPS게임을 한다고 했을때, 사용자의 위치를 잡는건 하나의 쓰레드가 처리하고 맵을 그리는건 또다른 쓰레드가 처리하는 등의 구현이 가능하다. 이렇게 더 빠르고 즉각적인 반응을 보장할 수 있다. 하나의 게임이라는 프로세스에서 여러 쓰레드가 각각의 작업을 수행하는 것이다.

3. Thread Execution States

- 쓰레드도 프로세스처럼 control block이 존재한다고 했다. 그리고 쓰레드는 schedule과 dispatch의 단위이다.

- 이전에 프로그램 실행을 여러 state의 변화에 따라 살펴보았는데 쓰레드도 마찬가지로 state에 따라 cpu를 할당받으며 실행된다.

https://www.unf.edu/public/cop4610/ree/Notes/PPT/PPT8E/

4. Thread Synchronization

- 쓰레드들은 한 프로세스에게 할당된 자원을 공유하기 때문에 쓰레드 각각에 작업들에 대해서 동기화가 매우중요하다.

5. Types of Threads

- 쓰레드에는 대표적으로 두 종류가 있다.

 

- user-level threads는 user space에만 존재할 수 있는 쓰레드를 말한다. 사용자의 프로그램에 여러 쓰레드가 존재할 수 있지만 커널모드에서는 이 여러 쓰레드를 하나의 프로세스로 인식한다.

https://www.unf.edu/public/cop4610/ree/Notes/PPT/PPT8E/

- 어차피 쓰레드들이 커널공간에서 하나의 프로세스로 인식되기 때문에(커널이 쓰레드의 존재를 모른다) 쓰레드간 switching작업이 필요할 때 커널모드로 전환될 필요가 없다(커널스케쥴러를 호출할 필요가 없다).

- 하지만 단점도 존재하는데 user-level 쓰레드중에서 하나의 쓰레드가 작업중단을 요청하면 통째로 프로세스가 block된다. 이 역시 여러 쓰레드를 하나의 프로세스로 커널공간에서 인식하기 때문이다.

- 하나의 쓰레드가 중단 요청을 함으로써 모든 쓰레드의 작업이 중단되는 것이다.

- 따라서 multiprocessing을 지원하는 시스템에서 여러 쓰레드가 각각의 프로세서에 할당되더라도 하나가 중단되면 전부 멈추기 때문에 큰 효과를 얻을 수 없다.

 

- 이렇게 등장한 것이 kernel-level thread이다.

- user space에서 쓰레드가 여러개 존재하더라도 커널 공간에서 각각 서로 다른 쓰레드로 인식하여 각각 TCB를 만든다.

- 이렇게 되면 ULT와는 달리 하나의 쓰레드가 중단되더라도 나머지 쓰레드가 동작할 수 있게 된다.

https://www.unf.edu/public/cop4610/ree/Notes/PPT/PPT8E/

- 쓰레드간 context switching이 일어날때마다 커널모드로 전환되어서 커널 스케쥴러를 호출하기 때문에 오버헤드가 존재한다.

https://www.unf.edu/public/cop4610/ree/Notes/PPT/PPT8E/

- ULT, KLT, process가 context switching될 때 오버헤드를 나타낸 표이다. KLT가 ULT보다 더 오버헤드가 존재하지만 여전히 process 문맥교환 보다는 오버헤드가 적은 것을 볼 수 있다.

 

- 이 두가지를 섞어서 쓰려는 접근도 있다.

https://www.unf.edu/public/cop4610/ree/Notes/PPT/PPT8E/

6. Multithreading 성능비교

https://www.unf.edu/public/cop4610/ree/Notes/PPT/PPT8E/

- 전체 작업에서 병렬 처리가 불가능한, 순서대로 처리되어야 하는 작업의 비율이 0%, 2%, 5%, 10%일 때

- 코어(프로세서)가 많으면 많을수록 작업 속도가 빨라짐을 알 수 있다.

- 하지만 눈여겨 보아야 할 점은 병렬처리가 불가능한 작업들의 비중이 높을 수록, 코어 증가의 효과를 덜 본다는 점이다.

https://www.unf.edu/public/cop4610/ree/Notes/PPT/PPT8E/

- context switching의 오버헤드를 고려하면

- 오히려 코어가 5개일 때가 코어가 8개일 때보다 속도가 더 빠르다.

- 따라서 Multithread의 효과를 multiprocess 시스템에서 극대화 시키기 위해서는 프로그램을 만들때 병렬처리가 가능한 부분들로 잘 나누어서 짜야한다.

728x90
반응형