LISTORY

[윈도우즈 시스템 프로그래밍] 프로세스 vs 쓰레드 본문

IT/윈도우 프로그래밍

[윈도우즈 시스템 프로그래밍] 프로세스 vs 쓰레드

LiStoryTeller 2018. 7. 14. 23:42


뇌를 자극하는 윈도우즈 시스템 프로그래밍 책의 유투브 강의 내용 정리이다.


오늘 정리할 내용은 프로세스 vs 쓰레드의 내용이다.


YouTube 주소 프로세스 vs 쓰레드



프로세스 vs 쓰레드


쓰레드의 이해


쓰레드에 대해 알기 전에, 먼저 멀티 프로세스에 대한 이해가 필요하다.


멀티프로세스가 필요한 경우와 불필요한 경우는 어떤 경우일까?


운영체제 관점에서 멀티 프로세스가 필요한건 둘 이상의 프로그램을 실행시키기 위해서이다.


그런데 하나의 프로그램 안에서도 멀티 프로세스가 필요할까?



하나의 프로그램에서는 하나의 흐름을 갖는다. 즉 코드를 실행하는게 하나의 흐름이다.


근데 소프트웨어가 복잡해지면서 하나의 프로그램에서 둘 이상의 흐름을 가져야 하는 상황을 접하게 된다.


대표적으로 전투 테트리스가 있다. 자신것만 아니라 타인의 게임까지 두개의 흐름을 동시에 보여준다.


쓰래드를 공부하기 전엔 두개 이상의 프로세스가 한번에 돌고있나 생각을 하게 될 수 있다.


예를 들면 하나의 흐름이 더 필요할 때 자식 프로세스를 생성한다고 생각할 수 있다. 이는 불가능하진 않다.



프로세스가 생성되면 그림처럼 code영역, data 영역, heap영역, stack 영역을 갖게된다.


각각의 역할에 대해 간단히 말하면 다음과 같다.


code 영역: 프로그램 코드

data 영역: 전역 변수

heap 영역: 동적 할당

stack 영역: 지역 변수(매개 변수)


다시 위의 내용으로 돌아가서, 두개의 흐름을 갖기 위해 자식 프로세스를 생성하는 것이 가능하다고 했다.


그런데 여기서 문제가 생긴다.


일단, 부모 프로세스와 완전히 동일한 모델을 가지고 있음에도 불구하고, 프로세스를 생성하면 프로세스 간의 컨텍스트 스위칭이 아주 빈번하게 필요해진다.


또한, 프로세스를 생성하기 위해 운영체제 입장는 프로세스의 커널 오브젝트를 생성하여 관리해야 하는등 할일이 굉장히 많아진다.


이는 운영체제에게 조금 부담으로 다가올 수 있다.



스레드의 생성


이와 같은 상황에서 부모 프로세스와 자식 프로세스가 달리 가져야 하는 영역은 굉장히 한정적이다.


일단 시스템 입장에서 흐름을 두개 가져가기 위해 필요한 것은 코드 영역이다. 


독립된 코드가 있어야 각기 다른 흐름을 갖을 수 있기 때문이다.


만약에 흐름 A, 흐름 B를 위해 필요한 코드가 하나의 영역에 있을 경우엔 어떨까


흘러간다는 것은 연속된 함수 호출이기 때문에 크게 상관 없다.



함수가 호출이 되어 함수가 실행된다는 것은 stack이 필요하다는 의미이다.


하나의 stack 영역을 나눠쓰면 어떨까? 불가능하지도 않고 물리적으로는 사실 공유하고 있기두 하다. 


하지만 논리적으로 흐름별로 각각 관리하는 것이 편하다.


흐름을 갖길 위해 각각을 위한 스택을 별도로 관리하는 것이 운영체제가 프로그램을 실행시키는데에 있어 훨씬 수월하기 때문이다.


정리하자면 코드 영역은 나눠써도 스택은 나눠쓰기 불편하다는 뜻이 된다.


그럼 코드 영역은 공유시켜주고 스택 영역만 부리하면 자식 프로세스 생성해도 되지 않을까? 


그래서 이렇게 사용할 수 있는 쓰레드가 생성되었다.


다시 그림을 보자



부모 프로세스가 있다. 


부모 프로세스에 대한 흐름이 있다면 스레드 각각에 별도의 흐름도 필요하다. 즉, 스레드 A 흐름, 스레드 B 흐름도 존재한다.


이 스레드 흐름들을 위해 코드 영역에 코드를 넣는다. 부모 프로세스의 코드 영역을 공유하는 것이다.


여기서 말하는 공유는 부모프로세스가 가지고 있는 메모리 공간에 자리를 빌렸다는 뜻이다.


데이터 영역은 많이 사용하지 않으므로 공유할 수 있다.


heap도 할당했으면 철저하게 소멸을 시켜줘야 하므로 공유 할 수 있다.


단, 문제가 되는 stack 영역은 공유하지 않는다. 스레드들을 위한 별도의 stack 공간이 마련된다.


즉, code영역, data영역, heap영역, stack영역을 모두 가지고 있는 것을 프로세스라 하고 


그렇지 않고 프로세스와 영역을 공유하되, stack 영역만 따로 가지고 있는 것을 스레드라고 할 수 있다.


Comments