프로세스는 실행에 필요한 자원과 격리의 단위, 스레드는 CPU가 스케줄링하는 실행 흐름의 단위, 컨텍스트 스위칭은 CPU가 실행 주체를 바꾸기 위해 현재 상태를 저장하고 다음 상태를 복원하는 과정이다.
1. 용어
프로그램
어떤 작업을 하기 위해 해야할 일들을 순서대로 나열한 것으로
쉽게말해 컴퓨터에서 어떤 작업을 위해 실행할 수 있는 정적인 상태의 파일이라고 볼 수 있다.
ex. Windows의 exe파일

프로세스
프로그램이 메모리에 올라와 실행 중인 인스턴스다. 하나의 프로그램을 여러 번 실행하면 여러 프로세스가 될 수 있다. 프로세스는 가상 주소 공간, 코드, 열린 시스템 객체, 보안 문맥 등의 실행 자원을 제공하며 적어도 하나의 스레드를 가진다. About Processes and Threads - Win32 apps 프로세스가 할당받는 시스템 자원의 예
- cpu시간
- 운영되기 위해 필요한 주소 공간
- Code, Data, Stack, Heap의 구조로 되어있는 독립된 메모리 영역
스레드
스레드(thread)는 프로세스가 할당 받은 자원을 이용하는 실행 단위이자, 프로세스의 특정한 수행 경로이자 프로세스 내에서 실행되는 여러 흐름의 단위이다.
각 스레드는 독자적인 스택(Stack) 메모리를 갖는다. 스레드는 프로세스 내에서 각각 스택만 할당받고 Code, Data, Heap 영역은 공유한다.
pthreads(7) - Linux manual page
용어 정리
| 용어 | 핵심 의미 |
| 프로그램 | 저장 장치에 있는 명령어와 데이터 |
| 프로세스 | 실행 중인 프로그램 인스턴스와 자원 컨테이너 |
| 스레드 | 프로세스 내부의 독립적인 실행 흐름 |
| 스케줄러 | 실행 가능한 작업 중 다음 CPU 실행 대상을 선택하는 커널 구성 요소 |
| 컨텍스트 | 중단 지점에서 다시 실행하기 위해 필요한 CPU·OS 상태 |
| 같은 프로세스의 스레드가 공유 | 스레드마다 독립 |
| 코드 영역 | 프로그램 카운터(PC/IP) |
| 전역·정적 데이터 | CPU 레지스터 |
| 힙 | 사용자 스택·커널 스택 |
| 가상 주소 공간 | 스레드 ID |
| 열린 파일과 소켓 | 스케줄링 상태·일부 우선순위 정보 |
| 프로세스 단위 권한·환경 | Thread Local Storage, 일부 신호 상태 |
“스레드는 프로세스보다 가볍다”의 정확한 뜻 같은 프로세스의 자원을 재사용하므로 생성·통신·주소 공간 전환 부담이 보통 더 작다는 뜻이다. 스레드가 공짜이거나 언제나 빠르다는 뜻은 아니다. 각 스레드의 스택, 커널 관리 정보, 스케줄링, 동기화에는 여전히 비용이 든다.
동시성 vs 병렬성
- 동시성(Concurrency): 여러 작업의 진행 구간이 겹친다. 단일 코어에서도 빠르게 번갈아 실행하면 가능하다.
- 병렬성(Parallelism): 같은 순간에 실제로 여러 작업을 실행한다. 일반적으로 여러 CPU 코어가 필요하다. 따라서 “스레드가 여러 개다”만으로 병렬 실행이 보장되지는 않는다. 실행 가능한 스레드 수, 코어 수, 스케줄링, 락과 I/O 대기 상태가 함께 결정한다.
4. Linux에서는 프로세스와 스레드를 어떻게 보는가
Linux의 clone() 계열은 어떤 자원을 공유할지 플래그로 지정해 새 실행 단위를 만든다. CLONE_THREAD를 사용한 실행 단위들은 같은 thread group에 속하며 TGID를 공유하고, 각 스레드는 고유한 TID를 가진다.
- 사용자 관점의 PID는 일반적으로 thread group의 TGID
- 그룹 안의 각 스레드는 고유한 TID
- 커널 스케줄러 관점에서는 프로세스/스레드보다 실행 가능한 task라는 관점이 더 직접적
- 따라서 “OS가 프로세스를 스케줄한다”는 입문 표현보다 “OS가 스레드/태스크를 스케줄한다”가 더 정확하다 이 설명은 Linux 구현을 이해하기 위한 것이며 모든 운영체제가 같은 내부 모델이나 용어를 쓰는 것은 아니다.
5. 컨텍스트 스위칭
정의
**컨텍스트 스위칭(context switching)**은 현재 실행 중인 스레드/태스크의 실행 문맥을 저장하고, 다음에 실행할 대상의 문맥을 복원해 CPU의 실행 주체를 바꾸는 과정이다. Windows 공식 문서에서 스레드 문맥 저장 → ready queue 처리 → 다음 스레드 선택 → 문맥 복원 순서로 설명한다. Context Switches - Win32 apps
무엇을 저장하고 복원하는가
아키텍처와 OS에 따라 다르지만 일반적으로 다음이 포함된다.
- 프로그램 카운터(다음 실행 명령 위치)
- 스택 포인터
- 범용 레지스터와 상태/플래그 레지스터
- 필요 시 부동소수점·SIMD·벡터 레지스터 상태
- 커널 스택 및 스케줄링 관련 상태
- 서로 다른 프로세스 사이 전환이면 주소 공간 식별·페이지 테이블 관련 상태
언제 발생하는가
자발적(voluntary) 전환
- 블로킹 I/O 요청
- mutex, semaphore, condition variable 대기
- sleep, 이벤트 대기
- 명시적인 yield
- 현재 작업이 종료되어 실행할 것이 없어짐 비자발적(involuntary) 전환
- 타임 슬라이스 소진
- 더 높은 우선순위의 작업이 실행 가능 상태가 됨
- 스케줄러가 공정성·정책에 따라 선점
- CPU affinity, 부하 분산 등으로 다른 실행 대상을 선택
Linux는
/proc/<pid>/status에 voluntary와 nonvoluntary context switch 누적 수를 제공한다.
단계별 흐름

스케줄러는 무엇을 하는가
스케줄러는 runnable 상태의 작업 중 다음 실행 대상을 고른다. 실제 정책은 운영체제와 스케줄링 클래스에 따라 다르다. Linux의 일반 공정 스케줄링은 CFS에서 EEVDF로 전환되어 왔으며, EEVDF는 CPU 시간의 공정성과 짧은 지연 요구를 함께 다루기 위해 virtual runtime, lag, virtual deadline을 사용한다. EEVDF Scheduler — The Linux Kernel documentation
6. 컨텍스트 스위칭의 비용
직접 비용
- 커널의 문맥 저장·복원 코드 실행
- 스케줄러의 다음 작업 선택
- 레지스터·스택·주소 공간 관련 상태 갱신
- 실행 그 자체에는 기여하지 않는 CPU 시간 소비
간접 비용
- 새 작업의 코드·데이터가 CPU 캐시에 없어 cache miss 증가
- 서로 다른 주소 공간으로 전환할 때 주소 변환 캐시(TLB)에 부담
- 코어 이동 시 캐시 지역성 손실
- 많은 runnable 스레드가 run queue와 동기화 구조에서 경쟁
- 짧은 작업들이 지나치게 자주 교대하면 useful work 비율 감소
TLB 오개념 프로세스가 바뀐다고 현대 CPU에서 TLB가 항상 전부 비워지는 것은 아니다. PCID/ASID 같은 주소 공간 태그와 OS·CPU 최적화가 재사용을 가능하게 한다. 다만 서로 다른 주소 공간 전환은 같은 프로세스 안의 스레드 전환보다 주소 변환·캐시 지역성 측면에서 추가 부담이 생길 가능성이 크다.
프로세스 전환 vs 같은 프로세스의 스레드 전환
- 둘 다 레지스터와 스케줄링 문맥 전환이 필요하다.
- 같은 프로세스의 스레드는 주소 공간을 공유하므로 보통 페이지 테이블 문맥을 그대로 사용할 수 있다.
- 서로 다른 프로세스의 스레드로 바꾸면 주소 공간 문맥까지 바뀔 수 있어 일반적으로 더 무겁다.
- 실제 비용은 CPU, OS 버전, 작업 집합, 캐시 상태, 보안 완화 기능, 코어 이동 여부 등에 따라 달라진다. 고정된 “몇 μs” 숫자를 보편적 사실처럼 외우지 않는다.
7. 헷갈리기 쉬운 개념
시스템 콜 = 컨텍스트 스위칭?
아니다. 시스템 콜은 보통 user mode에서 kernel mode로 들어가는 **모드 전환(mode switch)**을 만든다. 커널이 처리를 마치고 같은 스레드로 돌아오면 실행 주체는 바뀌지 않았으므로 스레드 간 컨텍스트 스위칭이 아니다. 반대로 시스템 콜 중 I/O 대기가 생겨 다른 스레드가 선택되면 컨텍스트 스위칭도 함께 일어난다.
인터럽트 = 컨텍스트 스위칭?
항상 그렇지 않다. 인터럽트 처리 후 원래 스레드로 복귀할 수도 있다. 인터럽트 때문에 더 높은 우선순위 스레드가 깨고 스케줄러가 실행 대상을 바꿀 때 컨텍스트 스위칭이 발생한다.
스레드 수가 많을수록 처리량이 증가?
아니다. CPU-bound 작업은 runnable 스레드가 코어 수보다 지나치게 많으면 전환·경쟁 비용만 커질 수 있다. I/O-bound 작업은 대기 시간을 다른 작업으로 채울 수 있어 더 많은 동시 실행 단위가 유리할 수 있지만 DB connection pool, 외부 API, 메모리, 락이 새 병목이 될 수 있다.
프로세스는 실행 단위, 스레드는 자원 단위?
보통 반대로 기억한다. 프로세스는 자원 소유/보호/격리 단위, 스레드는 실행/스케줄링 단위다. 다만 OS 내부 구현은 더 복잡할 수 있으므로 입문용 정신 모델로 사용한다.