Intro

스레드… 기술 인터뷰 단골 질문이지만 항상 이런 것이다라고 명확히 설명하기 힘들었던 단어입니다. 오늘부터는 누군가 물어봤을 때 스레드는 바로 이것이지 하고 설명할 수 있게 공부해 봅시다.

스레드는 프로세스와 관련이 많습니다. 프로세스의 내부 동작방식을 설명하는 단어이기 때문이에요. 만약 프로세스가 무엇인지 잘 모른다면 CS - Process 란? 포스트를 반드시 먼저 읽어주세요.

스레드의 정의

스레드란 프로세스가 할당받은 자원을 이용하는 실행의 단위 혹은 프로세스의 특정한 경로 입니다. 이전 포스트에서 프로세스는 운영체제로부터 메모리를 할당받는다고 했었죠? 이 메모리 자원을 효율적으로 활용할 수 있게 돕는 것이 스레드가 하는 일입니다.

프로세스가 할당받은 메모리의 구조는 크게 4가지의 영역(Stack, Code, Data, Heap)으로 나뉩니다. 그리고 스레드는 이 영역들 중 1가지 Stack 영역은 독립적으로 할당받고, 남은 3가지 Code, Data, Heap 영역을 여러 스레드가 공유하게 됩니다.

한 프로세스 내에서 스레드끼리 영역을 공유한다는 것은 서로 같은 영역을 읽고 쓸 수 있다는 말과 같습니다. 즉 한 스레드가 어떤 자원을 변경한 경우 다른 스레드가 변경 결과를 즉시 알 수 있는거에요. 효율적으로 데이터를 공유하며 작업이 이루어지는 것 입니다.

최대한 쉽게 설명을 하려 했지만 이렇게 이론적인 내용만 듣고 한 번에 이해하고 기억하기는 쉽지 않을거에요. 이해를 돕기 위해 현실에서 프로세스와 스레드의 관계와 비슷한 예시를 찾아보겠습니다.

콘센트를 떠올려보세요.

Plug 이미지

콘센트는 활용할 수 있는 전력의 최대치가 정해져 있습니다. 프로세스가 콘센트라고 가정 해보면 최대 전력치는 운영체제로부터 할당받은 최대 활용 가능한 자원이에요.

이제 이 콘센트를 사용해 아이폰, 아이패드, 맥북, 그리고 애플워치를 모두 충전해야 하는 상황이라 가정합시다. 하지만 콘센트 구멍이 한개인 상황에서 기기 4대를 모두 충전하려면… 생각만해도 답답해 지네요.

콘센트는 이 기기들을 동시에 충전해도 될만큼 충분한 최대 전력이 공급되고 있지만 연결 통로가 모자라 비효율적으로 충전할 수 밖에 없는 상황이에요. 해결 방법이 있을까요?

Plug 이미지

다들 진작에 생각하셨을거에요. 바로 멀티탭!!

멀티탭을 사용하면 이 상황을 간단하게 해결할 수 있어요. 콘센트에 공급되는 전력에 접근할 수 있는 경로를 늘려 최대 전력을 효율적으로 사용할 수 있습니다.

이제 스레드의 정의를 다시 한번 읽어봅시다. 스레드란 프로세스가 할당받은 자원을 이용하는 실행의 단위 혹은 프로세스의 특정한 경로 입니다. 스레드는 프로세스에 할당된 최대 자원을 효율적으로 사용할 수 있게 돕는 일종의 멀티탭 개념이에요.

한 콘센트에서 공급되는 전력을 멀티탭에서 공유하는 모습이 프로세스가 할당받은 자원을 스레드가 서로 공유하며 나눠 쓰는 모습과 유사합니다. 이제 스레드가 무엇이지 알겠나요?

Wrap Up

이렇게 스레드가 무엇인지 이해하는 시간을 가져보았습니다. 어떤 프로그래밍을 하더라도 스레드는 반드시 마주쳐야 하는 주제니까 예시로 설명드린 콘센트와 연관시켜서 기억할 수 있도록 해보세요!

References

[OS] 프로세스와 스레드의 차이
Process vs Thread: What’s the difference?