본문 바로가기
컴퓨터 COMPUTER/Linux 리눅스

10. [Multithreading(1)] : 스레드의 등장

by 매실이 maesiri 2019. 2. 6.

지난 정리까지 프로세스의 구조에 대해 상세하게 알아보았다. 프로세스는 크게 Image 와 Process context 로 나뉘었으며, ① Image 안에는 stack, heap, data, code 가 있었고 ② Process context 안에는 프로그램이 현재 어디까지 돌렸는지 가리키는 Program context 와 Kernel의 정보를 담는 Kernel context 가 있었다. 아래 그림을 참고해서 기억을 더듬어보자.




Multiprocessor 의 등장으로 Multiprocessing이 가능해졌지만, 전통적인 프로세스 구조로는 한 프로세스가 오직 한 프로세서만 이용할 수 있기 때문에 Multiprocessing의 이점을 가져올 수 없었다. 새로운 프로세스를 생성하기 위해서는 커다란 자료구조를 복붙해야하기 때문에 굉장한 오버헤드가 들기도 했다. 따라서 하나의 프로세스가 여러 프로세서를 병렬로 사용할 수 있는 방법을 고안하게되었고, 그것이 Thead 스레드가 등장하게 된 배경이다.

Thread 는 프로그램 안에서 실행되고 있는 명령어 연속물의 한 단위이다. 주로 PC 와 stack을 가지고 있다. 한 프로그램 내의 Thread 들은 거의 모든 데이터와 코드, 커널 상태를 공유한다. 스레드가 왜 이렇게 생겨먹었는지 의문이 들 것이다.

프로세스의 구조를 다시 떠올려보며, 하나의 프로그램 상에 여러개의 프로세서가 돌아간다면 이 프로세서 간에 공유할 수 있는 정보는 무엇일지 생각해보자.

① Image 내에서의 Stack은 돌아가는 단위에 따라 변동이 크므로 공유할 수 없겠지만 나머지는 상관 없을 것이다. ② Context 에서는 Kernel context 만 공유할 수 있을 것이다. 따라서 아래의 그림과 같이 Stack 을 제외한 Image, Kernel context 와 Thread 로 구성된 새로운 프로세스 구조가 완성된다. Thread 는 공유할 수 있는 최대한의 것들을 제외한, 즉 하나의 operation을 하기 위해서 독자적으로 존재해야하는 것들을 모아둔 단위가 된다.




하나의 프로세스 내의 쓰레드들은 당연하게 같은 Pid (Process ID) 를 가지지만, 다른 Tid (Thread ID) 를 가지며, 각자 독자적인 논리흐름을 가진다. 독자적인 논리제어흐름을 가진다는 것은, 각각 schedule 도 따로 받게 된다는 걸 말한다. 하나의 프로세스는 여러 개의 쓰레드를 가질 수 있지만, 하나의 쓰레드는 무조건 하나의 프로세스만을 위해서 일한다. 프로세스가 쓰레드를 담고 있는 박스인 것처럼 머릿속에 그려보면 된다.

쓰레드는 그 이름과 같이 '실'처럼 표현을 한다. 현재의 OS 들은 대부분 아래의 그림처럼 Multiprocessing과 Multithreading 을 모두 사용한다.




쓰레드를 이용할 때 프로세스가 어떻게 생겼는지 보자. 아래의 그림처럼, 각 쓰레드는 하나의 프로세스 내에서 독자적인 스택과 SP 를 가진다. 이 쓰레드별 SP는 각 쓰레드 스택의 top을 가리킨다. 그러나 물리적으로는 SP와 PC 가 한개만 존재하여, 어떤 쓰레드의 스택의 어디에 돌고 있는지는 이 물리적 SP 가 가리키게 된다. 물리적인 SP,PC 는 아래 그림에서 왼쪽에 써둔 것이다. 이 경우, 현재 이 프로세서는 2번째 쓰레드를 작동 중임을 알 수 있다.

위에서 언급한 바와 같이, 쓰레드마다 스택을 따로 두는 이유는 스택에 변동이 크고 많기 때문이다. 쓰레드를 따로 둠으로써 쓰레드마다 logical flow 를 깨끗하게 한다.


프로세스-프로세스 관계와 쓰레드-쓰레드 관계 또한 눈여겨 볼 만하다.

프로세스는 자신을 복제하고 복제본에서 수정을 하며 새로운 프로세스를 만든다. Parent-children 관계로 인해 계층 (hierarchy) 가 생기며, 이들 간에는 공유하는 것이 없다. 반면 쓰레드는 한 프로세스 간에 data, code, kernel context를 공유하며 수평 관계 (sibling) 를 가진다. 프로세스가 간단한 경우, 쓰레딩을 이용하면 지정된 함수만을 병렬화 할 수 있기 때문에 매우 가볍게 일을 처리할 수 있다.

프로세스와 비교했을 때, 쓰레드는 독자적인 논리제어흐름을 가지고 각각 스케줄링 당한다는 점에서 유사하다. 그러나 쓰레드는 data, code, kernel context 를 공유하며 이로 인해 생성, 삭제, 스위칭이 빠르고 경제적으로 일어난다. 가장 중요한 쓰레드의 이점은, 한 프로세스의 쓰레드들이 각기 다른 프로세서에서 작동할 수 있기 때문에 드디어 멀티 프로세서를 적극 활용할 수 있게 되었다는 것이다.



개인 공부 정리용으로 작성한 글입니다. 틀린 부분이 있을 수 있으니 참고용으로만 사용해주세요. 틀린 부분은 댓글로 알려주세요.♥


반응형

댓글