[운영체제] 프로세스와 스레드의 차이

VSFe·2022년 2월 9일
1

CS

목록 보기
1/5
post-custom-banner

면접 질문 이라는 키워드로 검색을 하면, 가장 먼저 나오는 친구이다.

이 질문이 의미 없는 질문이라고 할 순 없겠지만, 왠만한 전공자라면 쉽게 답할 수 있는 질문이다.

대부분 다음과 같이 답하지 않을까?

프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이다.
반면, 스레드는 할당 받은 작업을 이용하는 단위이며, 프로세스 내에 여러 개 생길 수 있다.

다만, 이 질문 자체는 생각보다 깊게 파고들면 이야기 할 것이 많아 보였기에, 여러 측면에서의 차이를 정리해보기로 했다.


프로그램, 프로세스, 그리고 스레드

가장 먼저, 프로그램, 프로세스, 그리고 스레드의 기본 개념부터 알아보자.

프로그램

운영체제를 배우지 않았다면, 위 세 용어 중 이것만 아는 경우가 대부분일 것이다.

프로그램 코드를 작성하고, 이 코드를 실행 가능한 파일로 만드는 작업을 거쳤다면, .exe와 같은 확장자를 가진 파일이 하나 생성될 것이다.

이 파일은 그것 자체로는 아무런 기능도 하지 않는다. 이 파일이 사용되기 위해선 메모리에 적재되어야 하는데, 적재되기 전 상태인 파일을 우리는 프로그램이라고 부른다.

프로세스

반먄, 프로그램이 메모리에 적재가 되는 순간, 프로그램은 실행 되어 그것 자체로 다양한 작업을 수행할 수 있다.

윈도우에는 '작업 관리자', 맥에는 '활성 상태 보기'가 있는데, 이것들을 통해 확인하면 컴퓨터에는 다양한 프로세스가 실행중인 것을 볼 수 있다.

또, 잘 살펴보면 각각의 프로세스에 대해 사용중인 메모리, 스레드, CPU 사용률 등을 확인할 수 있는데, 우리는 이를 통해 프로세스가 운영체제가 자원을 할당하는 단위가 될 수 있다는 것도 간접적으로나마 알 수 있다.

스레드

프로세스를 설명할 때 사용한 이미지를 다시 보면, 각각의 프로세스가 여러 개의 스레드를 갖고 있는 것을 볼 수 있다.

그렇다면, 스레드란 무엇일까? 바로 작업을 수행하는 단위를 스레드라고 한다.

여러 번 말했지만 하나의 프로세스에 여러 개의 스레드가 존재하는 것을 확인할 수 있는데, 이를 통해 우리는 자원을 할당받는 단위와 실제 작업을 수행하는 단위가 다르다는 것을 확인할 수 있다.

그런데 이런 것을 보면 다음과 같이 질문하는 경우도 있다.

CPU 광고할 때, 8코어 16스레드라고 하잖아요. 프로세스가 갖고 있는 스레드와 CPU의 스레드는 무슨 차이에요?

사실 의미는 비슷하다. CPU의 작업 단위를 스레드라고 하기 때문이다. 일반적으로 프로세스를 스케쥴링 할 때 (헷갈리지 않도록 해당 문단에서는 프로세스로 용어를 통일함.) 하나의 코어당 하나의 프로세스를 처리할 수 있는데, 하이퍼 스레딩과 같은 기술이 나오면서 하나의 코어에 두 개의 스레드 (= 논리 코어)를 가질 수 있게 되었다.

즉, 8코어 16스레드라는 것은, 마치 논리적으로 16개의 코어가 있는 것 처럼 사용할 수 있다는 의미이다. 이와 같이 논리 코어의 수가 늘어난다면, 우리가 후술할 멀티스레딩을 활용한 프로그램을 작성할 때 더 효율적으로 동작할 수 있을 것이다.

이렇게 프로그램과 프로세스, 그리고 스레드의 차이를 알아봤다.

다만, 면접에서 실제로 이 질문을 한다면 프로세스와 스레드에 대한 깊은 이해를 하고 있는지 물어보기 위한 떡밥 (?) 같은 질문이므로, 이어서 꼬리물기 식의 추가 질문이 나올 가능성이 높다.


PCB와 TCB

싱글 코어에서, 하나의 CPU는 하나의 프로세스만 작업할 수 있다. 그렇지만 우리는 싱글 코어 CPU가 달린 컴퓨터에서도 여러 작업을 동시에 수행할 수 있을 '것' 처럼 보였다.

실제로는, 하나의 작업을 매우 짧은 시간동안 처리 한 후 다른 작업으로 넘어가는 것을 반복하기 때문에 우리가 겉으로 보기엔 여러 작업들이 동시에 실행되는 것 처럼 보인다. (동시성: Concurrency)

이 과정에서, CPU는 기존에 수행했던 작업들을 어디까지 처리했는지 기록해야 이후 동일한 작업을 받았을 때 기존에 처리한 부분에 이어서 작업할 수 있으니, (우리는 기존 작업을 저장하고 다른 작업으로 바꾸는 과정을 Context Switching 라고 부르며, 추후 포스트에서 더 자세히 다룰 예정이다.) 어떤 식으로 저장할지 생각해 보아야 한다.

OS의 커널은 위 과정에서 프로세스를 관리하기 위해 PCB (Process Control Block) 이라는 자료구조를 사용한다.

OS 마다 PCB의 구조는 달라질 수 있지만, 대표적으로 다음과 같은 것들이 있다.

  • 프로세스 상태: New, Ready, Running, Waiting, Halted 등의 상태를 갖고 있다.
  • 프로세스 번호 (PID): 프로세스의 고유 번호로, 현재 실행되는 모든 프로세스의 PID는 다르다.
  • 프로그램 카운터: 이 프로세스가 다음에 실행할 명령어의 주소를 가리킨다.
  • CPU 레지스터들: CPU 레지스터는 컴퓨터의 구조에 따라 다양한 수와 유형을 가지며, 여기에는 누산기, 인덱스 레지스터, 스택 레지스터 등의 정보를 갖고 있으며 인터럽트 발생시 다시 저장된다.
  • CPU 스케쥴링 정보: 프로세스 우선순위, 스케쥴 큐에 대한 포인터와 스케쥴 매개변수를 포함한다. (이후 포스트에서 스케쥴링에 대해 작성할 예정)

그런데, 실제 작업은 스레드 단위로 이뤄지는데, 별도의 자료구조가 필요하지 않을까? 그래서 실제로는 TCB (Thread Control Block) 이라는 자료구조도 존재한다.

스레드는 프로세스에 종속되어 있기 때문에, 어떤 프로세스에 속해 있는지에 대한 포인터를 갖고 있으며, 동시에 스레드에만 필요한 일부 정보만 갖고 있다.


Multi-Process와 Multi-Thread

앞에서 동시성을 언급할 때, 싱글 CPU를 가정했다. 하지만 실제로 우리가 쓰는 CPU는 멀티 코어를 갖고 있으며, 최근 CPU 들은 논리 코어 (= CPU 스레드) 를 더 갖고 있다. 즉, 이젠 여러개의 코어를 갖고 있으니, 한 번에 여러개의 작업들을 실제로 수행할 수 있다! (병렬성 : Parallelism)

즉, 이제 프로그램을 구동하기 위해 여러개의 CPU를 사용할 수 있다는 의미이니, 하나의 프로그램을 여러개의 프로세스를 사용하거나, 여러개의 스레드를 사용해서 동작시킬 수 있다!

각각의 특성에 대해 알아보고, 어떤 상황에 어떤 선택을 하면 좋을지 생각 해보자.

Multi Process

말 그대로 하나의 프로그램을 여러 개의 프로세스로 나눠서 사용하는 것이다.

장점

  • 각각의 프로세스는 OS에게 자원을 할당 받으므로, 서로의 메모리를 침범하지 않는다.
  • 각각의 프로세스에 문제가 생겨도 다른 프로세스에는 영향을 미치지 않는다. (즉, 안정적이다.)

단점

  • 각각의 프로세스는 서로 독립된 메모리 공간을 할당 받았기 때문에, 서로 메모리를 공유하기 위해선 IPC (Inter Process Communication) 기법을 사용해 공유해야 하는데, 이 과정에서 추가적인 설비가 필요하기도 하고 다소 비효율적이다.
  • Context Switching이 발생하면 시간이 오래 걸리게 된다.

Multi Thread

위에서 올린 맥의 '활성 상태 보기'에서도 볼 수 있듯이, 하나의 프로세스가 여러개의 스레드를 갖고, 각각의 스레드가 서로 다른 작업들을 수행하는 것이다.

장점

  • 프로세스를 추가적으로 생성하지 않기 때문에, 비용 측면에서 매우 효율적이다.
  • 스레드는 동일한 프로세스 내 자원을 공유하기 때문에, 데이터를 공유하는 데 있어 프로세스에 비해 효율적이다.

단점

  • 공통된 자원을 공유하기 때문에, 설계가 다소 어렵다.
  • 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 발생한다.

어떤 것을 써야 할까?

대부분의 프로그램은 이 선택지에서 멀티 스레딩을 선택한다.

대표적인 이유는 크게 세 가지로 볼 수 있다.

  • 멀티 프로세스의 경우, 멀티 프로세스를 시작하기 위해 여러개의 프로세스를 실행해야 하는데, 이 과정에서 많은 비용이 소모된다.
  • 각각의 프로세스가 Context Switching 되는 과정에서도 많은 비용이 소모되는 문제가 있다.
  • IPC보다 스레드의 자원 공유 방식이 더 빠르다.

그렇지만, 멀티 프로세스를 아예 안 쓰는 것은 아니다.

대표적으로, 구글 크롬은 멀티 프로세스를 채택하고 있는데, 각각의 탭이나 확장 중 하나에 문제가 생겨도 전체 브라우저에 문제가 가지 않도록 각각을 서로 다른 프로세스로 분리시켜 관리하는 것이다.

Reference

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

profile
아직 많이 공부 중...
post-custom-banner

0개의 댓글