컴퓨터가 느려지면 습관적으로 Ctrl + Alt + Delete를 눌러 작업 관리자를 켭니다. 거기서 우리는 수많은 '프로세스'들이 내 메모리를 잡아먹고 있는 광경을 목격합니다.
그런데 개발자 채용 공고를 보면 "멀티 프로세스 경험 우대"가 아니라 "멀티 스레드 환경 이해도 필수"라고 적혀 있습니다.
도대체 프로세스는 뭐고 스레드는 뭘까요? 이 둘의 차이를 명확히 구분하는 것, 백엔드 개발자의 필수 소양입니다.
프로세스는 쉽게 말해 '실행 중인 프로그램'입니다. 여러분이 하드디스크에 저장된 IntelliJ 아이콘을 더블 클릭하는 순간, 메모리에 적재되어 프로세스가 됩니다.
프로세스는 '완벽하게 독립된 공장'입니다.
💡 크롬 탭이 프로세스인 이유
크롬 브라우저는 탭 하나하나가 별도의 프로세스입니다. 그래서 특정 사이트가 응답 없음으로 멈춰도, 브라우저 전체가 꺼지지 않고 그 탭만 종료할 수 있는 것이죠.
(단점: 메모리를 엄청나게 잡아먹습니다.)
스레드는 '프로세스 안에서 실행되는 작업의 단위'입니다. 하나의 프로세스 안에는 반드시 하나 이상의 스레드가 존재합니다.
스레드는 공장(프로세스) 안에서 일하는 '일꾼'입니다.

웹 서버(Spring Boot 등)는 수백, 수천 명의 요청을 동시에 처리해야 합니다. 만약 사용자 1명당 프로세스 1개를 만든다면?
메모리 폭발: 프로세스는 덩치가 큽니다(Code, Data, Heap 다 따로 만듦). 서버 메모리가 남아나지 않습니다.
비용 과다: 프로세스를 갈아 끼우는 비용(Context Switching)이 매우 비쌉니다.
그래서 우리는 '멀티 스레드' 방식을 사용합니다. 프로세스(서버)는 딱 하나만 띄워두고, 요청이 들어올 때마다 가벼운 스레드(일꾼)를 하나씩 배정해서 일을 시키는 것이죠.
⚠️ 치명적인 단점: 동시성 이슈
스레드끼리는 Heap(데이터) 영역을 공유한다고 했죠? 만약 A 스레드가 "통장 잔고" 데이터를 수정하고 있는데, B 스레드가 동시에 와서 읽어가면? 돈이 복사되거나 증발하는 대참사가 일어납니다.
이것이 바로 동시성 문제(Concurrency Issue)이며, 이를 막기 위해 Syncronized 같은 기술이 필요합니다.
면접관이 가장 좋아하는 질문 중 하나입니다.
A. "프로세스는 운영체제로부터 자원을 할당받는 가장 작은 작업 단위이고, 스레드는 프로세스 내에서 실행되는 흐름의 단위입니다. 가장 큰 차이는 메모리 공유 여부입니다. 프로세스는 메모리가 완전히 분리되어 있지만, 스레드는 Stack만 따로 가지고 Code, Data, Heap 영역은 공유합니다."
A. "크롬은 안정성을 위해 탭마다 별도의 프로세스를 생성하는 멀티 프로세스 방식을 주로 사용합니다. 덕분에 하나의 탭에 문제가 생겨도 전체 브라우저가 종료되지 않습니다."
지금까지 JVM 메모리 구조, GC, 그리고 프로세스와 스레드까지. 자바 백엔드 개발자가 컴퓨터를 이해하는 데 필요한 가장 기초적인 지식을 쌓았습니다.
이제 여러분의 컴퓨터 내부(Local)에 대한 이야기는 끝났습니다. 다음 시간부터는 내 컴퓨터가 바깥세상과 소통하는 법, Part 2. 네트워크(Network) 편이 시작됩니다.
첫 번째 주제는 개발자 면접의 '바이블'과도 같은 질문입니다.
[Network] 주소창에 www.google.com을 치면 일어나는 일 (면접 프리패스)