| 항목 | 내용 |
| 주차 | 11주차 |
| 날짜 | 2026-03-16 |
| 주제 | 프로세스와 스레드 |
| 발표자 | 이시영 |
이 주제를 한 문장으로 설명하면?
한 줄 요약:
프로세스는 실행 중인 프로그램 단위이고,스레드는 그 프로세스 내부에서 실제 작업을 수행하는 실행 흐름이다.
관련 키워드 (마인드맵 형태로 나열):
[프로세스와 스레드]├── 프로세스│ ├── 독립 메모리 공간│ ├── PID│ ├── Context Switching│ └── 프로세스 상태 (Ready / Running / Waiting)├── 스레드│ ├── 프로세스 내부 실행 흐름│ ├── Stack만 독립│ └── Code / Data / Heap 공유├── 멀티 프로세스│ ├── 안정성 높음│ └── IPC 필요├── 멀티 스레드│ ├── 성능 좋음│ └── 동기화 문제 (Race Condition)└── 브라우저 구조├── Browser Process├── Renderer Process├── GPU Process└── Web Worker
⚠️ 단순 복붙 금지! 반드시 자신의 말로 재작성할 것
개념 설명 (내 말로):
프로세스는 현재 OS에서 메인메모리에 올라와 실행중인(돌아가고 있는) 프로그램을 의미한다. 모든 프로그램은 OS가 실행되기 위한 메모리 공간을 할당해줘야 실행이 가능하다. 따라서 프로그램을 실행하는 순간 파일은 컴퓨터 메모리에 올라가며, OS로 부터 CPU 자원을 할당 받아 프로그램이 실행될 수 있게 된다.
프로그램은 어떤 일을 수행하기 위해 만들어진 명령어의 모음이라고 할 수 있다. 이러한 프로그램은 명령어의 모음(코드)이 파일로 빌드되어 보조 기억 장치에 저장되어있는 정적인 상태이다.
이때 우리가 프로그램을 실행하면 CPU는 보조 기억 장치에서 꺼내어 메인 메모리에 올려, 코드를 해석하고 작업을 시작하게 된다.
이런 메인 메모리에 올라와 현재 실행중인 상태의 프로그램을 프로세스라고 하는 것이다.
| 프로그램 | 프로세스 |
| 어떠한 작업을 위해 실행가능한 파일 | 실행중인 컴퓨터 프로그램 |
| 파일이 저장장치에만 존재하며, 메모리에는 올라가있지 않은 정적인 상태 | 메모리를 차지하고 있으며, CPU 자원을 할당받아 프로그램이 실행되고 있는 상태 |
프로세스의 특징
프로그램이 실행되어 프로세스가 만들어지면, 메모리 영역이 총 4가지로 구성되어 할당받는다.

정적인 영역 (Code , Data)
프로그램이 시작될 때 크기가 결정되어, 실행하는 동안에도 변하지 않는 구역이다.
동적인 영역(Stack, Heap)
프로그램이 실행되는 동안 크기가 변경되는 영역이다. 스택은 메모리의 높은 주소 → 낮은 주소로 내려오며 쌓이고, 힙은 메모리의 낮은 주소 → 높은 주소로 올라가며 쌓인다. 한정적인 메모리 공간을 유연하게 가져가기 위해 필요한 만큼 사용될 수 있도록 이러한 형태로 구성되어 있다.
실제 코드 예시:
JS는 OS에게 할당받은 메모리 공간을 Call Stack 과 Memory Heap 의 형태로 나누어 관리한다.
// 1. 데이터 영역 (Global Scope)let globalVar = 10; // 초기값이 있는 전역 변수 (Data 영역 역할)let uninitVar; // 초기값이 없는 변수 (BSS 영역 역할 - JS에선 undefined)const CONST_VAR = 5; // 상수 (ROData 영역 역할)function myFunction(arg) { // arg: Call Stack에 할당
개념 설명 (내 말로):
한 프로세스 내에서 동시에 진행되는 일의 단위를 말한다. 하나의 프로세스는 최소 하나 이상의 스레드를 가지며, 해당 프로세스의 자원을 서로 공유하며 동작한다.
스레드의 특징
스레드는 프로세스가 할당 받은 자원을 공유하고 이용한다.
그중 Stack 만 할당받아 복사하고, Code/Data/Heap 영역은 프로세스 내에 다른 스레드들과 공유하는 상태가 된다.
즉 각 스레드마다 별도의 Stack을 가지고 있지만, Heap 메모리는 고유하기에 서로 다른 스레드의 것을 가져와 사용할 수 있다.

실제 코드 예시:
JS는 기본적으로 싱글 스레드이지만, Web Worker를 사용하면 별도의 스레드를 사용할 수 있다.
아래 코드에서
- 메인 스레드 → UI 담당
- Worker → 별도 스레드에서 연산 수행
// main.jsconst worker = new Worker("worker.js");worker.postMessage("start");worker.onmessage = function (event) {console
개념 설명 (내 말로):
멀티 프로세스
하나의 프로그램을 여러개의 프로세스로 구성하여, 각 프로세스가 하나의 작업을 처리하게 하는 방식
멀티 스레드
하나의 프로세스 내에서 여러 개의 스레드를 생성하여 각 스레드가 작업을 분담하는 방식
언제 어떤 걸 선택해야할까?
개념 설명 (내 말로):
현대 브라우저 중 특히 크롬은 멀티 프로세스 구조로 이루어져있다. 브라우저 전체를 제어하는 브라우저 프로세스와, 화면을 그리는 렌더러 프로세스, 그래픽 작업을 처리하는 GPU 프로세스 등이 IPC 를 통해 통신하며 웹사이트를 보여주는 것이다. 한 탭이 망가져도 브라우저 전체가 죽지 않게 하고, 보안을 위해 멀티 프로세스 구조를 사용한다.

동작 원리 / 흐름:
| 스레드 종류 | 주요 역할 (프론트엔드 관점) |
| Main Thread | JS 실행, HTML 파싱, DOM 생성, 레이아웃 계산 등 대부분의 메인 작업 수행 |

→ 위 프로세스들 끼리는 IPC(Inter Process Communication, 프로세스간 통신)을 사용한다
오른쪽 상단의 옵션 메뉴 아이콘을 클릭하고 '도구 더보기'를 선택한 다음 '작업 관리자'를 선택 그러면 현재 실행 중인 프로세스 목록과 사용 중인 CPU/메모리 양이 포함된 창이 열림
실제 코드 예시:
브라우저 환경이 멀티 프로세스/스레드임을 확인할 수 있는 JS 코드
// 1. 하드웨어 스레드(코어) 개수 확인// 브라우저가 멀티 프로세싱을 할 때 활용할 수 있는 물리적 자원 정보를 알 수 있음console.log(`현재 기기의 논리 코어 개수: ${navigator.hardwareConcurrency}`);// 2. 렌더러 프로세스와 별개로 동작하는 Web Worker// 메인 스레드(렌더러 프로세스 내부)를 방해하지 않고 별도의 스레드에서 무거운 작업 실행const worker = new Worker
멀티 프로세스 아키텍처의 장점
→ 즉 악성 웹사이트가 실행되더라도 시스템 전체에 접근하기 어려움
멀티 프로세스 아키텍처의 단점
→ 스레드 처럼 메모리 공유가 불가능하여 메모리 사용량이 더 많게된다.
→ Chrome이 한도에 도달하면 하나의 프로세스에서 동일한 사이트의 여러 탭을 실행하기 시작한다.
더 자세한 것은 https://developer.chrome.com/blog/inside-browser-part1?hl=ko
Chrome은 최근 서비스 기반 아키텍처로 발전하고 있다. 브라우저 기능을 다음처럼 나누어 실행한다.
예를 들면,
이 서비스들은 상황에 따라 여러 프로세스로 분리되거나, 하나의 프로세스로 통합될 수 있다.
이를 통해 성능, 메모리 사용량, 안정성을 균형 있게 관리한다.
이 기술/개념이 왜 이런 방식으로 만들어졌는지 배경을 이해하자
유사한 개념과 차이점 정리 (면접에서 자주 나오는 포인트)
| 항목 | 멀티 프로세스 (Multi-processing) | 멀티 스레드 (Multi-threading) |
| 자원 공유 | 거의 없음 (독립된 메모리) | Code, Data, Heap 공유 (Stack만 독립) |
| 통신 (IPC) | 어려움 (LPC, Shared Memory, Socket 등 필요) | 매우 쉬움 (공유 변수 접근) |
| Context Switch | 무거움 (메모리 맵 전체 교체) | 가벼움 (레지스터/스택만 교체) |
| 장애 영향 | 독립적 (한 놈 죽어도 나머지는 생존) | 치명적 (하나의 에러가 프로세스 전체 종료) |
| 비유 | 여러 명의 사장이 각자 회사를 차림 | 한 사장이 여러 명의 직원을 고용함 |
실제 프로젝트에서 마주칠 수 있는 상황
브라우저는 탭마다 별도의 렌더러 프로세스를 가진다.
무거운 대시보드, 복잡한 데이터 시각화, 무한 루프 코드가 실행되더라도 해당 탭만 멈추고 다른 탭은 정상 동작한다.
즉, 멀티프로세스 구조 덕분에 브라우저 전체가 죽지 않는다.
+) 탭별 프로세스가 독립적이므로 LocalStorage, SessionStorage, IndexedDB, BroadcastChannel 같은 브라우저 API를 활용해 상태를 공유한다.
자바스크립트는 싱글 스레드다.
대량 데이터 처리, 복잡한 연산, 무한 루프 등으로 메인 스레드가 막히면 버튼 클릭, 스크롤, 애니메이션이 멈춘다.
이런 것들을 방지하기 위해 연산을 쪼개거나 비동기 처리, Web Worker를 활용한다.
브라우저 내부에는 Compositor Thread, Raster Thread 등 여러 스레드가 있다.
프론트 개발자는 transform, opacity 등 GPU 가속을 지원하는 CSS 속성을 활용해 부드러운 애니메이션을 구현한다.
면접관 앞에서 말하듯이 작성. 읽는 용도가 아니라 말하는 연습을 위한 섹션
[도입 - 핵심 정의 먼저]"프로세스는 실행 중인 프로그램의 인스턴스로 OS로부터 독립된 자원을 할당받는 작업 단위이고, 스레드는 그 프로세스 내부에서 실제로 작업을 수행하는 흐름의 단위입니다."[부연 - 왜/어떻게]"가장 큰 차이는 자원 공유 여부입니다. 프로세스는 독립된 메모리를 가져서 안전하지만 무겁고 소통(IPC)이 어렵습니다. 반면 스레드는 Heap과 Data 영역을 공유해서 빠르고 효율적이지만, 공유 자원을 두고 싸우는 동기화 문제를 주의해야 합니다.흥미로운 점은 우리가 쓰는 크롬 브라우저는 이 두 장점을 모두 취하기 위해 멀티 프로세스 아키텍처를 사용한다는 것입니다. 각 탭을 별도의 렌더러 프로세스로 분리해 안정성을 높이고, 그 내부에서는 싱글 스레드로 자바스크립트를 실행하며 효율을 챙깁니다."[마무리 - 실무 연결]"실제로 프론트엔드 개발을 할 때, 메인 스레드가 차단되어 화면이 멈추는 현상을 방지하기 위해 비동기 처리를 하거나, 아주 무거운 연산은 Web Worker라는 별도 스레드에 맡기는 방식으로 이 개념을 실무에 적용하고 있습니다."
면접관이 바쁠 때, 딱 1분 안에 설명하는 버전
프로세스는 '독립된 공장'이고 스레드는 그 안의 '일꾼'입니다. 프로세스는 서로 자원을 공유하지 않아 안전하지만 무겁고, 스레드는 자원을 공유해 빠르지만 하나가 사고를 치면 공장 전체가 위험해질 수 있습니다.자바스크립트는 싱글 스레드라 한 번에 한 일만 하지만, 브라우저가 멀티 프로세스 구조로 설계된 덕분에 탭 하나가 멈춰도 전체 브라우저는 안전하게 유지됩니다. 성능 최적화를 위해서는 이 메인 스레드가 멈추지 않도록 관리하는 것이 프론트엔드 개발의 핵심입니다.
각 질문에 대해 STAR 구조 혹은 두berlingo 두berlingo 두 문장 요약으로 작성
Stack은 함수 호출 시 지역 변수나 매개변수가 저장되는 공간으로 크기가 고정되어 있고 속도가 매우 빠릅니다. 반면 Heap은 객체나 배열처럼 크기가 가변적인 동적 데이터가 저장되는 넓은 공간으로, 자바스크립트에서는 가비지 컬렉터가 주기적으로 이곳을 관리합니다.
자바스크립트 엔진 자체는 하나만 처리하지만, 브라우저라는 멀티 스레드 환경의 도움을 받기 때문입니다. 네트워크 요청이나 타이머 같은 작업은 브라우저의 전용 스레드가 대신 처리해 주고, 완료된 작업은 이벤트 루프가 큐에서 꺼내 메인 스레드에 전달하는 방식으로 비동기 처리를 수행합니다.
크롬은 **'사이트 격리(Site Isolation)'**를 위해 각 탭(혹은 사이트)마다 별도의 렌더러 프로세스를 띄우기 때문입니다. 프로세스는 스레드와 달리 메모리를 공유하지 않고 엔진(V8) 사본을 각자 가지고 있어야 하므로, 안정성을 얻는 대신 메모리 사용량이 늘어나는 트레이드오프가 발생합니다.
멀티 프로세스는 안정성과 격리가 중요한 경우에 사용됩니다. 예를 들어 브라우저 탭처럼 하나의 작업이 실패해도 전체 시스템에 영향을 주지 않도록 할 때 적합합니다.
반면 멀티 스레드는 성능과 자원 공유가 중요한 경우에 사용됩니다. 예를 들어 렌더링 처리나 서버의 요청 처리처럼 빠른 통신과 효율적인 자원 사용이 필요한 경우에 사용됩니다.
JavaScript는 DOM을 직접 조작하기 때문에 싱글 스레드로 설계되었습니다.
만약 멀티 스레드 환경이라면 여러 스레드가 동시에 DOM을 수정하게 되어 Race Condition이 발생할 수 있습니다. 그래서 JavaScript는 싱글 스레드로 동작하고, 비동기 작업은 Event Loop를 통해 처리합니다.
깊게 파기는 애매한데 답변을 한 번보면 좋을 것 같아서 넣었어유
기술적으로는 브라우저 엔진이 생성하는 별도의 스레드입니다. 하지만 일반적인 스레드와 달리 메인 스레드와 메모리를 공유하지 않고 메시지(postMessage)로만 소통하기 때문에, 사이드 이펙트가 없는 안전한 멀티 스레딩을 지원한다는 특징이 있습니다.
개념을 몸으로 익히기 위한 미니 실습
// 직접 작성한 코드
공부하고 나서 진짜 내 머릿속에 남은 것들만 정리
| 헷갈린 것 | 알고 보니 |
| 브라우저에 대해 별 생각이 없었음. | 탭별 렌더러 프로세스로 격리되어 UI 멈춤 방지 확인 |
| 프로세스 내부에서 여러 일하도록 나눈 게 스레드다. 정도의 개념 | 독립된 공간을 제공하여 안정성 추구할 땐 프로세스, 빠르고 가볍게를 원한다면 스레드를. 스레드는 스택을 제외하고 모두 공유한다. |
| Compositor Thread |
| 화면의 레이어를 합성하고, 부드러운 스크롤이나 애니메이션 처리 (메인 스레드 방해 안 함) |
| Raster Thread | 컴포지터가 지시한 레이어의 내용을 실제 픽셀로 그려내는(래스터화) 작업 수행 |
| Worker Thread | Web Worker 등에 의해 생성되며, 메인 스레드와 별개로 무거운 연산 작업 처리 |