본문 바로가기

CS/운영체제

프로세스와 스레드의 차이

개발자 면접에서 단골 질문인 "프로세스와 스레드의 차이를 설명하시오" 에 대해 정리해보려고 한다.

우선 둘의 차이를 알려면 각각의 개념에 대해서 알아볼 필요가 있다.

 

1) 프로세스란 무엇인가?

먼저, 프로세스에 대해 한번 알아보자.

 

대부분의 사람들이 무언가를 설명할때 힘들어하는 이유의 대부분의 단어의 정의를 제대로 알지못하기 때문이라고 생각한다. 

그래서 프로세스의 정의를 위키백과를 통해 검색해보면 

프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램 이라고 칭하고있다.

위 정의에서 우리는 3가지로 다시 쪼개볼 수 있다.

 

1. 컴퓨터 2. 연속적으로 실행 3. 프로그램

 

쪼개진 3가지를 이해하고 풀어내면 프로세스가 어떤 놈인지 알 수 있을것같다.

먼저 컴퓨터. 

사실 컴퓨터라는 말은 굉장히 방대하다. 어디서는 하드웨어의 집합일 수도 있고, 어디서는 소프트웨어를 말할 수 있고, 어디서는 단순히 휴대폰 단말기를 말할 수도 있고.. 

그럼 프로세스에게 컴퓨터는 무엇일까? 여기서 2번에서 힌트를 가져올 수 있다고 생각한다. 

2번. 연속적으로 실행 이라는 말은 컴퓨터내에서 살아서(?) 움직이는 듯한 의미를 주고 있다. 

컴퓨터내에서 살아있다는 말은 운영체제(OS) 소프트웨어에서 관리되고 실행되고 있다는 말과 같다고 생각한다. 

위의 말들을 쉽게 정리하자면,

우리가 흔히 많이 사용하는 카카오톡(3번 프로그램)을 실행을 시키게 되면 메모리(1번 컴퓨터)라는 곳에 프로그램들의 코드들이 실행되기 시작한다.(3번 연속적으로 실행) 

실행되는 프로그램 즉, 프로세스는 아래와 같은 컴퓨터안에 작은 공간을 할당을 받고 연속적인 실행되어진다.

이렇게 만들어지는 운영체제내에서 실행되는 프로그램의 단위를 프로세스라고 부른다. 

위에서 프로세스에게 할당된 4가지 영역 또한 개발자라면 알아야할 개념이기에 다음 포스팅에서 다루기로 하겠다.

간단하게 프로세스에 대한 정의를 알아봤으니 스레드로 넘어가도록 하자.

 

2) 스레드란 무엇인가?

스레드 또한 정의를 통해 알아보자. 

스레드의 정의는 프로세스내에서 실행되는 흐름의 단위 라고 정의되어있다.

프로세스는 운영체제내에서 실행되는 작업의 단위라고 하면 스레드는 프로세스내에서 실행되는 작업의 단위라고 이해하면 될 것 같다.

결국 프로세스든 스레드든, 프로그래머가 만든 명령어들의 조합들을 처리하는 녀석들인데 스레드의 개념은 왜 탄생하였을까?

 

이것을 설명하기엔 가장 적절한 예시는 식당(레스토랑)의 운영 프로세스가 좋은 예시라고 생각한다. 

식당에는 주인(매니저)가 있을테고 매니저 밑에는 식당의 일을 처리하는 직원, 알바생들이 있을 것이다.

매니저가 직원을 고용하는 이유는 하나이다. 좀 더 효율적으로 작업을 처리하기 위함이다. 

스레드 또한 마찬가지이다. 

프로세스 혼자서 많은 작업들을 처리하기엔 과부하이며 비효율적이다.

이러한 문제를 해결하기위해 스레드가 등장했다고 생각하며 스레드의 정체성을 제대로 이해하기 위해선 자연스럽게 멀티스레딩의 개념을 알아야 한다고 생각한다. 

멀티스레딩의 개념 또한 많은 내용을 포함하기에 다음 포스팅으로 미루겠다.

정리하자면, 프로세스는 식당의 주인(매니저)이다. 매니저는 혼자서도 서빙, 요리, 계산까지 할 수는 있지만 

사람이 많아지고 요청이 많아질경우 혼자 일하는건 결코 쉽지도 않으며 좋은 서비스는 아닐 것이다. 

이러한 문제를 해결하기 위해 직원,알바생(스레드)가 필요할 것이다. 

그렇다면 위에서 정리했던 프로세스와 스레드의 개념의 차이는 도대체 무엇일까?

 

3) 결국 둘의 차이는 무엇일까?

위에서 열심히 예시와 개념을 정리한 이유는 3번에 대한 질문을 답하기 위함이였을 것이다.

얼핏보면 대부분 같아보이지만 이 둘의 차이는 분명 존재할 것이다. 

이 포스팅의 목적에 맞게 둘의 차이점을 한 번 알아보자.

 

3번의 답을 하기위해 위에서 예시로 들었던 식당 예시로 돌아가면 답을 내릴 수 있을 것이다.

프로세스는 식당의 주인이다. 즉 식당안에서 대부분의 자원들은 주인의 것일 것이다. 반면 스레드는 주인이 고용한 사람이기에

식당의 모든 자원들을 소유하지는 못할것이다. 작업처리만을 위해서 태어난 존재이기에 작업이 필요한 최소한의 공간만 주어진다.

우리는 각 스레드에게 독립적으로  주어진 공간의 이름을 스택(stack)이라고 부른다. (위 그림 참고)

나머지 공간들은 다른 스레드(동료)과 식당의 자원들을 공유하게 된다. 

 

정리하자면, 프로세스와 스레드 모두 작업을 위해 태어난 존재라는 공통점이 있지만

주어진 공간(메모리)상에서 할당된 공간에 차이가 있다는 점이다. 

프로세스는 Code, Data, Heap, Stack 이라는 공간을 운영체제로부터 독립적인 공간을 할당받았고 

스레드는 프로세스의 Stack 공간만이 독립적으로 할당받았다는 점이 가장 큰 차이라고 생각한다. 

 

마치며..

둘이 차이를 정리하면서 가장 많이 다뤘던 부분이 메모리상의 공간개념이었는데 

다음 포스팅에서는 이 공간(?)이 얼마나, 어떻게, 왜 사용되는지 알아보려고 한다. 

 

그럼 끝.

'CS > 운영체제' 카테고리의 다른 글

동시성에 대해서(동기 vs 비동기)  (0) 2023.03.20
프로세스의 메모리 구조  (1) 2023.01.11