← 개인 공부 · etc
STUDY NOTE · 개념 정리

프로세스 vs 스레드 정리: 메모리 구조, 컨텍스트 스위칭, 동기화

etc
프로세스는 실행 중인 프로그램으로 운영체제로부터 독립된 메모리를 할당받는 단위이고, 스레드는 프로세스 안에서 실행 흐름을 나누는 단위로 같은 프로세스의 메모리를 공유한다.

1. 프로그램, 프로세스, 스레드

용어설명
프로그램디스크에 저장된 실행 파일 (정적)
프로세스메모리에 올라가 실행 중인 프로그램 (동적). OS가 자원을 할당하는 단위
스레드프로세스 안의 실행 흐름. CPU가 실제로 스케줄링하는 단위

2. 메모리 구조

영역저장하는 것스레드 간 공유
Code실행할 기계어 코드공유
Data전역 변수, static 변수공유
Heap동적 할당 객체 (new)공유
Stack지역 변수, 매개변수, 함수 호출 정보스레드마다 따로

스레드는 Stack과 레지스터(PC 포함)만 따로 갖고, Code·Data·Heap은 같은 프로세스의 다른 스레드와 공유한다.

3. 한눈에 비교

구분프로세스스레드
메모리독립된 주소 공간같은 프로세스의 메모리 공유
생성·종료 비용큼작음
컨텍스트 스위칭무거움 (메모리 매핑까지 교체)가벼움
통신IPC 필요 (파이프, 소켓, 공유 메모리 등)공유 메모리로 바로 가능
안정성하나가 죽어도 다른 프로세스에 영향 적음하나가 죽으면 프로세스 전체가 죽을 수 있음
동기화대부분 불필요공유 자원 접근 시 필수

4. 컨텍스트 스위칭 (Context Switching)

CPU가 실행 중인 작업을 바꿀 때, 현재 상태(레지스터, PC 등)를 PCB/TCB에 저장하고 다음 작업의 상태를 불러오는 과정이다.

  1. 프로세스 전환: 주소 공간이 바뀌므로 TLB·캐시가 무효화되어 비용이 크다.
  2. 스레드 전환: 같은 주소 공간이라 저장·복원할 것이 적어 가볍다.
  3. 스위칭 동안 CPU는 실제 일을 하지 못하므로, 스레드를 무작정 늘리면 오히려 느려진다.

5. 멀티프로세스 vs 멀티스레드

구분멀티프로세스멀티스레드
예크롬의 탭별 프로세스, Nginx 워커톰캣 요청 처리 스레드 풀
장점격리성·안정성적은 자원, 빠른 통신
단점메모리 사용량, IPC 비용동기화 문제, 하나의 오류가 전체에 영향

6. 동기화 문제와 해결

여러 스레드가 같은 데이터를 동시에 수정하면 결과가 실행 순서에 따라 달라지는 경쟁 상태(Race Condition)가 생긴다. count++도 읽기 → 더하기 → 쓰기 세 단계라 중간에 끼어들 수 있다.

개념설명
임계 영역 (Critical Section)공유 자원에 접근하는 코드 구간
뮤텍스 (Mutex)한 번에 하나의 스레드만 들어가도록 잠금 (소유권 있음)
세마포어 (Semaphore)정해진 개수(N)만큼 동시 접근 허용
모니터언어 차원의 동기화 (Java의 synchronized)
데드락 (Deadlock)서로 상대가 가진 자원을 기다리며 영원히 멈춤

데드락의 4가지 조건은 상호 배제, 점유 대기, 비선점, 순환 대기이며 하나라도 깨면 막을 수 있다(예: 락을 항상 같은 순서로 획득).

7. 실제로 어떻게 적용되나

  1. 스프링 서버: 톰캣은 요청마다 스레드 풀의 스레드 하나를 배정한다. 싱글톤 빈은 모든 요청 스레드가 공유하므로 빈에 요청별 값을 필드로 두면 다른 사용자와 섞인다. "스레드는 Heap을 공유한다"는 개념이 그대로 적용된 사례다.
  2. 크롬: 탭마다 별도 프로세스로 띄워서 한 탭이 죽어도 다른 탭은 살아 있다. 대신 탭을 많이 열면 메모리를 많이 쓴다.
  3. 자바스크립트: 메인 스레드 하나에서 실행되므로 무거운 계산은 Web Worker(별도 스레드)로 옮긴다. Worker는 메모리를 공유하지 않고 메시지로 통신한다.
  4. 재고 차감: 동시에 주문이 들어오면 두 요청이 같은 재고를 읽고 각각 차감하는 경쟁 상태가 생긴다. 애플리케이션 락만으로는 서버가 여러 대일 때 막을 수 없어서 DB 락이나 조건부 UPDATE로 처리한다.

8. 면접 질문으로 정리

  1. Q. 프로세스와 스레드의 차이는? 프로세스는 독립된 메모리 공간을 가진 실행 단위이고, 스레드는 프로세스 내에서 Stack만 따로 갖고 Code·Data·Heap을 공유하는 실행 흐름이다.
  2. Q. 멀티스레드의 장단점은? 자원 공유로 메모리를 적게 쓰고 통신과 컨텍스트 스위칭이 빠르지만, 공유 자원에 대한 동기화가 필요하고 한 스레드의 오류가 전체에 영향을 줄 수 있다.
  3. Q. 컨텍스트 스위칭이란? CPU가 실행 대상을 바꿀 때 현재 상태를 저장하고 다음 대상의 상태를 복원하는 과정으로, 그동안 실제 작업을 못 하므로 오버헤드가 된다.
  4. Q. 뮤텍스와 세마포어의 차이는? 뮤텍스는 하나의 스레드만 임계 영역에 들어가게 하는 잠금이고, 세마포어는 지정한 개수만큼의 동시 접근을 허용한다.
Gunmo Lee
프로세스 vs 스레드 정리: 메모리 구조, 컨텍스트 스위칭, 동기화 | Gunmo's Dev Life