프로세스와 스레드

- 프로세스와 스레드는 프로그램을 실행하는 데 있어 결코 빠져서는 안되는 필수 요소에요. 이것들은 아래와 같이 짧게 정의할 수 있어요. 짧게 읽어보고 아래에서 좀 더 자세히 살펴보도록 해요.

- 프로세스 : 운영체제로부터 시스템 자원을 할당받는 작업의 단위 (메모리에 올라와 실행되고 있는 프로그램의 인스턴스)

- 스레드 : 프로세스가 운영체제로부터 할당받은 자원을 이용하는 실행 흐름의 단위 (프로세스 내에서 실행되는 여러 흐름의 단위)

Program

- 프로세스 설명을 위해서, 프로그램이 무엇인지 알고 넘어가야 해요. 아래 정리를 보고 프로그램이 뭔지 확인하도록 해요.

파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태인 어떤 작업을 위해 실행할 수 있는 파일

즉, 어떤 작업을 위해 실행할 수 있는 파일이지만 아직 실행되지 않은 파일 그 자체

메모리에 올라가있지 않다는 말은, 아직 운영체제가 프로그램에게 독립적인 메모리 공간을 할당해주지 않았다는 뜻이에요. 모든 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해 줘야 실행될 수 있어요.

정적인 상태라는 말은, 단어 그대로 움직이지 않는 상태라는 뜻이에요. 한 마디로 아직 실행되지 않고 가만히 있다는 뜻이에요.

Process

- 프로세스는 위에서 운영체제로부터 시스템 자원을 할당받는 작업 단위라고 했어요. 좀 더 알아보도록 해요.

실행 파일(프로그램)에게 의미를 부여하기 위해서는 프로그램을 실행해야 해요. 프로그램을 실행하는 순간 해당 파일은 컴퓨터 메모리에 올라가게 되는데, 이 상태의 프로그램을 프로세스라고 말해요.

"프로그램을 실행하려고 운영체제로부터 시스템 자원을 할당받기 때문에, 운영체제로부터 할당받는 작업의 단위구나" 라고 이해하면 되요.

프로그램이 실행되어 파일이 컴퓨터 메모리에 올라간 상태를 동적인 상태라고 말해요. 즉, 프로세스는 실행되고 있는 동적 상태의 프로그램이에요.

프로세스는 운영체제로부터 여러 시스템 자원을 할당받아요. 그 종류는 다음 사진의 아래부분과 같아요.

각 프로세스는 최소 하나의 스레드를 가져요. 스레드가 무엇인지는 곧 다룰거에요.

각 프로세스는 별도 주소공간에서 실행되며, 일반적으로 다른 프로세스의 변수나 자료구조에 접근할 수 없어요. 왜냐하면 각 프로세스는 독립적이기 때문이에요.

하지만, 커널 영역에서 프로세스들끼리도 서로 데이터를 주고받는 방법이 존재하긴 해요. 그게 바로 IPC(Inter Process Communication)에요.

hero

Thread

- 스레드는 위에서, 프로세스 내에서 실행되는 작업의 여러 흐름단위라고 언급했어요. 조금 더 자세히 알아보도록 해요.

유튜브로 비유해보자면, 우리는 영상을 다운받을 수도 있어야하고 동시에 영상을 볼 수도 있어야 해요. 이렇게 한 프로세스 내에서 여러 갈래의 작업이 동시에 진행될수 있어야 하는데, 이 갈래가 바로 스레드에요.

스레드는 프로그램을 하나의 프로세스로 실행했을 때, 프로그램 하나가 단순히 한 가지 작업만을 하게 된다는 단점을 해결하기 위해 등장했어요.

그래서 우리는 스레드가 프로세스의 코드에 정의된 절차에 따라 실행되는 경로이자, 프로세스 내에서 실행되는 여러 흐름의 단위로 생각할 수 있어요.

스레드는 프로세스 내에서 각각 별도의 Stack를 갖고있지만, Code, Data, Heap형식의 영역은 공유해요. 즉, 프로세스 내의 할당된 메모리공간을 스레드끼리 공유하면서 실행할 수 있다는 말이에요. 프로세스와 다르게 말이죠.

스레드는 프로세스와 다르게 프로세스의 자원을 공유하면서 작동하기 때문에, 스레드들은 프로세스 실행 흐름의 일부가 되는 것으로 이해할 수 있어요.

만약, 한 스레드가 프로세스 자원을 변경하면 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있어요. 서로가 같은 프로세스의 자원에 접근할 수 있으니까요.

hero

차이

- 위의 설명을 보면서 짐작하실 수 있겠지만, 프로세스와 스레드는 분명한 차이를 가지고 있어요. 그 내용을 좀 더 깊게 파고들어봐요.

구분ProcessThread
영역운영체제에 의해 각각 독립된 메모리 영역 할당프로세스가 할당 받은 메모리 영역에서 Stack영역은 따로 할당받고, Code/Data/Heap 메모리 영역은 공유
공유각각 독립된 메모리 영역을 할당받으므로 다른 프로세스의 변수나 자료에 접근 불가별도의 Stack영역을 가지고 있지만 Heap 메모리와 같은 영역은 서로 읽고 쓸 수 있음
오류 전파각 프로세스의 메모리 영역은 서로 독립적이므로, 오류 전파의 걱정이 적음Code/Data/Heap 메모리 영역의 내용을 공유하므로 특정 스레드에서 오류 발생 시, 같은 프로세스 내의 다른 스레드에 영향을 미침
단위운영체제로부터 시스템 자원을 할당받는 작업 단위 (운영체제 입장에서 최소 작업 단위)프로세스 내에서 실행되는 흐름의 단위 (CPU 입장에서의 최소 작업 단위)

Multi Process

- 멀티프로세스는 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업(태스크)을 처리하도록 하는 것이에요.

- 멀티프로세스는 각 프로세스의 메모리 구분이 필요하거나, 독립된 주소공간을 가져야 할 경우 사용할 수 있어요.

먼저, 멀티 프로세스의 장점에 대해 언급해볼게요.

멀티 프로세스는 독립된 메모리 구조를 가지기 때문에, 프로세스 중 하나에 문제가 발생해도 다른 프로세스에게 치명적 영향이 확산되지 않는다는 안전성이 있어요.

독립된 메모리 구조를 가짐으로 서로의 변수와 자료구조에 접근하지 못하기 때문에 동기화 작업이 별도로 요구되지는 않으나, 만약 프로세스 간 통신이 필요하면 IPC라는 복잡한 기법을 사용해야 해요.

다음으로, 멀티 프로세스의 단점에 대해 언급해볼게요.

멀티 프로세스는 멀티 스레드보다 더 많은 메모리 공간과 CPU 자원을 차지해요. 운영체제로부터 시스템 자원을 할당받는 작업 단위가 여러 개니까 더 많은 CPU 자원을 할당한다고 생각하면 되요.

Context Switching발생 시, 캐시 메모리 초기화 등의 무거운 작업들을 동반하여 비용과 시간이 많이 소모되는 오버헤드가 발생할 수 있어요. Context Switching은 CPU가 한 번에 하나의 프로세스만 실행 가능하기 때문에 등장한 개념이에요.

좀 더 자세히 설명하자면, CPU에서는 여러 프로세스를 돌아가면서 한 번에 하나씩 작업을 실행해요. 만약 어떠한 이유로 동작 중인 프로세스가 대기 상태로 이동해야 한다면, 다음에 이 프로세스가 다시 CPU 자원을 받아 올라왔을 때 작업을 이어서 진행해야 할 거에요.

즉, 프로세스는 대기 상태로 넘어가면서 해당 프로세스의 상태(Context)를 보관해야 해요.같은 맥락으로, 대기하고 있던 다음 순서의 프로세스는 CPU 자원을 할당받아 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업이 동반되어야 하겠죠? 이런 일련의 과정이 Context Switching이에요.

Multi Thread

- 멀티스레드는 하나의 응용프로그램을 여러 개의 스레드로 구성하고, 각 스레드로 하여금 하나의 작업을 처리하도록 하는 것이에요. 대표적으로 웹 서버가 있어요.

- 프로그램이 시작할 때 메인 스레드가 실행되고, 메인 스레드는 작업을 처리하기 위해 새로운 스레드를 생성해요. 이들은 병렬로 실행되며, 실행이 완료되면 메인 스레드와 결과를 동기화하는 방식으로 진행되요.

먼저, 멀티 스레드의 장점에 대해 언급해볼게요.

프로세스를 생성해 자원을 할당하는 system call이 줄어들어 자원을 효율적으로 관리할 수 있어요. 즉, 시스템 자원의 소모를 줄임으로써 자원의 효율성을 증대시키고 시스템 처리량이 증가하게 되요.

또, 프로세스에 비해 스레드 간 데이터를 주고 받는 것이 간단하기 때문에 통신 부담이 적고, 마찬가지로 시스템 자원 소모가 줄어들게 되요. 덕분에 스레드 사이의 작업량이 적어 Context Switching이 빨라요.

프로세스에서의 Context Switching은 서로 공유하는 데이터가 없으므로 캐시가 쌓아놓은 데이터들이 무너지고, 새로 캐시 정보를 쌓아야 해요. 하지만, 스레드에서의 캐시 데이터는 스레드가 바뀌어도 공유하는 데이터가 있으므로 의미가 있어요. 그래서 Context Switching이 빠른 거에요.

다음으로, 멀티 스레드의 단점에 대해 언급해볼게요.

멀티 스레드의 경우 자원을 공유하기 때문에, 각 스레드가 같은 공유 자원의 내용에 접근하고, 수정을 가할 경우 동기화 문제가 발생할 우려가 있어요.

그래서, 스레드의 공유 자원 접근에 대해 주의 깊은 설계가 필요하며, 디버깅이 까다로운 점이 있어요.

다른 프로세스(프로세스 밖)에서 스레드 각각을 제어할 수 없으며, 하나의 스레드만 오류로 종료되어도 전체 스레드가 종료될 수 있어요.

마지막으로 하나의 스레드만 실행중일 때에는 실행시간이 되려 지연될 수 있어요. 여러 작업을 할 목적으로 멀티 스레드를 설계했을텐데, 하나의 스레드만 동작한다면 문제가 되겠죠?

그 외 추천 유튜브 영상

얄팍한 코딩사전

프로세스는 뭐고 스레드는 뭔가요?

유튜브 보러가기

우아한Tech

[10분 테코톡] 🌷 코다의 Process vs Thread

유튜브 보러가기

큰돌의터전

[CS전공지식면접] 프로세스와 스레드의 차이는?

유튜브 보러가기