프로세스 개요
운영체제를 공부할 때 가장 먼저 나오는 개념 중 하나가 `프로세스`이다.
프로세스는 간단히 말하면 실행 중인 프로그램이다.
프로그램 = 실행되기 전의 파일
프로세스 = 실행 중인 프로그램
프로그램은 실행되기 전까지는 보조기억장치에 저장된 데이터 덩어리이다.
예를 들어 .exe 파일이나 실행 가능한 프로그램 파일은 아직 실행되기 전까지는 그저 디스크에 저장된 파일이다.
하지만 사용자가 프로그램을 실행하면 운영체제가 해당 프로그램을 메모리에 적재한다.
이 순간 프로그램은 실행 가능한 상태가 되고, 이를 프로세스라고 부른다.
즉, 프로그램을 실행하여 메모리에 올리면 프로세스가 생성된다.
프로세스의 종류
프로세스는 실행되는 방식에 따라 크게 포그라운드 프로세스와 백그라운드 프로세스로 나눌 수 있다.
포그라운드 프로세스
포그라운드 프로세스(foreground process)는 사용자가 볼 수 있는 공간에서 실행되는 프로세스이다.
예를 들어 사용자가 직접 실행한 웹 브라우저, 메모장, 워드프로세서, 게임 프로그램 등이 여기에 해당한다.
즉, 사용자가 실행 중임을 직접 볼 수 있는 프로세스라고 이해하면 된다.
백그라운드 프로세스
백그라운드 프로세스(background process)는 사용자가 직접 볼 수 없는 공간에서 실행되는 프로세스이다.
예를 들어 백신 프로그램, 자동 업데이트 프로그램, 클라우드 동기화 프로그램처럼 화면에 직접 보이지 않아도 뒤에서 계속 실행되는 프로세스들이 있다.
백그라운드 프로세스는 다시 두 가지로 나눠볼 수 있다
사용자와 상호작용할 수 있는 백그라운드 프로세스
사용자와 상호작용하지 않고 정해진 일만 수행하는 백그라운드 프로세스
이 중 사용자와 직접 상호작용하지 않고 정해진 일만 수행하는 프로세스를 데몬(daemon) 또는 서비스(service)라고 부른다.
보통 리눅스 계열에서는 데몬이라는 표현을 많이 쓰고, 윈도우에서는 서비스라는 표현을 많이 사용한다.
프로세스 제어 블록 PCB
모든 프로세스가 실행되려면 CPU가 필요하지만 CPU는 한정된 자원이다.
실행하고 싶은 프로세스는 많지만, CPU가 동시에 처리할 수 있는 작업에는 한계가 있다.
그래서 운영체제는 여러 프로세스가 CPU를 번갈아 사용할 수 있도록 관리한다.
프로세스는 자기 차례가 오면 정해진 시간만큼 CPU를 사용한다.
그리고 시간이 끝나면 타이머 인터럽트가 발생하고, 운영체제는 다른 프로세스에게 CPU를 넘긴다.
이처럼 여러 프로세스가 빠르게 번갈아 실행되기 때문에 운영체제는 각 프로세스의 정보를 정확히 관리해야 한다.
이를 위해 사용하는 것이 PCB(Process Control Block)이다.
PCB는 프로세스와 관련된 정보를 저장하는 자료구조이다.
쉽게 말하면 PCB는 프로세스에 붙어 있는 태그와 같다.
상품에 태그가 붙어 있으면 상품명, 가격, 바코드 등을 알 수 있는 것처럼, PCB를 보면 해당 프로세스의 여러 정보를 알 수 있다.
PCB는 프로세스가 생성될 때 커널 영역에 만들어지고, 프로세스가 종료되면 폐기된다.
PCB에 저장되는 정보
PCB에는 프로세스를 관리하기 위한 여러 정보가 저장된다.
대표적으로 다음과 같은 정보들이 있다.
프로세스 ID
레지스터 값
프로세스 상태
CPU 스케줄링 정보
메모리 정보
사용한 파일과 입출력 장치 정보
프로세스 ID
프로세스 ID, 즉 PID는 특정 프로세스를 식별하기 위해 부여하는 고유한 번호이다.
운영체제에는 여러 프로세스가 동시에 존재한다.
따라서 각 프로세스를 구분할 수 있는 식별자가 필요하다.
이때 사용하는 것이 PID이다.
레지스터 값
PCB에는 프로세스가 사용하던 레지스터 값도 저장된다.
프로세스는 CPU를 계속 독점해서 사용하는 것이 아니라, 정해진 시간만큼 사용한 뒤 다른 프로세스에게 CPU를 넘긴다.
그런데 프로세스가 다시 자기 차례가 되었을 때 이전에 하던 작업을 이어서 실행하려면, 이전에 사용하던 레지스터 값을 복원해야 한다.
예를 들어 프로그램 카운터는 다음에 실행할 명령어의 메모리 주소를 담고 있다.
만약 프로세스가 CPU를 빼앗길 때 프로그램 카운터 값을 저장하지 않으면, 다음에 자기 차례가 왔을 때 어디서부터 실행해야 하는지 알 수 없다.
또한 연산 도중에 타이머 인터럽트가 발생할 수도 있다.
이 경우 중간 계산값이 레지스터에 들어 있을 수 있으므로, 이 값들도 저장해두어야 한다.
즉, 레지스터 값은 프로세스 실행을 나중에 재개하기 위해 필요하다.
프로세스 상태
PCB에는 프로세스의 현재 상태도 저장된다.
프로세스는 항상 실행 중인 상태만 가지는 것이 아니다.
CPU를 사용 중인 상태
CPU를 기다리는 상태
입출력 장치를 기다리는 상태
종료된 상태
예를 들어 어떤 프로세스는 현재 CPU를 사용 중일 수 있고, 어떤 프로세스는 CPU를 할당받기 위해 준비 큐에서 기다리고 있을 수 있다.
또 다른 프로세스는 입출력 작업이 끝나기를 기다리는 중일 수 있다.
운영체제는 PCB에 저장된 프로세스 상태를 보고 해당 프로세스를 어떻게 관리할지 결정한다.
CPU 스케줄링 정보
PCB에는 CPU 스케줄링에 필요한 정보도 저장된다.
CPU 스케줄링 정보는 프로세스가 언제, 어떤 순서로 CPU를 할당받을지 결정하는 데 필요한 정보이다.
예를 들어 우선순위, 준비 큐에서의 위치, 스케줄링 관련 값들이 여기에 포함될 수 있다.
프로세스마다 중요도나 실행 조건이 다를 수 있으므로, 운영체제는 이런 정보를 참고해 다음에 실행할 프로세스를 선택한다.
메모리 정보
PCB에는 프로세스가 메모리의 어느 위치에 저장되어 있는지에 대한 정보도 들어 있다.
프로세스가 실행되려면 메모리에 올라와 있어야 한다.
따라서 운영체제는 해당 프로세스의 코드와 데이터가 메모리 어디에 있는지 알아야 한다.
또한 가상 메모리 시스템에서는 페이지 테이블 정보도 필요하다.
페이지 테이블은 가상 주소를 실제 물리 주소로 변환하는 데 사용되는 정보이다.
즉, PCB의 메모리 정보는 프로세스의 메모리 위치를 관리하기 위한 정보라고 볼 수 있다.
사용한 파일과 입출력 장치 정보
프로세스가 실행되면서 파일을 열거나 입출력 장치를 사용할 수 있다.
예를 들어 어떤 프로세스는 특정 파일을 열어 읽고 있을 수 있고, 다른 프로세스는 프린터나 디스크 같은 입출력 장치를 사용하고 있을 수 있다.
PCB에는 이런 파일 정보와 입출력 장치 정보도 저장된다.
운영체제는 이 정보를 바탕으로 프로세스가 사용 중인 자원을 관리한다.
문맥 교환
프로세스들은 CPU를 번갈아 사용한다.
그렇다면 한 프로세스에서 다른 프로세스로 실행 순서가 넘어갈 때 어떤 일이 일어날까?
기존에 실행 중이던 프로세스는 지금까지의 실행 정보를 백업해야 한다.
그리고 다음에 실행할 프로세스의 정보를 복구해야 한다.
이 과정을 문맥 교환(context switching)이라고 한다.
여기서 문맥이란 프로세스의 실행을 재게하기 위해 필요한 중간 정보이다.
예를 들어 프로그램 카운터, 각종 레지스터 값, 메모리 정보, 열었던 파일 정보, 사용 중인 입출력 장치 정보들이 문맥에 해당한다.
프로세스가 CPU를 빼앗기더라도 문맥을 잘 저장해두면, 나중에 다시 CPU를 할당받았을 때 이전에 멈춘 지점부터 실행을 이어갈 수 있다.
1. 현재 실행 중인 프로세스의 문맥을 PCB에 저장한다.
2. 다음 실행할 프로세스의 문맥을 PCB에서 불러온다.
3. CPU가 새로운 프로세스를 실행한다.
이 과정을 통해 CPU는 여러 프로세스를 빠르게 번갈아 실행할 수 있다.
사용자 입장에서는 여러 프로그램이 동시에 실행되는 것처럼 보이지만, 실제로는 CPU가 매우 빠르게 프로세스를 바꿔가며 실행하는 것이다.
문맥 교환의 비용
문맥 교환은 꼭 필요한 과정이지만, 비용이 발생한다.
프로세스의 문맥을 저장하고 복구하는 동안에는 실제 프로그램 명령어를 실행하는 것이 아니다.
즉, 문맥 교환에 걸리는 시간은 순수한 작업 처리 시간이 아니라 관리 비용이다.
이런 비용을 오버헤드(overhead)라고 한다.
따라서 문맥 교환이 너무 자주 발생하면 CPU가 실제 작업보다 프로세스를 바꾸는 데 시간을 많이 쓰게 된다.
그래서 운영체제는 프로세스들이 공평하게 CPU를 사용할 수 있도록 하면서도, 문맥 교환이 지나치게 자주 발생하지 않도록 스케줄링해야 한다.


프로세스의 메모리 영역
프로세스가 메모리에 적재되면 보통 다음과 같은 영역으로 나뉜다.
코드 영역
데이터 영역
힙 영역
스택 영역
각 영역은 저장하는 내용과 특징이 다르다.
코드 영역
코드 영역(code segment)은 실행할 수 있는 코드가 저장되는 영역이다. 텍스트 영역이라고도 부른다.
프로그램을 이루는 기계어 명령어들이 이 영역에 저장된다.
CPU는 이 코드 영역에 있는 명령어를 하나씩 읽어 실행한다.
코드 영역에는 데이터가 아니라 CPU가 실행할 명령어가 들어 있다.
따라서 보통 쓰기가 금지되어 있다.
쓰기 금지를 하는 이유는 실행 중인 코드가 임의로 바뀌는 것을 막기 위해서이다.
데이터 영역
데이터 영역(data segment)은 프로그램이 실행되는 동안 유지되어야 하는 데이터가 저장되는 영역이다.
대표적으로 전역 변수가 이 영역에 저장된다.
전역 변수는 함수가 끝나도 사라지지 않고, 프로그램이 실행되는 동안 계속 유지된다.
코드 영역과 데이터 영역은 프로그램 실행 중 크기가 크게 변하지 않는다.
그래서 두 영역을 정적 할당 영역이라고 부른다.
힙 영역
힙 영역(heap segment)은 프로그래머가 직접 할당할 수 있는 메모리 영역이다.
프로그램 실행 중 필요한 만큼 메모리를 동적으로 할당할 때 사용된다.
예를 들어 C언어에서는 malloc() 같은 함수를 사용해 힙 영역에 메모리를 할당할 수 있다.
힙 영역은 필요한 시점에 할당되고, 더 이상 필요하지 않으면 반환되어야 한다.
만약 사용이 끝난 메모리를 반환하지 않으면 메모리 누수가 발생할 수 있다.
Python이나 Java 같은 언어에서는 가비지 컬렉션이 사용되지 않는 객체를 자동으로 정리해준다.
하지만 C나 C++처럼 개발자가 직접 메모리를 관리해야 하는 언어에서는 메모리 해제를 신경 써야 한다.
스택 영역
스택 영역(stack segment)은 일시적으로 사용되는 데이터가 저장되는 영역이다.
대표적으로 함수의 매개변수, 지역 변수, 함수 호출 정보 등이 스택 영역에 저장된다.
예를 들어 어떤 함수 안에서 선언한 지역 변수는 그 함수가 실행되는 동안만 필요하다.
함수 실행이 끝나면 해당 지역 변수도 더 이상 필요하지 않다.
이처럼 잠깐 사용하고 사라지는 값들이 스택 영역에 저장된다.
힙 영역과 스택 영역의 차이
힙 영역과 스택 영역은 둘 다 실행 중 크기가 변할 수 있다.
그래서 동적 할당 영역이라고 한다.
하지만 사용하는 방식은 다르다.
힙 영역은 프로그래머가 직접 할당하고 해제하는 메모리 공간이다.
반면 스택 영역은 함수 호출과 종료에 따라 자동으로 관리되는 공간이다.
일반적으로 힙 영역은 낮은 주소에서 높은 주소 방향으로 커진다.
반대로 스택 영역은 높은 주소에서 낮은 주소 방향으로 커진다.
낮은 주소
[ 코드 영역 ]
[ 데이터 영역 ]
[ 힙 영역 ] ↓ 높은 주소 방향으로 증가
빈 공간
[ 스택 영역 ] ↑ 낮은 주소 방향으로 증가
높은 주소
힙과 스택이 서로 반대 방향으로 자라는 이유는 제한된 메모리 공간을 효율적으로 사용하기 위해서이다.
'STUDY' 카테고리의 다른 글
| [운영체제] 스레드란? 멀티 프로세스와 멀티 스레드 비교 (0) | 2026.05.27 |
|---|---|
| [운영체제] 프로세스 상태와 프로세스 계층 구조 정리 (0) | 2026.05.27 |
| [운영체제] 프로세스 동기화: 실행 순서 제어와 상호 배제 (0) | 2026.05.27 |
| [운영체제] CPU 스케줄링 알고리즘과 계산법 정리 (0) | 2026.05.27 |
| [운영체제] 스케줄링 큐와 프로세스 상태 변화 정리 (0) | 2026.05.27 |