---
title: "프로세스: 파일 속 프로그램이 실행 중인 존재가 되는 순간"
author: "Lee"
published_at: "2026-10-23T04:04:00.717Z"
updated_at: "2026-09-30T09:07:46.850Z"
tags: ["컴퓨터공학","운영체제"]
canonical_url: "https://ariser.io/@writer_a1cd615ab19e/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%ED%8C%8C%EC%9D%BC-%EC%86%8D-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%B4-%EC%8B%A4%ED%96%89-%EC%A4%91%EC%9D%B8-%EC%A1%B4%EC%9E%AC%EA%B0%80-%EB%90%98%EB%8A%94-%EC%88%9C%EA%B0%84"
ai_assisted: false
---

# 프로세스: 파일 속 프로그램이 실행 중인 존재가 되는 순간

[원문](https://ariser.io/@writer_a1cd615ab19e/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%ED%8C%8C%EC%9D%BC-%EC%86%8D-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%B4-%EC%8B%A4%ED%96%89-%EC%A4%91%EC%9D%B8-%EC%A1%B4%EC%9E%AC%EA%B0%80-%EB%90%98%EB%8A%94-%EC%88%9C%EA%B0%84)

노트북에서 같은 편집기를 두 번 실행하면 실행 파일은 하나여도 서로 다른 문서를 다룰 수 있다. 이때 운영체제가 관리하는 실행 단위가 프로세스다. 프로그램이 실행할 명령과 데이터를 담은 정적인 결과물이라면, 프로세스는 그 명령을 실행하는 동안 생기는 상태까지 포함한다. 메모리 내용, 다음 명령의 위치, 열린 파일, 실행 권한이 모두 그 상태의 일부다.

![하나의 실행 파일에서 만들어진 두 프로세스가 별도 메모리와 실행 상태를 가지고 CPU를 공유하는 그림](/api/v1/media/3546f0f6-c92d-4bbb-9545-5868a2f46c5f)

*프로세스는 프로그램의 코드뿐 아니라 실행을 계속하기 위한 상태까지 가진다.*

## 실행을 이어 가기 위한 기록

CPU는 레지스터와 프로그램 카운터를 사용해 명령을 수행한다. 프로세스가 CPU를 잠시 내주더라도 다음에 정확히 이어서 실행하려면 이 값을 보관해야 한다. 운영체제는 프로세스 제어 블록 같은 자료구조에 식별자, 실행 상태, 스케줄링 정보와 복원할 문맥을 기록한다. 구체적인 필드와 스레드별 저장 방식은 운영체제마다 다르다. [OSTEP의 프로세스 장](https://pages.cs.wisc.edu/~remzi/OSTEP/cpu-intro.pdf)은 이러한 실행 상태를 프로세스 추상화의 중심으로 설명한다.

프로세스는 보통 독립적인 가상 주소 공간을 가진다. 두 프로세스에서 같은 숫자의 주소가 출력돼도 같은 물리 메모리를 뜻하지 않는다. 주소 변환과 접근 권한 덕분에 한 프로그램의 잘못된 쓰기가 다른 프로그램의 데이터를 바로 바꾸는 일을 막을 수 있다. 공유 메모리를 명시적으로 설정하면 일부 영역을 함께 쓰는 것도 가능하다.

## 기다리는 프로그램도 살아 있다

단순한 상태 모델에서는 실행 중, 준비, 대기로 구분한다. 실행 중은 CPU에서 실제 명령을 수행하는 상태다. 준비 상태는 실행할 수 있지만 CPU 배정을 기다리는 상태다. 대기는 입력이나 잠금처럼 필요한 사건이 아직 발생하지 않아 당장 진행할 수 없는 상태다. CPU를 쓰지 않는다고 종료된 것은 아니다.

파일을 읽는 편집기를 생각해 보자. 편집기가 읽기를 요청한 뒤 디스크 응답을 기다리는 동안 계산기는 CPU를 사용할 수 있다. 읽기가 끝나면 편집기는 다시 준비 상태에 들어간다. 여기서 입력 완료와 즉시 실행은 같은 사건이 아니다. 어떤 준비 작업을 먼저 실행할지는 스케줄러가 결정하므로, 응답 지연에는 장치 시간과 CPU 대기 시간이 함께 섞인다.

## 생성과 종료에도 수명이 있다

유닉스 계열에서는 부모 프로세스가 자식 프로세스를 만드는 구조가 흔하다. `fork`는 새 프로세스를 만들고, `exec` 계열은 현재 프로세스가 실행하는 프로그램을 교체한다. 현대 구현에서는 메모리를 즉시 전부 복사하기보다 쓰기가 일어날 때 복사하는 방식도 쓴다. 따라서 프로세스 생성 비용을 언제나 메모리 전체 복사 비용으로 계산하면 부정확하다.

프로세스가 종료돼도 부모가 종료 결과를 확인할 때까지 작은 관리 정보가 남을 수 있다. 이를 유닉스에서는 좀비 상태라고 부른다. 좀비가 이전의 모든 메모리를 계속 점유하며 명령을 수행하는 것은 아니다. 반대로 부모가 먼저 종료된 자식을 고아라고 부르는 경우가 있는데, 부모 관계와 종료 여부는 서로 다른 기준이다.

프로세스 분리는 장애 격리와 권한 구분에 유용하지만, 데이터 교환에는 파이프·소켓·공유 메모리 등의 통신 경로가 필요하다. 프로그램을 여러 프로세스로 나눌 때는 격리의 이점과 생성·통신·복원 비용을 함께 봐야 한다. 작업 관리자에 표시되는 프로세스 수만으로 컴퓨터의 실제 병렬 처리량을 판단할 수 없는 이유도 여기에 있다.

### 참고 자료

- [OSTEP — The Abstraction: The Process](https://pages.cs.wisc.edu/~remzi/OSTEP/cpu-intro.pdf)
