[식당 개업으로 이해하는 OS의 원리 1/4] SSD의 프로그램이 프로세스가 되기까지
우리가 무심코 프로그램을 실행할 때, 컴퓨터 내부에서는 SSD의 정적인 코드를 메모리 위의 동적인 프로세스로 깨우기 위한 거대한 작전이 펼쳐집니다. 이 글에서는 어려운 용어를 '식당 개업'이라는 직관적인 비유를 통해 fork/exec 시스템 콜부터 VFS, NVMe, DMA, 그리고 Page Fault를 이용한 지연 로딩(Lazy Loading)까지의 전 과정을 깊이 있게 파헤칩니다. 서버 초기 응답 속도 지연이나 컨테이너 메모리 누수 같은 실무적인 난제를 해결하기 위한 OS 기초 체력을 다시 다져보세요.
![[식당 개업으로 이해하는 OS의 원리 1/4] SSD의 프로그램이 프로세스가 되기까지](/cdn-cgi/image/width=3840,format=auto/api/media/file/procesvsthread.png)
들어가는 글: 면접장 밖에서 다시 만난 CS 전공 지식
우리는 면접을 위해 '프로세스'와 '스레드', '시스템 콜'의 정의를 달달 외웠습니다. 하지만 실무에 치여 살다 보면 이 지식들은 자연스럽게 흐릿해지곤 합니다. "그냥 실행하면 되는 거 아니야?"라고 생각하기 쉽지만, 서버의 초기 응답 속도(Latency) 문제나 간헐적인 I/O 병목 현상을 해결하려면 결국 이 '기초 체력'이 다시 필요해지는 순간이 반드시 옵니다.
이 글에서는 복잡한 전공 서적의 용어 대신, '식당 개업'에 비유하여 SSD에 잠들어 있던 정적인 프로그램(Program)이 어떻게 메모리 위에서 살아 움직이는 프로세스(Process)로 변신하는지 그 여정을 시니어의 관점에서 다시 정리해 봅니다.
개념 잡기: Program(레시피) vs Process(영업 중인 식당)
.jpg?2026-01-30T06%3A09%3A47.303Z)
Process는 가게이고, Thread는 직원을 위한 작업지시서이다. (Photo by Khachik Simonian on Unsplash)
본격적인 이야기 전에, 용어부터 정리해 봅시다. 여러분이 대형 마트(SSD)에서 '식당 창업 키트'를 발견했다고 상상해 보세요. 이 상자 안에는 인테리어 도면, 레시피 북, 식기 세트가 들어 있습니다.
Program (창업 키트): SSD에 저장된 코드 덩어리입니다. 설계도와 레시피는 있지만, 스스로 요리를 하거나 움직일 수는 없는 수동적인 존재(Passive Entity)입니다.
Process (영업 중인 식당): 이 키트를 가져와서 실제로 건물을 빌리고(메모리 할당), 셰프(CPU)를 고용해서 요리를 시작한 능동적인 상태(Active Entity)입니다.
우리가 "프로그램을 실행한다"는 것은, 마트 진열대에 있는 창업 키트(Program)를 가져와 실제 매장(Process)을 차리는 과정을 의미합니다. 이 과정은 절대 혼자서 할 수 없으며, 건물주이자 관리자인 OS(운영체제)의 허락과 도움이 절대적으로 필요합니다.(리눅스 OS 를 기준으로 설명했습니다)
Step 1: 실행 요청과 시스템 콜 (User Space -> Kernel Space)
사용자가 아이콘을 더블 클릭하거나 쉘에서 명령어를 입력하는 순간, OS에게 "식당 하나 차려주세요!"라는 요청이 전달됩니다. 이때 가장 먼저 일어나는 일이 바로 fork()와 exec()입니다.
"새로 식당을 여는데, 왜 옆집 사장님을 복제(fork)하나요?"
맨땅에 헤딩하며 식당을 차리는 건 너무 힘듭니다. 수도는 어디에 연결하고, 가스 배관은 어떻게 뚫어야 하는지 처음부터 다시 배우는 것보다, 이미 영업 중인 옆집 식당(부모 프로세스, 예: Shell)의 구조를 그대로 본떠서 2호점을 내는 게 훨씬 빠르기 때문입니다.
Fork (복제): 기존 사장님(부모)이 관리자(OS/Kernel)에게 요청합니다. "제 가게랑 똑같은 구조로 2호점 하나 내주세요." 관리자는 부모의 정보(환경변수, 권한 등)를 복사해 새로운 사업자 등록증(PID)과 장부(PCB)를 만들어 줍니다.
Exec (변신): 이제 2호점이 생겼습니다. 하지만 메뉴까지 본점과 똑같으면 안 되겠죠? execve() 시스템 콜을 통해 2호점의 인테리어를 싹 뜯어고치고, 우리가 마트에서 사 온 '창업 키트(새로운 프로그램)'로 내용을 채워 넣습니다.
이 방식(fork 후 exec)은 다음과 같은 이점이 있습니다.
Isolation (격리): 2호점이 망한다고 본점이 망하지 않습니다. 각자 독립된 공간을 가집니다.
Inheritance (상속): 권한이나 환경 설정 등 복잡한 세팅을 부모로부터 쉽게 물려받습니다.
💡 Tech Insight: 브라우저는 왜 메모리를 미친 듯이 잡아먹을까?
(부제: 멀티 스레드 대신 멀티 프로세스를 택한 이유)
Chrome이나 Safari 같은 현대 브라우저들이 "메모리 괴물"이 된 이유는 개발자들이 최적화를 못 해서가 아닙니다. 사용자의 안전과 경험을 위해 의도적으로 '멀티 프로세스 아키텍처(Multi-process Architecture)'를 채택했기 때문입니다.
스레드(Thread)를 사용하면 메모리를 공유하여 훨씬 가볍게 만들 수 있지만, 브라우저는 비용(RAM)을 지불하고 다음과 같은 강력한 이점을 얻었습니다.
1. 안정성 (Fault Tolerance) 브라우저는 탭마다 별도의 Renderer Process를 생성합니다. 만약 멀티 스레드 방식이었다면, 하나의 탭에서 스크립트 오류가 발생했을 때 프로세스 전체가 종료되어 모든 탭이 꺼졌을 것입니다. 반면 멀티 프로세스 구조에서는 오류가 발생한 해당 탭의 프로세스만 종료되므로, 브라우저 전체나 다른 탭에는 영향을 주지 않습니다.
2. 보안 (Security & Sandboxing) 프로세스는 운영체제로부터 독립된 가상 메모리 공간(Virtual Address Space)을 할당받습니다. 이를 통해 철저한 샌드박스(Sandbox) 환경을 구축할 수 있습니다. 예를 들어, 악성 코드가 포함된 사이트에 접속하더라도 해당 프로세스는 물리적으로 격리되어 있으므로, 옆 탭에 열려 있는 이메일이나 금융 사이트의 메모리 영역을 훔쳐보는 것(Memory Scraping)이 불가능합니다.
3. 반응성 (Responsiveness & UX) 브라우저의 UI(주소창, 뒤로 가기 등)를 담당하는 Browser Process와 실제 웹페이지를 그리는 Renderer Process가 분리되어 있습니다. 특정 사이트에서 고사양 3D 게임이나 복잡한 연산을 수행하느라 렌더링 엔진이 멈추더라도(Blocking), UI 프로세스는 별개로 작동하기 때문에 사용자는 탭을 닫거나 다른 주소를 입력하는 등 브라우저를 계속 제어할 수 있습니다.
결론: 우리가 잃어버린 RAM은 "절대 꺼지지 않는 안정성"과 "해킹 당하지 않는 보안"을 구매하는 데 사용된 셈입니다.
Step 2: 파일 시스템과 I/O 요청 (Kernel -> Storage Hardware)
.png?2026-02-02T08%3A11%3A09.756Z)
Step 2: 파일 시스템과 I/O 요청 (Kernel -> Storage Hardware)
이제 execve()가 호출되어 커널 모드로 진입했습니다. 셰프(CPU)가 직접 마트(SSD)로 뛰어가서 재료를 사올까요? 아닙니다. 시급 비싼 셰프는 주방을 비우면 안 됩니다. 대신 관리 시스템을 통해 '발주'를 넣습니다.
VFS(Virtual File System) & Inode (재고 파악): 커널은 먼저 파일 시스템이라는 '재고 장부'를 확인합니다. 파일의 메타데이터인 Inode를 통해 권한을 체크하고, 이 재료가 창고의 어느 구역(LBA, 논리 블록 주소)에 있는지 확인합니다.
지금 가입하고, 시니어 개발자로 도약하기 위한 깊이 있는 인사이트를 놓치지 마세요.
이미 회원이신가요?
