프로세스와 스레드 (Process vs Thread)

한눈에 보기

독립된 자원을 가진 프로세스와 그 안의 실행 흐름인 스레드를 다룬다. 공유하는 것과 따로 가지는 것, 멀티프로세스와 멀티스레드의 선택 기준, 커널 수준 스레드와 고루틴 같은 경량 스레드까지 정리한다.

최종 업데이트 2026.09.17

프로세스(Process)는 실행 중인 프로그램으로서 독립된 주소 공간과 자원을 가진 단위이고, 스레드(Thread)는 프로세스 안에서 실제 명령을 실행하는 흐름의 단위다. 한 프로세스는 하나 이상의 스레드를 가지며, 같은 프로세스의 스레드들은 주소 공간과 자원을 공유하면서 각자의 스택과 레지스터만 따로 가진다. 자원 소유의 단위가 프로세스, CPU 스케줄링의 단위가 스레드라고 정리할 수 있다.

프로세스: 격리된 실행 단위

프로그램은 디스크에 있는 정적인 파일이고, 이를 메모리에 올려 실행하면 프로세스가 된다. 운영체제는 프로세스마다 독립된 가상 주소 공간, 열린 파일 목록, 프로세스 ID를 부여하고 PCB(Process Control Block)로 관리한다. 핵심은 격리다. 한 프로세스는 다른 프로세스의 메모리를 직접 읽거나 쓸 수 없으므로, 하나가 잘못된 포인터로 폭주해도 다른 프로세스는 영향받지 않는다. 대신 프로세스끼리 데이터를 나누려면 파이프나 공유 메모리 같은 프로세스 간 통신(IPC, Inter Process Communication)을 거쳐야 하고, 생성과 전환 비용도 상대적으로 크다.

스레드: 공유 위의 실행 흐름

스레드는 프로세스가 가진 코드, 데이터, 힙, 열린 파일을 그대로 공유하면서 실행 지점만 여러 개로 늘린 것이다. 스레드마다 따로 가지는 것은 프로그램 카운터와 레지스터, 그리고 자신의 함수 호출을 쌓는 스택뿐이다. 공유 덕분에 스레드 간 데이터 교환은 그냥 같은 변수를 읽고 쓰는 것으로 끝나며, 생성과 문맥 교환도 주소 공간 교체가 없어 가볍다. 그러나 같은 힙을 동시에 건드리므로 경쟁 상태(race condition)가 생기기 쉬워 뮤텍스 같은 동기화가 필수이고, 한 스레드의 치명적 오류가 프로세스 전체를 죽인다는 위험도 공유의 대가다.

프로세스와 스레드 비교

구분프로세스스레드
주소 공간독립적같은 프로세스 안에서 공유
따로 가지는 것모든 자원스택, 레지스터, 프로그램 카운터
통신 방법IPC 필요(커널 경유)공유 메모리 직접 접근(동기화 필요)
생성과 전환 비용크다(주소 공간 구성, TLB 무효화)작다(주소 공간 유지)
장애 격리한 프로세스의 크래시가 다른 프로세스에 영향 없음한 스레드의 크래시가 프로세스 전체를 종료시킴
대표 사례브라우저의 탭별 렌더러 프로세스웹 서버의 요청 처리 워커 스레드

멀티프로세스와 멀티스레드의 선택

동시성이 필요할 때 두 모델 중 무엇을 고를지는 격리와 효율의 저울질이다. 멀티스레드는 통신이 빠르고 메모리를 아끼므로 하나의 작업을 잘게 나눠 협력하는 병렬 계산이나 요청 처리에 적합하다. 멀티프로세스는 비용이 크지만 격리가 강해, 크롬(Chrome) 같은 브라우저는 탭 하나가 죽어도 전체가 살아남도록 렌더러를 프로세스로 분리하고, 보안 경계로도 활용한다. 언어 특성도 변수다. 파이썬(Python)의 표준 구현은 전역 인터프리터 락(GIL, Global Interpreter Lock) 때문에 CPU 병렬화에 멀티프로세스를 써 왔으며, 최근 버전에서 GIL을 제거하는 실험이 진행 중이다. 참고로 리눅스 커널은 프로세스와 스레드를 같은 태스크(task)로 다루고, clone 시스템 콜에 주소 공간을 공유할지 여부를 플래그로 지정해 둘을 구분한다.

프로세스와 스레드 차이: 한 프로세스 안의 스레드 세 개가 코드·데이터·힙을 공유하고 스택과 레지스터만 따로 갖는 메모리 구조
스레드가 «가볍다»는 말의 실체가 이 그림이다. 코드·데이터·힙은 프로세스에 하나뿐이라 스레드를 만들 때 복사할 것이 스택과 레지스터밖에 없고, 같은 이유로 한 스레드가 힙을 망가뜨리면 다른 스레드도 같이 죽는다.

문맥 교환(context switching) 비용의 차이도 선택에 영향을 준다. 프로세스 간 전환은 페이지 테이블을 교체해야 하므로 TLB(Translation Lookaside Buffer)가 무효화되어 전환 직후 주소 변환이 한동안 느려지지만, 같은 프로세스의 스레드 간 전환은 주소 공간이 유지되어 레지스터와 스택 포인터만 바꾸면 된다. 또한 동시성(concurrency)과 병렬성(parallelism)의 구분도 함께 알아 두어야 한다. 동시성은 여러 작업이 번갈아 진행되는 논리적 개념이고, 병렬성은 여러 코어에서 물리적으로 동시에 실행되는 것이다. 단일 코어에서도 멀티스레드로 동시성은 얻을 수 있지만 병렬성은 멀티코어가 있어야 가능하다.

커널 수준 스레드와 사용자 수준 스레드

커널이 직접 알고 스케줄링하는 스레드가 커널 수준 스레드(kernel-level thread)이고, 커널 모르게 라이브러리가 사용자 공간에서 관리하는 것이 사용자 수준 스레드(user-level thread)다. 커널 수준은 한 스레드가 블로킹 시스템 콜에 걸려도 다른 스레드가 계속 돌 수 있고 멀티코어를 활용할 수 있지만, 생성과 전환에 커널 진입이 필요하다. 사용자 수준은 전환이 함수 호출 수준으로 싸지만 하나가 블로킹되면 전체가 멈추는 문제가 있다. 현대의 실용적 절충이 고루틴(goroutine)이나 자바(Java) 21의 가상 스레드(virtual thread) 같은 경량 스레드로, 수많은 사용자 수준 실행 단위를 소수의 커널 스레드 위에 얹어(M:N 모델) 블로킹 지점에서 런타임이 알아서 갈아탄다.

면접에서 이렇게 물어본다

  • 프로세스와 스레드의 차이를 자원 소유와 스케줄링 단위 관점에서 설명해 보라.
  • 스레드가 스택을 공유하지 않고 따로 가져야 하는 이유는 무엇인가.
  • 멀티프로세스 대신 멀티스레드를 선택할 때의 장점과 감수해야 할 위험을 말해 보라.
  • 브라우저가 탭마다 프로세스를 분리하는 이유를 격리 관점에서 설명해 보라.
  • 커널 수준 스레드와 사용자 수준 스레드의 차이, 그리고 고루틴 같은 경량 스레드가 이를 어떻게 절충하는지 설명해 보라.
운영체제 문서 전체 보기

이 개념, 내 코드에서는 어떻게 물어볼까요

데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.

공고 넣고 시작하기