학습 공간 개념 · 판단 · 실험

Frontend Performance Lab

운영체제

프로세스·스레드와 실행 문맥

자원과 가상 주소 공간을 격리하는 단위인 프로세스와, 그 안에서 CPU 명령어를 수행하는 실행 흐름인 스레드를 구분합니다.

이럴 때 필요해요

브라우저 탭 격리나 서버 병렬 작업을 설계할 때 메모리 공유, 동기화 위험, 문맥 전환 비용의 균형을 잡기 위해 필요합니다.

어떻게 동작하나요?

디스크에 저장된 실행 파일은 아직 가만히 멈춰 있는 코드와 데이터 덩어리일 뿐입니다. 운영체제가 이 파일을 실행해 독립된 가상 주소 공간과 열린 파일 같은 자원을 배정해 준 살아 있는 단위를 프로세스(Process)라고 부릅니다. 프로세스마다 자기만의 주소 공간을 갖기 때문에 한 프로세스가 잘못된 메모리를 건드려 죽더라도 다른 프로세스의 메모리를 직접 망가뜨리지 못합니다.

반면 하나의 프로세스 안에서 여러 일을 동시에 진행하고 싶을 때 만드는 실행 흐름 단위가 스레드(Thread)입니다. 같은 프로세스에 속한 스레드들은 코드, 전역 데이터, 힙(Heap) 메모리와 열린 파일을 그대로 공유하므로 데이터를 주고받기가 매우 빠릅니다. 하지만 각 스레드가 지금 어느 함수의 몇 번째 줄을 실행 중이고 지역 변수가 무엇인지는 서로 다르기 때문에, 프로그램 카운터(PC)와 레지스터, 그리고 호출 프레임을 쌓는 스택(Stack)은 스레드마다 따로 가져야 합니다.

CPU 코어가 실행 대상을 A에서 B로 바꿀 때는 현재의 레지스터와 실행 위치를 저장하고 다음 대상의 상태를 불러오는 문맥 전환(Context Switch)이 일어납니다. 이때 레지스터를 옮기는 직접 비용뿐 아니라 CPU 캐시와 주소 변환 캐시(TLB)에 따뜻하게 올라와 있던 데이터가 쓸모없어지는 간접 비용이 따르며, 주소 공간까지 바뀌는 프로세스 간 전환이 같은 프로세스 내 스레드 전환보다 이 비용이 더 큽니다.

코드 예제

동작을 설명하는 읽기 전용 예제입니다.

example.txt
프로세스 A: 주소 공간 A
  스레드 A1: PC·레지스터·스택 1
  스레드 A2: PC·레지스터·스택 2
  공유: 코드·힙·열린 파일 자원
프로세스 B: 별도 주소 공간 B (통신에는 IPC 등 필요)
text · 읽기 전용5줄

같은 프로세스 A 안의 스레드 A1, A2는 코드·힙·열린 파일을 공유하면서 각자의 레지스터와 스택을 따로 갖고, 별도 주소 공간을 가진 프로세스 B와 데이터를 주고받으려면 IPC가 필요하다는 점을 보여 줍니다.

자주 헷갈리는 포인트

  • 스레드마다 스택뿐 아니라 힙(Heap) 메모리까지 완전히 따로 할당된다고 잘못 설명하면 안 됩니다.
  • 단순히 시스템 호출로 커널 모드에 들어갔다 나오는 것과 다른 프로세스·스레드로 CPU 실행 대상을 바꾸는 문맥 전환을 같은 것으로 혼동하면 안 됩니다.

내 말로 설명해 보기

같은 프로세스 안의 스레드들이 힙 메모리를 별도 복사 없이 쉽게 공유할 수 있다는 장점은 왜 동시에 버그 위험을 높이는 원인이 될까요?

실전 시나리오에 적용해 보기

함께 읽으면 좋은 개념

관련 면접 질문 4개

운영체제(OS)는 어떤 하드웨어 자원을 관리하며 프로그램에 어떤 추상화를 제공하나요?

운영체제는 CPU, 메모리, 저장장치와 입출력 자원을 직접 관리하면서, 프로그램에는 프로세스, 가상 주소 공간, 파일 같은 다루기 쉬운 추상화를 제공하는 시스템 소프트웨어입니다. 일반 프로그램이 하드웨어를 임의로 제어하지 못하도록 시스템 호출(System Call)을 통해서만 특권 작업을 중재하며 프로세스 간 격리, 공정성, 효율을 조율합니다. 커널 구조와 세부 스케줄링 정책은 운영체제마다 다르므로 추상화된 인터페이스와 내부 구현을 구분해 이해해야 합니다.

꼬리질문과 참고자료 →

프로세스와 스레드는 어떤 자원을 공유하며, 스레드마다 스택은 왜 따로 필요한가요?

프로세스는 운영체제로부터 자원과 가상 주소 공간을 할당받는 보호 단위이고, 스레드는 그 주소 공간 안에서 실행되는 흐름 단위입니다. 같은 프로세스의 스레드들은 코드, 데이터, 힙 영역과 열린 파일 자원을 공유하지만, 프로그램 카운터(PC)와 레지스터, 스택(Stack)은 스레드마다 독립적으로 가집니다. 각 스레드의 함수 호출 진행 위치와 반환 주소, 지역 변수 상태가 서로 다르므로 호출 프레임이 섞이지 않으려면 별도의 스택이 꼭 필요합니다.

꼬리질문과 참고자료 →

멀티 프로세스와 멀티 스레드는 격리 수준과 통신 비용 측면에서 어떻게 다른가요?

멀티 프로세스는 각 프로세스가 독립된 가상 주소 공간을 가져 한쪽 오류가 다른 프로세스로 퍼지는 것을 막아 주며, 파이프나 소켓 같은 IPC로 통신합니다. 반면 멀티 스레드는 같은 주소 공간을 공유해 데이터를 빠르게 주고받을 수 있지만, 경쟁 상태가 생기기 쉽고 한 스레드의 치명적 오류가 프로세스 전체를 멈추게 할 수 있습니다. 따라서 생성·통신 비용과 작업 크기, 필요한 격리 수준, 코어 수를 함께 고려해 선택합니다.

꼬리질문과 참고자료 →
나머지 질문 1개

공식 참고 자료

← 운영체제