들어가며
“프로세스와 스레드의 차이점”은 면접을 위해 준비해야 할 중요한 주제이기도 합니다. 프로세스와 스레드에 대해 소개하고, 둘의 차이점에 대해 소개합니다.
먼저, 프로세스를 소개하기 전, 프로그램에 대해 알아봅시다.
❏ 프로그램(Program)
프로그램(Program)이란, 어떠한 작업을 위해 실행할 수 있는 파일입니다.
흔히 어떠한 프로그램을 설치하고자, 다운로드를 받은 파일을 살펴보면 확장자가 “.exe”라고 되어있는 것을 볼 수 있습니다. 이를 프로그램이라고 합니다.
아직 프로그램을 실행하지 않았기에 운영체제로부터 자원을 할당 받지 않은 상태로, 메모리에 올라가 있지 않은 상태입니다.
자, 이제 코드 덩어리 상태일 뿐인 멈춰있는 프로그램을 실행시켜 보도록 합시다. 프로그램을 실행을 하게 된다면, 어떠한 일이 발생하게 될까요?
❏ 프로세스(Process)
프로그램 실행을 위해서는 자원이 필요합니다. 이러한 자원은 운영체제로부터 할당 받을 수 있습니다.
현재 실행되어 돌아가고 있는 프로그램들을 확인해보면, 여러 프로세스를 확인해볼 수 있습니다.
이처럼 메모리에 올라가 있으며, 운영체제로부터 CPU(자원)을 할당 받은 작업의 단위를 프로세스(Process)라 합니다.
❗ 프로그램 VS. 프로세스
프로그램 | 프로세스 |
작업을 실행할 수 있는 파일 | 실행하여 작업 중인 프로그램 |
메모리에 올라가 있지 않고, 할당 받은 자원이 없는 상태 | 메모리에 올라가 있으며, 자원을 할당받은 상태 |
❍ 동시성(Concurrency)
프로세스의 작업 특징 중 동시성이란, 여러 가지 Task들을 Context Switching하며 작업하는 것을 말합니다.
하나의 작업이 완료될 때까지 기다린 후에 다음 작업을 진행하는 것은 매우 느리고 비효율적입니다. 따라서, 현재의 작업을 저장한 후, 다음 작업으로 교체하여 실행하는 것을 Context Switching라고 합니다.
Context Switching은 매우 짧고 빠르게 이루어지며 반복합니다. 그렇기에 여러 가지 일이 한 순간에 처리되는 것처럼 보입니다.
때문에 “동시에 실행”되고 있는 것처럼 보이게 되는데, 여기서 말하고 있는 동시성은 “동시에 실행”을 의미하는 것이 아니며, 빠르고 반복적으로 교체되고 있는 것임을 헷갈리지 않도록 합시다!
❍ 병렬성(Parallelism)
두 번째 작업 특징인 병렬성이란, 동일한 시간에 독립적으로 작업이 실행되어 동시성과 달리, 실제로 동시에 작업이 일어납니다.
연산을 수행하는 CPU의 핵심 요소인 코어가 여러 개 달려 있는 경우, 코어의 개수만큼 프로세스를 실행할 수 있게 됩니다. 따라서, 동시성처럼 교체하는 형태가 아닌, 각 코어에 분담하여 작업을 실행할 수 있게 되는 것입니다.
우리는 이처럼 항상 카카오톡, 인텔리제이, 노션 등 다양한 프로그램을 실행하여 여러 프로세스를 사용하고 있습니다.
여러 프로세스를 사용하게 된다면, 자원을 각자 할당받아 그만큼의 메모리가 차지하게 되고, 중복되어 사용될 수 있는 자원은 공유가 불가능합니다.
이러한 한계점은 스레드를 통해 해결할 수 있습니다.
❏ 스레드(Thread)
하나의 프로그램을 처리하기 위해서, 프로세스보다도 더 작은 단위를 스레드(Thread)라고 합니다.
즉, 하나의 프로세스 내에는 최소 하나의 스레드가 존재하며, 여러 개의 스레드가 존재할 수 있습니다.
프로세스의 한계였던, 중복된 자원의 공유! 스레드는 가능합니다.
프로세스에게 할당된 자원은 같은 프로세스 내에서의 스레드간 공유하여, 불필요한 중복을 최소화할 수 있습니다.
메모리 구조에는 Code, Data, Stack, Heap 영역이 존재하는데, 이 중 Code, Data, Heap 영역을 공유하고, Stack 영역은 독립적으로 사용합니다.
❓Stack 영역은 왜 독립적일까
Stack 영역은 함수 호출과 관계되는 지역 변수, 매개 변수가 저장되는 메모리 공간이다 보니, 스레드의 독립적인 함수 호출을 위하여 Stack 영역은 독립적인 공간으로 할당하게 되는 것입니다.
❗ 프로세스 VS. 스레드
프로세스
- 하나의 프로세스가 중지 되어도 다른 프로세스에게 영향이 없다.
- 오버 헤드, Context Switching에 의한 성능 저하 발생 가능성이 있다.
스레드
- 하나의 스레드가 중지 되면, 다른 모든 스레드가 같이 영향을 받는다.
- 메모리를 공유하므로 스레드간 접근이 가능하다.