LINUX

프로세스는 어떻게 실행되는가(2/3): 메모리, PCB, 스레드 이해하기

최서은 2026. 4. 15. 16:56

 

 

프로그램을 실행하는 것은 단순히 작성된 코드를 한 번 읽고 끝나는 과정이 아닙니다.

실행되는 순간, 운영체제는 해당 프로그램은 하나의 프로세스를 만들고 이를 메모리 위에 올려 체계적으로 관리합니다.

 

이 과정에서 프로세스는 구조화된 메모리, 실행 흐름을 포함한 하나의 독립적인 실행 환경으로 동작합니다. 

또한 효율적인 처리를 위해 하나의 프로세스 내에서도 여러 작업이 동시에 이루어지며, 이때 각 실행 흐름은 자원을 공유합니다.

 

따라서 이번 포스팅에서는 프로세스의 단순한 메모리 구조를 넘어 운영체제가 이를 어떻게 관리하는지 그리고 실행 흐름이 어떻게 구성되는지 살펴보겠습니다. 

 

 

 

프로세스 메모리 구조


프로그램이 동작하는 동안에는 코드 실행, 함수 호출, 객체 생성 등 여러 작업들이 동시에 이루어집니다.

이들을 하나의 공간에서 처리한다면 성능 저하뿐만 아니라 데이터 손상이나 오류가 발생할 가능성이 증가합니다.

 

이러한 문제를 방지하기 위해 프로세스의 메모리 구조를 구조적으로 나누고, 각 영역이 맡은 역할에 맞게 관리합니다.

  • Text 영역 (Code 영역): 실행 가능한 명령어(기계어)를 포함합니다. (일반적으로 읽기 전용) 
  • Data 영역: 전역 변수, static 변수의 보관소
  • Heap 영역: 런타임(프로세스 실행 중)에 결정되는 동적 할당 공간 (아래에서 위로 확장)
  • Stack 영역: 매개 변수, 함수 호출, 지역 변수 등 임시 데이터 (위에서 아래로 확장)

 

메모리를 나누는 이유

 

프로세스의 이러한 내부 메모리 구조는 프로그램 실행을 안정적이고 효율적으로 유지하기 위한 설계 방식입니다.

  • 안정성: 영역별 접근 권한 설정 (Code는 Read-Only 등)을 통한 보호
  • 효율성: 공유 라이브러리나 텍스트 영역의 공유를 통한 메모리 절약
  • 실행 흐름 유지: 복잡한 함수 호출과 복귀 주소 관리의 용이성

 

 

 

 

프로세스 상태와 생명주기


프로세스는 생성부터 소멸까지 크게 5가지 상태를 거치며 변화합니다. 이 과정을 프로세스 생명 주기라고 합니다.

운영체제는 스케줄러를 통해 각 프로세스의 상태를 기반으로 CPU 자원 할당 여부를 결정합니다.

프로세스의 상태 관리는 제한된 CPU 자원을 관리하기 위한 기준이 됩니다.

 

프로세스의 5가지 상태는 아래와 같습니다

 

1. New(생성)

  • 운영체제의 실행 승인을 받지 못한 새로운 프로세스입니다.
  • 메모리(RAM)에 로드되지 않지만, 프로세스 제어 블록은 생성됩니다.

2. Ready(준비)

  • 운영체제가 실행 기회를 제공했을 때 바로 실행 가능하도록 준비된 프로세스입니다.

3. Running(실행)

  • 현재 실행 중인 프로세스입니다.

4. Blocked/Waiting(대기)

  • 프로세스가 입출력 작업과 같은 특정 이벤트가 발생할 때까지 실행을 계속할 수 없음을 의미합니다.

5. Exit/Terminated(종료)

  • 운영체제에서 완료되었거나 어떤 문제로 인해 중단되어 해제된 프로세스입니다.

 

 

프로세스 상태 전이

  • Null -> New: 프로그램이 실행되어 커널 내부에 프로세스 제어 블록(PCB)이 생성되는 단계
  • New -> Ready: 커널이 프로세스 실행을 승인하고 메모리 공간을 할당하여 준비 큐(Ready Queue)에 등록된 상태
  • Ready -> Running: 스케줄러가 준비 큐의 프로세스 중 하나를 선택하여 CPU를 할당
  • Running -> Exit: 프로세스가 모든 명령어를 수행하고 정상적으로 종료되거나, 에러로 인해 중단된 상태
  • Running -> Ready: 할당된 시간이 만료되어 CPU를 반납하고 다시 준비 큐로 돌아가는 상태
  • Running -> Blocked: 프로세스가 실행 중 입출력 요청이나 자원 대기 등 즉시 처리할 수 없는 이벤트가 발생하여, 해당 이벤트가 완료될 때까지 CPU를 반납하는 상태
  • Blocked -> Ready: 기다리던 입출력 작업이나 이벤트가 완료되어 다시 실행될 자격을 얻고 준비 큐로 돌아가는 상태
  • Ready -> Exit: 부모 프로세스에 의해 강제 종료되거나 메모리 부족 등으로 운영체제가 강제로 정리하는 경우

 

 

 

 

PCB (Process Control Block)


프로세스 제어 블록(PCB)는 운영체제가 프로세스 정보를 추적하고 관리하는데 사용하는 일종의 프로세스의 신분증입니다.

이를 통해 운영체제는 프로세스 실행을 모니터링하고 제어할 수 있습니다.

 

PCB에는 프로세스에 대한 중요한 정보가 담겨있어 이 일반 사용자가 접근할 수 없도록 운영체제가 관리하는 커널 메모리 영역 저장됩니다.

 

PCB에 저장되는 정보

  • 프로세스 상태 : 앞에서 다룬 프로세스의 상태를 저장합니다.
  • 프로세스 ID(PID): 프로세스의 고유한 식별자인 PID를 저장합니다.
  • 프로그램 카운터(PC): 프로세스에서 실행될 다음 명령어의 주소를 저장합니다. (다시 차례가 왔을 때 어디서부터 시작할지 알려주는 이정표 역할)
  • CPU 레지스터: CPU 내부에서 계산 중이던 중간값들을 저장합니다. (다시 실행될 때 중단된 지점부터 연산을 이어가기 위함입니다.)
  • 메모리 관리 정보: 프로세스가 메모리의 어느 범위(주소)에 할당되어 있는지, 페이지 테이블 등의 정보를 담고 있습니다.
  • 입출력 상태 정보: 프로세스에 할당된 입출력 장치와 열려 있는 파일 목록 등을 관리합니다.

 

이러한 PCB는 프로세스당 하나씩 존재하기 때문에, 프로세스의 개수만큼 커널 메모리에 저장됩니다.

운영체제는 이 수많은 PCB를 효율적으로 찾기 위해 프로세스 테이블 (Process Table)이라는 연결 리스트 형태의 구조로 체계적으로 관리합니다.

 

결국 PCB는 컨텍스트 스위칭 시 작업의 중단과 재개를 위한 세이브 파일 역할을 수행하는 동시에, 커널이 프로세스별 우선순위를 식별하여 자원을 공평하게 배분하기 위한 핵심 도구로 사용됩니다.

 

 

 

 

스레드(Thread)


스레드는 프로세스 내에서 가장 작은 실행 단위입니다.

스레드를 사용하면 여러 작업을 동시에 실행할 수 있어 프로그램 효율성이 향상됩니다.

프로세스와 달리 스레드는 자체 주소 공간을 갖지 않고 동일한 프로세스 내의 다른 스레드들과 메모리를 공유합니다.

  • 공유 영역: 프로세스의 Code(코드), Data(데이터), Files(설정 파일) 영역은 프로세스 내의 모든 스레드가 공동으로 사용합니다. 덕분에 스레드 간 데이터 교환이 매우 효율적입니다.
  • 개별 영역: 각 스레드는 독립적인 실행 흐름을 유지하기 위해 Stack(스택), Registers(레지스터), Program Counter(PC)를 별도로 가집니다. 이는 각 스레드가 '현재 어디까지 실행했는지'를 따로 기억해야 하기 때문입니다.

 

싱글 스레드 vs 멀티 스레드

 

  • 싱글 스레드(Single Thread): 하나의 프로세스에서 하나의 실행 흐름만 가지는 구조입니다. 한 번에 하나의 작업만 처리할 수 있습니다.
  • 멀티 스레드(Multi Thread): 하나의 프로세스 내에 여러 개의 스레드가 동시에 존재하며 작업을 나누어 처리하는 구조입니다. 프로세스의 자원을 공유하면서 각자 독립적인 실행 정보를 유지하므로, 시스템 자원을 효율적으로 사용하면서 병렬 처리가 가능해집니다.

 

멀티스레딩이 만들어내는 동시성과 병렬성

 

  • 응답성 향상: 웹 서버가 동시 요청을 처리하거나, 게임에서 렌더링과 로직을 분리하는 것처럼 여러 작업을 끊김 없이 처리할 수 있게 해줍니다.
  • 처리 방식
    • 동시성(Concurrency): 점원 한 명이 여러 테이블을 왕복하듯, 1개의 코어가 여러 스레드를 아주 빠르게 번갈아 실행하여 동시에 돌아가는 것처럼 보이게 합니다.
    • 병렬성(Parallelism): 점원 두 명이 각자 서빙하듯, 멀티코어 환경에서 여러 코어가 각자 스레드를 맡아 물리적으로 '진짜 동시에' 실행합니다.

 

 

 

 

 

 

 

프로세스 vs 스레드

1. 메모리 및 자원 공유

  • 프로세스: 운영체제로부터 독립된 메모리 공간(Code, Data, Heap, Stack)을 할당받습니다. 다른 프로세스의 자원에 직접 접근할 수 없으며, 통신하려면 복잡한 과정을 거쳐야 합니다.
  • 스레드: 프로세스 내의 Code, Data, Heap 메모리 영역과 공유 자원(Files)을 다른 스레드와 공유하며 실행됩니다. 오직 개별적인 실행 흐름을 위한 Stack과 Register, PC만 독립적으로 가집니다.

2. 생성 및 관리 비용

  • 프로세스: 새로운 프로세스를 만들려면 독립적인 메모리 전체를 할당해야 하므로 생성 비용이 크고 속도가 느립니다. 컨텍스트 스위칭 시에도 PCB의 모든 정보를 갈아끼워야 하므로 오버헤드가 큽니다.
  • 스레드: 프로세스의 자원을 공유하므로 생성과 종료가 훨씬 빠르고 가볍습니다. 스레드 간 전환 시에는 공유 영역을 제외한 최소한의 정보만 교체하면 되므로 컨텍스트 스위칭 비용이 저렴합니다.

3. 안정성과 독립성

  • 프로세스: 각자 독립된 공간에서 살기 때문에 한 프로세스에 문제가 생겨도 다른 프로세스에 영향을 주지 않습니다. (예: 크롬 탭 하나가 멈춰도 다른 탭은 살아있는 구조)
  • 스레드: 자원을 공유하는 특성 때문에, 한 스레드에서 오류가 발생해 메모리를 오염시키면 프로세스 전체가 종료될 수 있습니다. 또한, 여러 스레드가 동시에 공유 데이터에 접근할 때 '동기화 문제'가 발생할 수 있어 주의가 필요합니다.

 

 

 


 

 

이번 글에서 프로그램이 어떻게 프로세스로 탄생하고 운영체제에 의해 관리되는지 알아보았다면, 다음 글에서는 이 프로세스들이 한정된 CPU 자원을 어떻게 나누어 쓰는지, 그리고 그 과정에서 일어나는 핵심 메커니즘인 스케줄링컨텍스트 스위칭을 다뤄보겠습니다.

 

 



 

 


학습용으로 작성한 포스팅이므로 오류가 있을 수 있습니다.

잘못된 내용이나 보완이 필요한 부분이 있다면 댓글로 알려주시면 감사하겠습니다.
궁금한 점도 편하게 남겨주세요.

 

 

 

출처

- Thread in Operating System

https://www.geeksforgeeks.org/operating-systems/thread-in-operating-system/

- Process Control Block in OS

https://www.geeksforgeeks.org/operating-systems/process-control-block-in-os/

- 5 State Process Model in Operating System

https://www.geeksforgeeks.org/operating-systems/5-state-process-model-in-operating-system/