IMG-LOGO
공지사항 :

프로세스(Process)의 이해

lmkfox - 2026-07-18 07:15:04 3 Views 0 Comment

프로세스(Process)의 이해, 프로그램은 어떻게 실행되고 운영체제는 어떻게 관리할까?

컴퓨터에서 웹 브라우저를 실행하거나 문서 편집기를 열고, 데이터베이스 서버를 시작하면 우리는 단순히 “프로그램을 실행했다”고 생각합니다. 하지만 운영체제 내부에서는 실행 파일을 메모리에 적재하고 CPU에 실행 권한을 부여하며, 필요한 메모리와 시스템 자원을 할당하는 복잡한 과정이 이루어집니다. 이처럼 실행 중인 프로그램을 운영체제에서는 **프로세스(Process)**라고 합니다.

프로세스는 운영체제가 관리하는 가장 기본적인 실행 단위이며, CPU 사용, 메모리 할당, 파일 접근, 네트워크 통신 등 모든 작업의 중심이 됩니다. 특히 시스템 엔지니어(System Engineer)는 서버의 성능 저하, CPU 사용률 급증, 메모리 부족, 서비스 장애 등을 분석할 때 프로세스를 가장 먼저 확인하게 됩니다.

이번 글에서는 프로그램이 프로세스로 변하는 과정, 프로세스의 생명 주기(Life Cycle), PID(Process ID), 부모 프로세스와 자식 프로세스의 관계, 프로세스 스케줄링과 문맥 교환(Context Switching)까지 실무 중심으로 자세히 알아보겠습니다.


프로세스(Process)란 무엇인가?

프로세스(Process)는 실행 중인 프로그램을 의미합니다.

하드디스크나 SSD에 저장되어 있는 프로그램은 단순한 실행 파일일 뿐입니다. 하지만 사용자가 프로그램을 실행하는 순간 운영체제는 해당 파일을 메모리에 적재하고 CPU가 실행할 수 있도록 필요한 자원을 할당합니다. 이때부터 프로그램은 프로세스가 됩니다.

예를 들어 다음과 같은 프로그램을 실행하면 각각 하나 이상의 프로세스가 생성됩니다.

  • Chrome 웹 브라우저
  • Microsoft Word
  • PostgreSQL
  • Nginx
  • Apache
  • Docker

같은 프로그램을 여러 번 실행하면 각각 독립적인 프로세스로 동작합니다.


프로그램과 프로세스의 차이

많은 사람들이 프로그램과 프로세스를 같은 의미로 생각하지만 둘은 분명한 차이가 있습니다.

구분

프로그램

프로세스

상태

저장된 실행 파일

실행 중인 프로그램

위치

HDD, SSD

메모리(RAM)

실행 여부

실행되지 않음

CPU에서 실행 중

자원 사용

없음

CPU, 메모리, 파일, 네트워크 사용

예를 들어 nginx 실행 파일은 프로그램이며, 이를 실행하여 메모리에 올라간 nginx 서비스는 프로세스입니다.


프로그램이 프로세스가 되는 과정

사용자가 프로그램을 실행하면 운영체제는 다음과 같은 과정을 수행합니다.

1단계. 실행 파일 읽기

운영체제는 SSD나 HDD에서 실행 파일을 읽습니다.


2단계. 메모리 할당

프로그램이 실행될 수 있도록 메모리(RAM)를 할당합니다.

메모리는 다음과 같은 영역으로 구성됩니다.

  • 코드(Code)
  • 데이터(Data)
  • 힙(Heap)
  • 스택(Stack)

3단계. 프로세스 생성

운영체제는 새로운 프로세스를 생성하고 고유한 PID(Process ID)를 부여합니다.


4단계. CPU 스케줄링

CPU가 해당 프로세스를 실행할 수 있도록 스케줄러에 등록합니다.


5단계. 실행 시작

CPU는 프로세스의 명령어를 하나씩 실행하기 시작합니다.

이때부터 사용자는 프로그램을 사용할 수 있게 됩니다.


프로세스의 메모리 구조

프로세스는 메모리 안에서 여러 영역으로 나뉘어 관리됩니다.

Code 영역

프로그램의 실행 코드가 저장됩니다.

읽기 전용으로 관리되는 경우가 많습니다.


Data 영역

전역 변수와 정적 변수가 저장됩니다.

프로그램이 종료될 때까지 유지됩니다.


Heap 영역

프로그램 실행 중 동적으로 생성되는 메모리입니다.

예를 들어 C 언어의 malloc(), C++의 new가 사용하는 공간입니다.


Stack 영역

함수 호출과 지역 변수, 매개변수를 저장합니다.

함수가 종료되면 자동으로 메모리가 해제됩니다.


PID(Process ID)란?

운영체제는 모든 프로세스를 구별하기 위해 고유한 번호를 부여합니다.

이 번호를 PID(Process ID)라고 합니다.

예를 들어 Linux에서는 다음과 같은 명령으로 확인할 수 있습니다.

ps -ef

또는

top

출력 예시는 다음과 같습니다.

PID   COMMAND
1     systemd
245   sshd
720   nginx
1150  postgres

PID는 운영체제가 프로세스를 관리하는 기준이 되며, 프로세스를 종료하거나 우선순위를 변경할 때도 PID를 사용합니다.


부모 프로세스와 자식 프로세스

운영체제에서는 대부분의 프로세스가 다른 프로세스에 의해 생성됩니다.

프로세스를 생성한 프로세스를 부모 프로세스(Parent Process), 새롭게 생성된 프로세스를 **자식 프로세스(Child Process)**라고 합니다.

Linux에서는 fork() 시스템 콜을 사용하여 부모 프로세스를 복제한 후 자식 프로세스를 생성합니다. 이후 exec() 계열 시스템 콜을 통해 새로운 프로그램을 실행하는 방식이 일반적입니다.

예를 들어 systemdsshd를 실행하고, sshd가 로그인 세션을 위한 셸(bash)을 생성하는 구조가 대표적인 사례입니다.

프로세스 간의 관계는 pstree 명령으로 확인할 수 있습니다.

pstree

이 명령은 부모와 자식 프로세스의 계층 구조를 트리 형태로 보여주므로 시스템 구조를 이해하는 데 유용합니다.


프로세스의 생명 주기(Life Cycle)

프로세스는 생성부터 종료까지 여러 상태를 거칩니다.

대표적인 상태는 다음과 같습니다.

New

프로세스가 생성되는 단계입니다.


Ready

실행 준비가 완료되어 CPU를 기다리는 상태입니다.


Running

CPU에서 실제 명령을 실행하는 상태입니다.


Waiting(Blocked)

입출력(I/O)이나 네트워크 응답 등을 기다리는 상태입니다.

예를 들어 디스크에서 파일을 읽거나 데이터베이스 응답을 기다릴 때 이 상태가 됩니다.


Terminated

프로세스 실행이 종료된 상태입니다.

운영체제는 사용했던 메모리와 자원을 회수합니다.


프로세스 스케줄링(Process Scheduling)

CPU는 동시에 수많은 프로세스를 실행해야 합니다.

하지만 CPU는 한 순간에 제한된 수의 작업만 처리할 수 있기 때문에 운영체제는 어떤 프로세스를 먼저 실행할지 결정해야 합니다.

이를 프로세스 스케줄링이라고 합니다.

운영체제의 스케줄러는 다음과 같은 요소를 고려합니다.

  • 우선순위(Priority)
  • CPU 사용 시간
  • 대기 시간
  • 응답 시간
  • 실시간 처리 여부

이를 통해 시스템 전체의 성능과 응답성을 유지합니다.


CPU 스케줄링 방식

대표적인 스케줄링 알고리즘은 다음과 같습니다.

FCFS(First Come First Served)

먼저 도착한 프로세스를 먼저 실행합니다.

구현은 간단하지만 긴 작업이 앞에 있으면 다른 프로세스가 오래 기다릴 수 있습니다.


SJF(Shortest Job First)

실행 시간이 짧은 프로세스를 우선 실행합니다.

평균 대기 시간을 줄일 수 있지만 실행 시간을 미리 알기 어렵다는 한계가 있습니다.


Round Robin

각 프로세스에 일정한 시간(Time Quantum)을 할당하여 순환하면서 실행합니다.

현재 대부분의 운영체제가 이 방식을 기반으로 동작합니다.


Priority Scheduling

우선순위가 높은 프로세스를 먼저 실행합니다.

실시간 시스템에서 많이 사용됩니다.


문맥 교환(Context Switching)이란?

CPU는 여러 프로세스를 번갈아 실행합니다.

이때 현재 실행 중인 프로세스의 상태를 저장하고 다른 프로세스의 상태를 복원하는 과정을 **문맥 교환(Context Switching)**이라고 합니다.

저장되는 정보는 다음과 같습니다.

  • 프로그램 카운터(PC)
  • CPU 레지스터
  • 스택 포인터
  • 메모리 정보
  • 실행 상태

문맥 교환 덕분에 사용자는 여러 프로그램이 동시에 실행되는 것처럼 느낄 수 있습니다.

하지만 문맥 교환은 CPU가 실제 작업을 수행하는 시간이 아니므로 과도하게 발생하면 성능이 저하될 수 있습니다.


Linux에서 프로세스 관리

시스템 엔지니어는 다음과 같은 명령어를 자주 사용합니다.

프로세스 확인

ps -ef

실시간 프로세스 확인

top

향상된 실시간 모니터링

htop

프로세스 종료

kill PID

강제 종료

kill -9 PID

프로세스 트리 확인

pstree

이러한 명령어는 서버 운영과 장애 대응에서 가장 기본적으로 사용됩니다.


시스템 엔지니어가 프로세스를 이해해야 하는 이유

실무에서 발생하는 많은 장애는 프로세스와 관련이 있습니다. 예를 들어 웹 서버 프로세스가 비정상 종료되면 서비스가 중단되고, 데이터베이스 프로세스가 과도한 CPU를 사용하면 전체 시스템의 응답 속도가 느려질 수 있습니다. 또한 프로세스가 메모리를 해제하지 않는 메모리 누수(Memory Leak)가 발생하면 서버의 가용 메모리가 줄어들어 결국 서비스 장애로 이어질 수 있습니다.

이러한 문제를 해결하기 위해서는 ps, top, htop, pidstat, vmstat 등의 도구를 활용해 프로세스의 상태와 자원 사용량을 분석하고, 필요에 따라 우선순위를 조정하거나 비정상 프로세스를 종료하는 능력이 필요합니다.


마무리

프로세스는 단순히 실행 중인 프로그램이 아니라 운영체제가 CPU, 메모리, 파일 시스템, 네트워크 등 다양한 자원을 효율적으로 관리하기 위한 핵심 실행 단위입니다. 프로그램이 메모리에 적재되어 프로세스로 생성되고, PID를 부여받아 생명 주기를 거치며, 스케줄러에 의해 실행되고 종료되는 전 과정은 운영체제의 중요한 기능입니다.

또한 부모 프로세스와 자식 프로세스의 관계, CPU 스케줄링, 문맥 교환과 같은 개념은 서버의 성능과 안정성을 이해하는 데 필수적인 지식입니다. 시스템 엔지니어는 이러한 원리를 바탕으로 프로세스 상태를 분석하고 장애를 신속하게 해결하며, 서버를 효율적으로 운영할 수 있어야 합니다.

다음 글에서는 스레드(Thread)의 이해를 주제로, 프로세스와 스레드의 차이, 멀티스레드와 멀티프로세스의 특징, 동시성(Concurrency)과 병렬성(Parallelism)의 개념, 그리고 서버 애플리케이션에서 스레드가 어떻게 활용되는지 실무 중심으로 자세히 알아보겠습니다.


댓글