✅들어가면서
나는 컴퓨터로 과제를 하거나 공부를 할 때 노래를 듣기도 하고, 파일을 다운로드하는 등 여러 작업을 동시에 수행하곤 한다. 이처럼 지금은 너무 당연하게 여러 작업을 동시에 수행하지만 멀티태스킹이 가능해지기 전에는 한 번에 하나의 작업만 처리할 수 있었다고 한다. 오늘날 우리가 컴퓨터를 이렇게 쾌적하게 사용할 수 있는 이유는 운영체제가 여러 개의 프로세스를 동시에 실행하고 관리해주기 때문이다. 그렇다면 여기서 등장하는 프로세스와 스레드는 무엇인지 알아보도록 하자.
⭐프로세스와 스레드의 정의는?
먼저 프로세스와 스레드가 무엇인지 정의부터 알아보자.
프로세스: 컴퓨터에서 연속적으로 실행되고 있는 프로그램
스레드: 프로세스 내에서 실행되는 흐름의 단위
비개발자나 이제 막 개발 공부를 시작한 사람에게는 정의만 들어봤을 때 이게 무슨 뜻인지 쉽게 이해하기 힘들다.
프로세스와 스레드를 이해하려면 먼저 프로그램이 무엇인지 알아볼 필요가 있다. ‘프로그램’이라는 단어는 우리가 일상생활에서도 자주 사용하는 익숙한 단어다. 하지만 막상 프로그램의 정의가 무엇인지 물어보면 선뜻 설명하기가 쉽지 않다. 그렇다면 먼저 프로그램이 무엇인지부터 살펴보자.
⭐프로그램 → 프로세스 → 스레드
1️⃣ 프로그램 → 프로세스
프로그램: 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태
이 정의도 무슨 소리인지 이해하기 힘들 수 있다. 지금부터 천천히 설명해보도록 하겠다.
- 메모리에 올라가 있지 않은: 아직 운영체제가 프로그램에게 독립적인 메모리 공간을 할당해주지 않았다는 뜻이다. 모든 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해 줘야 실행될 수 있다.
- 정적인 상태: '정적'이라는 단어 그대로, 움직이지 않는 상태라는 뜻이다. 한 마디로 아직 실행되지 않고 가만히 있다는 뜻이다.
결론부터 말하자면 프로그램이라는 단어는 아직 실행되지 않은 파일 그 자체를 가리키는 말이다. 윈도우의 *.exe 파일이나 MacOS의 *.dmg 파일 등등 사용자가 눌러서 실행하기 전의 파일을 말한다. 쉽게 말해서 그냥 코드 덩어리다.
자, 그러면 이제 그 실행 파일(프로그램)에게 의미를 부여하기 위해 프로그램을 실행해 보자. 프로그램을 실행하는 순간 해당 파일은 컴퓨터 메모리에 올라가게 되고, 이 상태를 동적인 상태라고 하며 이 상태의 프로그램을 프로세스라고 한다. 지금까지의 내용을 이해하기 쉽도록 간단히 그림으로 표현하면 다음과 같다.

정리하자면 프로그램은 코드 덩어리 파일, 그 프로그램을 실행한 게 프로세스.
2️⃣ 프로세스 → 스레드
서론에서 말한 것처럼 과거에는 프로그램을 실행할 때 실행 시작부터 실행 끝까지 프로세스 하나만을 사용해서 진행했다고 한다. 그렇기 때문에 어떤 파일을 다운 받으면 다운이 완료될 때까지 다른 작업을 하지 못하고 하루종일 기다려야 했다. 그렇다고 동일한 프로그램을 여러 개의 프로세스로 만들게 되면, 그만큼 메모리를 차지하고 CPU에서 할당받는 자원이 중복되게 될 것이다. 이러한 프로세스 특성의 한계를 해결하기 위해 나온 개념이 바로 스레드다.
스레드란 하나의 프로세스 내에서 동시에 진행되는 작업 갈래, 흐름의 단위를 말한다.
예를 들어 크롬 브라우저가 실행되면 프로세스 하나가 생성될 것이다, 그런데 우리는 브라우저에서 파일을 다운 받으며 노래를 듣고 다른 영상을 보기도 한다.

즉, 하나의 프로세스 안에서 여러가지 작업들 흐름이 동시에 진행되기 때문에 가능한 것인데, 이러한 일련의 작업 흐름들을 스레드라고 하며 여러개가 있다면 이를 멀티 스레드 라고 부른다. 멀티 스레드에 대해서는 다음 블로그 글에서 더 자세히 살펴보도록 하자.
일반적으로 하나의 프로그램은 하나 이상의 프로세스를 가지고 있고, 하나의 프로세스는 반드시 하나 이상의 스레드를 갖는다. 즉, 프로세스를 생성하면 기본적으로 하나의 main 스레드가 생성되게 된다.
⭐프로그램이 프로세스가 되면서 일어나는 일
1️⃣ 프로세스가 필요로 하는 재료들이 메모리에 올라간다.
프로그램이 실행되어 프로세스가 만들어지면 다음 4가지의 메모리 영역으로 구성되어 할당받게 된다.

- 코드 영역(Code / TEXT) : 프로그래머가 작성한 프로그램 함수들의 코드가 CPU가 해석 가능한 기계어 형태로 저장되어 있음
- 데이터 영역(Data) : 코드가 실행되면서 사용하는 전역 변수나 각종 데이터들이 모여있다. 데이터 영역은 .data, .BSS, .rodata 영역으로 세분화 된다.
- .data: 전역 변수 또는 static 변수 등 프로그램이 사용하는 데이터를 저장
- .BSS: 초기값 없는 전역 변수, static 변수가 저장
- .rodata: const같은 상수 키워드 선언 된 변수나 문자열 상수가 저장
- 스택 영역(Stack) : 지역 변수과 같은 호출한 함수가 종료되면 되돌아올 임시적인 자료를 저장하는 독립적인 공간이다. Stack은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. 만일 stack 영역을 초과하면 stack overflow 에러가 발생한다.
- 힙 영역(Heap) : 생성자, 인스턴스와 같은 동적으로 할당되는 데이터들을 위해 존재하는 공간이다. 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
위의 그림에서 Stack과 Heap 영역이 위아래로 화살표가 쳐있는 것을 볼 수 있는데, 이는 코드 영역과 데이터 영역은 선언할 때 그 크기가 결정되는 정적 영역이지만, 스택 영역과 힙 영역은 프로세스가 실행되는 동안 크기가 늘어났다 줄어들기도 하는 동적 영역이기 때문에 이를 표현한 것이다.
즉, 프로그램이 여러 개 실행된다면 메모리에 프로세스들이 담길 주소 공간이 생성되게 되고 그 안에 Code, Data, Stack, Heap 공간이 만들어지게 된다.
2️⃣ 해당 프로세스에 대한 정보를 담고 있는 프로세스 제어 블럭(PCB)이 만들어진다.

프로세스 제어 블록(PCB): 프로세스와 관련된 정보를 저장하는 자료 구조
- PCB는 커널 영역에 생성된다.
- 운영체제는 수많은 프로세스들 사이에서 PCB로 특정 프로세스를 식별하고 해당 프로세스를 처리하는 데 필요한 정보를 판단한다.
- 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기된다.
PCB에 담기는 정보는 대표적으로 다음과 같다.
- 프로세스 ID(PID)
: 특정 프로세스를 식별하기 위해 부여하는 고유한 번호 Ex. 학번, 사번
- 같은 일을 수행하는 프로그램이라 할지라도 두 번 실행하면 PID가 다른 두 개의 프로세스가 생성된다.]
- 레지스터 값
프로세스는 자신의 실행 차례가 돌아오면 이전까지 진행했던 작업들을 이어 실행하기 위해, 이전까지 사용했던 레지스터의 중간값들을 모두 복원한다.
- 프로세스 상태
현재 프로세스가 입출력장치를 사용하기 위해 기다리고 있는 상태인지, CPU를 사용하기 위해 기다리고 있는 상태인지, CPU를 이용하고 있는 상태인지 등의 상태 정보가 저장된다.

생성 상태(new): 프로세스를 생성 중인 상태
-> 이제 막 메모리에 적재되어 PCB를 할당받은 상태이다.
준비 상태(ready): CPU를 할당받아 실행할 수 있지만, 아직 차례가 아니기에 기다리고 있는 상태
※ 디스패치(dispatch): 준비 상태인 프로세스가 실행 상태로 전환되는 것
실행 상태(running): CPU를 할당받아 실행 중인 상태
대기 상태(blocked): 입출력장치의 작업을 기다리는 상태
프로세스는 실행 도중 입출력장치를 사용하는 경우가 있는데, 입출력 작업은 CPU에 비해 처리 속도가 느리기에, 입출력을 끝날 때까지 기다려야 한다.
종료 상태(terminated): 프로세스가 종료된 상태
프로세스가 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.
- CPU 스케줄링 정보
프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보도 기록된다.
- 메모리 관리 정보
베이스 레지스터, 한계 레지스터 값과 같은 프로세스가 어느 주소에 저장되어 있는지에 대한 정보가 담긴다.
- 사용한 파일과 입출력장치 목록
프로세스가 실행 과정에서 특정 입출력장치나 파일을 사용하면 PCB에 해당 내용이 명시된다.
⭐프로세스 스케쥴링
프로세스 스케쥴링(Process Scheduling)은 운영체제에서 CPU를 사용할 수 있는 프로세스를 선택하고, CPU를 할당하는 작업을 말한다. 프로세스 스케줄링은 프로세스의 우선순위, 작업량 등을 고려하여 효율적으로 배치하여, 이를 통해 운영체제는 CPU를 효율적으로 사용하며 시스템 전반적인 성능을 향상시킨다. 그래서 스케줄링은 멀티 태스킹 작업을 만들어내는 데에 있어서 핵심적인 부분이다.
⭐프로세스 컨텍스트 스위칭
우리가 여러 개의 프로세스를 동시에 실행할 때 프로세스는 어떤 과정을 거칠까? 그때 발생하는 것이 바로 컨텍스트 스위칭(Context Switching)이다. 컨텍스트 스위칭(Context Switching)은 CPU가 한 프로세스에서 다른 프로세스로 전환될 때 발생하는 일련의 과정을 말한다. '동시에' 실행이 된다고 하였는데 왜 전환하는 과정이라고 표현을 할까? 이것을 이해하기 위해서는 CPU의 작업 처리 방식의 특징에 대해서 먼저 이해를 해야한다.
CPU 작업 처리 방식
1️⃣병렬성(Parallelism)
병렬성은 여러 작업을 실제로 동시에 처리하는 것이다. 병렬성은 멀티코어 컴퓨터에서 많이 사용되며, 실행 시간을 줄이거나 처리량을 늘리는 데에 사용된다. 예를 들어, 병렬처리를 사용하여 이미지나 비디오를 인코딩하거나, 대규모 데이터를 처리하는 등의 작업을 효율적으로 처리할 수 있다.
2️⃣동시성(Concurrency)
동시성은 둘 이상의 작업이 동시에 실행되는 것을 의미한다. 이 '동시'라는 의미에서 병렬성과 동시성의 한글 의미가 헷갈릴 수 있다. Parallelism가 물리적으로 정말로 동시에 실행하는 것이라고 하면, Concurrency는 동시에 실행하는 것처럼 보이게 하는 것으로 이해하면 된다.

여러 개의 프로세스를 실행할 때 각각의 작업들을 위의 사진처럼 아주 잘게 나누어 아주 조금씩만 작업을 수행하고 다음 작업으로 넘어가는 식으로 작동한다. 이렇게 하는 이유는 여러 작업을 동시에 처리하는 것처럼 보이게 만들어, 사용자에게 더 빠른 반응성을 제공하기 위해서이다. 그리고 이렇게 진행 중인 작업들을 A → B → C 로 번갈아 바꾸는 것을 컨텍스트 스위칭이라고 하는 것이다.
📌컨텍스트 스위칭 과정
두 개의 프로세스 간에 컨텍스트 스위치 과정을 그림으로 표현해보자.

- CPU는 Process P1을 실행한다. (Executing)
- 일정 시간이 지나 Interrupt 또는 system call이 발생한다. (CPU는 idle 상태)
- 현재 실행 중인 Process P1의 상태를 PCB1에 저장한다. (Save state into PCB1)
- 다음으로 실행할 Process P2를 선택한다. (CPU 스케줄링)
- Process P2의 상태를 PCB2에서 불러온다. (Reload state from PCB2)
- CPU는 Process P2를 실행한다. (Executing)
- 일정 시간이 지나 Interrupt 또는 system call이 발생한다. (CPU는 idle 상태)
- 현재 실행 중인 Process P2의 상태를 PCB2에 저장한다. (Save state into PCB2)
- 다시 Process P1을 실행할 차례가 된다. (CPU 스케줄링)
- Process P1의 상태를 PCB1에서 불러온다. (Reload state from PCB1)
- CPU는 Process P1을 중간 시점부터 실행한다. (Executing)
⭐스레드의 자원 공유

스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다. 따라서 각각의 스레드는 별도의 stack을 가지고 있지만 heap 메모리는 고유하기 때문에 서로 다른 스레드에서 가져와 읽고 쓸 수 있게 된다.
stack은 함수 호출 시 전달되는 인자, 되돌아갈 주소값, 함수 내에서 선언하는 변수 등을 저장하는 메모리 공간이기 때문에, 독립적인 스택을 가졌다는 것은 함수 호출이 가능하다 라는 의미이다. 그리고 독립적인 함수 호출이 가능하다는 것은 독립적인 실행 흐름이 추가된다는 말이다.
즉, stack을 가짐으로써 스레드는 독립적인 실행 흐름을 가질 수 있게 되는 것이다. 반면에 프로세스는 기본적으로 프로세스끼리 다른 프로세스의 메모리에 직접 접근할 수 없다. 이렇게 구성한 이유는 하나의 프로세스를 다수의 실행 단위인 스레드로 구분하여 자원을 공유하고, 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 올리기 위해서이다.
그렇다면 프로세스는 영원히 다른 프로세스 정보에 접근할 수 없을까? 그렇지는 않다!
IPC, LPC등의 방법을 사용하여 접근할 수 있다. 그러나 프로세스 자원 공유는 단순히 CPU 레지스터 교체뿐만이 아니라 RAM, CPU 사이의 캐시 메모리까지 초기화되기 때문에 자원 부담이 크다는 단점이 있다. 그래서 다중 작업이 필요한 경우 스레드를 이용하는 것이 훨씬 효율적이다.
⭐ 프로세스 컨텍스트 스위칭 vs 스레드 컨텍스트 스위칭
스레드도 프로세스와 비슷한 개념들을 담고 있지만 컨텍스트 스위칭 기술은 몇 가지 차이점이 존재한다.
1️⃣TCB가 PCB보다 가볍다
결론부터 말하자면, 스레드 컨텍스트 스위칭이 프로세스 컨텍스트 스위칭보다 더 빠르다. 스레드는 text, data, heap 영역 메모리를 공유하기 때문에 TCB에는 stack 및 간단한 register 포인터 정보만을 저장하기 때문에 PCB보다 TCP가 가벼워 더 빨리 읽고 쓸 수 있다.
2️⃣캐시 메모리 초기화 여부
프로세스 컨텍스트 스위칭이 일어날 경우, 다른 프로세스의 실행으로 인해 CPU가 새로운 명령어와 데이터를 로드해야 하기 때문에 CPU 캐시 메모리를 초기화 하여야 한다. 이것이 프로세스 컨텍스트 스위칭에 부담이 되는 요소이다.
하지만 스레드 컨텍스트 스위칭일 경우, 프로세스 내 스레드 간에 스택과 레지스터 값 등 일부 컨텍스트 정보만 변경되므로 CPU 캐시 메모리는 초기화되지 않는다.
'네트워크' 카테고리의 다른 글
| 동기/비동기 & 블로킹/논블로킹 (0) | 2026.03.13 |
|---|---|
| 멀티 스레딩과 성능 (0) | 2026.03.13 |
| 멀티 프로세스 vs 멀티 스레드 (0) | 2026.03.12 |