🧠 프로세스 개요
운영체제를 공부하다 보면 꼭 나오는 프로세스와 스레드 개념
헷갈리기 쉬운 용어들을 그림과 함께 정리해봤습니다.
본 내용은 <혼자 공부하는 컴퓨터 구조 + 운영체제>를 바탕으로 만들어졌습니다.
📌 1. 프로세스란?
“실행 중인 프로그램” = 프로세스(Process)
- 프로그램은 하드디스크에 저장되어 있을 땐 단지 데이터일 뿐!
- 메모리에 올라가서 실행되는 순간 프로세스가 됩니다.

- 메모리 적재(Loading into Memory) : 사용자가 프로그램을 실행하면, 운영체제(OS)는 이 프로그램의 코드와 필요한 데이터를 주기억 장치(RAM)의 특정 영역으로 불러옴.
- 프로세스(Process) : 메모리에 적재되어 운영체제의 관리 하에 실행 중인 프로그램의 인스턴스.
프로세스 자신만의 메모리 공간, 시스템 자원(CPU 시간, 파일 등)을 할당받아 능동적으로 작업을 수행
* RAM이란?
- Random Access Memory(임의 접근 장치), 컴퓨터의 주기억 장치 중 하나
- 현재 CPU가 처리해야 할 데이터나 실행 중인 프로그램 코드를 일시적으로 저장하는 공간
💻 2. 포그라운드 vs 백그라운드
포그라운드 프로세스 | 사용자가 직접 보는 프로그램 (예: 브라우저, 게임) |
백그라운드 프로세스 | 보이지 않는 곳에서 동작 (예: 윈도우 서비스, 데몬) |
* UNIX 운영체제에서는 백그라운드 프로세스를 데몬(daemon)이라 하고, 윈도우 운영체제에서는 서비스(service)라고 함.
🧬 3. PCB (프로세스 제어 블록)
개요: 모든 프로세스는 실행을 위해 cpu를 필요로 하지만, cpu 자원은 한정적.
어떻게 해결할까?
=> 자신의 차례가 되면 cpu를 이용하고, 시간을 끝났음을 알리는 인터럽트가 발생하면 자신의 차례를 양보하고 기다린다.
* 타이머 인터럽트란?
: 클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트
PCB 개념의 등장
운영체제는 빠르게 번갈아 수행하는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분.
이를 위해 운영체제는 프로세스 제어 블록(PCB:Process Control Block)을 이용한다.
=> 제어 블록은 프로세스와 관련된 정보를 저장하는 구조
PCB는 메모리의 커널 영역에 생성.
PCB는 프로세스를 식별하고 관리하기 위한 정보 묶음이에요.
📋 PCB에 담기는 주요 정보:
- 프로세스 ID (PID) : 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
- 레지스터 값 (이전 실행 상태 저장) : 프로세스는 자신의 실행차례가 오면 사용했던 레지스터의 중간값들을 모두 복원,PCB 안에는 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값들이 담긴다.
- 프로세스 상태 (실행/대기/입출력 등) : 현재 어떤 상태인지 기록 (ex. 현재 프로세스가 입출력장치를 사용하기 위해 기다리고 있는 상태인지, CPU를 사용하기 위해 기다리고 있는 상태인지, 아니면 CPU를 이용하고 있는 상태인지 등이 저장)
- CPU 스케줄링 정보 : 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보를 기록
- 메모리 관리 정보 (주소, 페이지 테이블 등)
- 프로세스마다 메모리에 저장된 위치가 다르다.
- PCB에는 프로세스가 어느 주소에 저장되어 있는지에 대한 정보도 알아야 한다
- PCB에는 베이스 레지스터, 한계 레지스터 값과 같은 정보들이 담긴다- 프로세스의 주소를 알기 위한 또 다른 주요 정보 중 하나인 페이지 테이블 정보도 담긴다 - 열린 파일, 장치 목록(어떤 입출력 장치가 이 프로세스에 할당되었는지, 어떤 파일들을 열었는지)

🔁 4. 문맥 교환 (Context Switching)
프로세스 A가 운영체제로부터 CPU를 할당받아 실행되다가 시간이 다 되어 프로세스 B에 CPU 사용을 양보한다고 가정해보자.
=> 이런 상황에서 바로 직전까지 실행되던 프로세스 A는 프로그램 카운터를 비롯한 각종 레지스터 값, 메모리 정보, 실행을 위해 열었던 파일이나 사용한 입출력 장치 등 중간 정보를 백업해야 한다.(다음 차례가 왔을 때 다시 실행을 재개)
프로세스 A → 프로세스 B 로 바뀔 때 필요한 작업
- A의 실행 정보 저장 → B의 정보 불러오기
- 문맥(context) : 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보들(중간 정보)
- 문맥 교환(context switching) : 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것(동시에 실행하는 것처럼 보임)
- 이 작업이 자주 일어나면 오버헤드 발생

🧩 5. 프로세스의 메모리 구조
프로세스가 생성되면 커널 영역에 PCB가 생성된다.
하나의 프로세스는 사용자 영역에 큭 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다.

코드(Code) | 실행 명령어 (읽기 전용) |
데이터(Data) | 전역 변수 등 프로그램 실행 중 유지 |
힙(Heap) | 동적 할당 (malloc/new 등) |
스택(Stack) | 함수 호출 시 지역 변수/매개변수 등 |
- 코드 영역(code segment) = 텍스트 영역(text segment) = 기계어로 이루어진 명령어가 저장(읽기 전용(read-only)공간)
- 데이터 영역(data segment)
1. 잠깐 썼다가 없앨 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
2. 이런 데이터로는 전역 변수(global variable)이 대표적
3. 전역 변수는 프로그램이 실행되는 동안 유지되며, 프로그램 전체에서 접근할 수 있는 변수로 기억 - 힙 영역(heap segment)
1. 프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 저장 공간
2. 프로그래밍 과정에서 힙 영역에 메모리 공간을 할당했으면 언젠가는 반환해야 한다.
3. 메모리 공간을 반환한다는 의미는 '더 이상 메모리를 사용하지 않겠다'라고 운영체제에게 전달
※ 메모리 누수(memory leak) : 메모리 공간을 반환하지 않는다면 할당한 공간은 메모리 내에 계속 남아 메모리 낭비를 초래 - 스택 영역(stack segment)
1. 데이터를 일시적으로 저장하는 공간
2. ex. 매개 변수, 지역 변수
3. 일시적으로 저장할 데이터는 스택 영역에 PUSH되고, 더이상 필요하지 않은 데이터는 POP
코드 영역과 데이터 영역은 그 크기가 변하지 않는다. 프로그램을 구성하는 명령어들이 갑자기 바뀔 일이 없고 (코드 영역의 크기 변화 x), 데이터 영역에 저장될 내용은 프로그램이 실행하는 동안에만 유지될 데이터다
💡 코드/데이터: 정적 할당(크기가 고정)
💡 힙/스택: 동적 할당(크기가 변할 수 있는 영역)
❗ 힙과 스택의 방향
- 힙: 낮은 주소 → 높은 주소로 할당
- 스택: 높은 주소 → 낮은 주소로 할당
이 구조를 알면 스택 오버플로우나 메모리 누수 원리를 쉽게 이해할 수 있다!
📝 마무리 요약
- 프로세스는 실행 중인 프로그램이다
- PCB는 프로세스를 식별하고 관리하는 핵심 정보
- 문맥 교환은 CPU를 다른 프로세스로 넘길 때 발생
- 메모리 구조를 이해하면 오류 디버깅에도 도움됨