면접 질문 이라는 키워드로 검색을 하면, 가장 먼저 나오는 친구이다.
이 질문이 의미 없는 질문이라고 할 순 없겠지만, 왠만한 전공자라면 쉽게 답할 수 있는 질문이다.
대부분 다음과 같이 답하지 않을까?
프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이다.
반면, 스레드는 할당 받은 작업을 이용하는 단위이며, 프로세스 내에 여러 개 생길 수 있다.
다만, 이 질문 자체는 생각보다 깊게 파고들면 이야기 할 것이 많아 보였기에, 여러 측면에서의 차이를 정리해보기로 했다.
가장 먼저, 프로그램, 프로세스, 그리고 스레드의 기본 개념부터 알아보자.
운영체제를 배우지 않았다면, 위 세 용어 중 이것만 아는 경우가 대부분일 것이다.
프로그램 코드를 작성하고, 이 코드를 실행 가능한 파일로 만드는 작업을 거쳤다면, .exe와 같은 확장자를 가진 파일이 하나 생성될 것이다.
이 파일은 그것 자체로는 아무런 기능도 하지 않는다. 이 파일이 사용되기 위해선 메모리에 적재되어야 하는데, 적재되기 전 상태인 파일을 우리는 프로그램이라고 부른다.
반먄, 프로그램이 메모리에 적재가 되는 순간, 프로그램은 실행 되어 그것 자체로 다양한 작업을 수행할 수 있다.
윈도우에는 '작업 관리자', 맥에는 '활성 상태 보기'가 있는데, 이것들을 통해 확인하면 컴퓨터에는 다양한 프로세스가 실행중인 것을 볼 수 있다.
또, 잘 살펴보면 각각의 프로세스에 대해 사용중인 메모리, 스레드, CPU 사용률 등을 확인할 수 있는데, 우리는 이를 통해 프로세스가 운영체제가 자원을 할당하는 단위가 될 수 있다는 것도 간접적으로나마 알 수 있다.
프로세스를 설명할 때 사용한 이미지를 다시 보면, 각각의 프로세스가 여러 개의 스레드를 갖고 있는 것을 볼 수 있다.
그렇다면, 스레드란 무엇일까? 바로 작업을 수행하는 단위를 스레드라고 한다.
여러 번 말했지만 하나의 프로세스에 여러 개의 스레드가 존재하는 것을 확인할 수 있는데, 이를 통해 우리는 자원을 할당받는 단위와 실제 작업을 수행하는 단위가 다르다는 것을 확인할 수 있다.
그런데 이런 것을 보면 다음과 같이 질문하는 경우도 있다.
CPU 광고할 때, 8코어 16스레드라고 하잖아요. 프로세스가 갖고 있는 스레드와 CPU의 스레드는 무슨 차이에요?
사실 의미는 비슷하다. CPU의 작업 단위를 스레드라고 하기 때문이다. 일반적으로 프로세스를 스케쥴링 할 때 (헷갈리지 않도록 해당 문단에서는 프로세스로 용어를 통일함.) 하나의 코어당 하나의 프로세스를 처리할 수 있는데, 하이퍼 스레딩과 같은 기술이 나오면서 하나의 코어에 두 개의 스레드 (= 논리 코어)를 가질 수 있게 되었다.
즉, 8코어 16스레드라는 것은, 마치 논리적으로 16개의 코어가 있는 것 처럼 사용할 수 있다는 의미이다. 이와 같이 논리 코어의 수가 늘어난다면, 우리가 후술할 멀티스레딩을 활용한 프로그램을 작성할 때 더 효율적으로 동작할 수 있을 것이다.
이렇게 프로그램과 프로세스, 그리고 스레드의 차이를 알아봤다.
다만, 면접에서 실제로 이 질문을 한다면 프로세스와 스레드에 대한 깊은 이해를 하고 있는지 물어보기 위한 떡밥 (?) 같은 질문이므로, 이어서 꼬리물기 식의 추가 질문이 나올 가능성이 높다.
싱글 코어에서, 하나의 CPU는 하나의 프로세스만 작업할 수 있다. 그렇지만 우리는 싱글 코어 CPU가 달린 컴퓨터에서도 여러 작업을 동시에 수행할 수 있을 '것' 처럼 보였다.
실제로는, 하나의 작업을 매우 짧은 시간동안 처리 한 후 다른 작업으로 넘어가는 것을 반복하기 때문에 우리가 겉으로 보기엔 여러 작업들이 동시에 실행되는 것 처럼 보인다. (동시성: Concurrency)
이 과정에서, CPU는 기존에 수행했던 작업들을 어디까지 처리했는지 기록해야 이후 동일한 작업을 받았을 때 기존에 처리한 부분에 이어서 작업할 수 있으니, (우리는 기존 작업을 저장하고 다른 작업으로 바꾸는 과정을 Context Switching 라고 부르며, 추후 포스트에서 더 자세히 다룰 예정이다.) 어떤 식으로 저장할지 생각해 보아야 한다.
OS의 커널은 위 과정에서 프로세스를 관리하기 위해 PCB (Process Control Block) 이라는 자료구조를 사용한다.
OS 마다 PCB의 구조는 달라질 수 있지만, 대표적으로 다음과 같은 것들이 있다.
그런데, 실제 작업은 스레드 단위로 이뤄지는데, 별도의 자료구조가 필요하지 않을까? 그래서 실제로는 TCB (Thread Control Block) 이라는 자료구조도 존재한다.
스레드는 프로세스에 종속되어 있기 때문에, 어떤 프로세스에 속해 있는지에 대한 포인터를 갖고 있으며, 동시에 스레드에만 필요한 일부 정보만 갖고 있다.
앞에서 동시성을 언급할 때, 싱글 CPU를 가정했다. 하지만 실제로 우리가 쓰는 CPU는 멀티 코어를 갖고 있으며, 최근 CPU 들은 논리 코어 (= CPU 스레드) 를 더 갖고 있다. 즉, 이젠 여러개의 코어를 갖고 있으니, 한 번에 여러개의 작업들을 실제로 수행할 수 있다! (병렬성 : Parallelism)
즉, 이제 프로그램을 구동하기 위해 여러개의 CPU를 사용할 수 있다는 의미이니, 하나의 프로그램을 여러개의 프로세스를 사용하거나, 여러개의 스레드를 사용해서 동작시킬 수 있다!
각각의 특성에 대해 알아보고, 어떤 상황에 어떤 선택을 하면 좋을지 생각 해보자.
말 그대로 하나의 프로그램을 여러 개의 프로세스로 나눠서 사용하는 것이다.
위에서 올린 맥의 '활성 상태 보기'에서도 볼 수 있듯이, 하나의 프로세스가 여러개의 스레드를 갖고, 각각의 스레드가 서로 다른 작업들을 수행하는 것이다.
대부분의 프로그램은 이 선택지에서 멀티 스레딩을 선택한다.
대표적인 이유는 크게 세 가지로 볼 수 있다.
그렇지만, 멀티 프로세스를 아예 안 쓰는 것은 아니다.
대표적으로, 구글 크롬은 멀티 프로세스를 채택하고 있는데, 각각의 탭이나 확장 중 하나에 문제가 생겨도 전체 브라우저에 문제가 가지 않도록 각각을 서로 다른 프로세스로 분리시켜 관리하는 것이다.
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
https://teraphonia.tistory.com/802
https://velog.io/@dailyhyun/%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-vs-%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C
https://stackoverflow.com/questions/43269495/why-google-chrome-run-multiple-processes-when-there-is-single-tab-opened