프로세스(process): 실행 중인 프로그램을 말하며, CPU 스케줄링의 대상

소스 코드 (.c)
↓ [전처리기]
전처리된 코드
↓ [컴파일러]
어셈블리 코드 (.s)
↓ [어셈블러]
목적 코드 (.o)
↓ [링커]
실행 파일 (.exe / .out)
1️⃣ 전처리 (Preprocessing)
2️⃣ 컴파일 (Compiling)
3️⃣ 어셈블 (Assembling)
4️⃣ 링킹 (Linking)
| 종류 | 설명 | 장점 | 단점 |
|---|---|---|---|
| 정적 라이브러리 (Static) | 빌드 시 코드에 포함됨 (.lib / .a) | 독립성 높음 | 실행 파일 커짐, 메모리 낭비 |
| 동적 라이브러리 (Dynamic) | 실행 중 필요한 부분만 참조 (.dll / .so) | 메모리 효율성 높음 | 외부 환경 의존도 높음 |
[생성] → [대기] → [실행] → [종료]
↓ ↑
[대기 중단] [중단/일시중단]
1️⃣ 생성 상태 (Created)
2️⃣ 대기 상태 (Ready)
3️⃣ 대기 중단 상태 (Ready Suspended)
4️⃣ 실행 상태 (Running)
5️⃣ 중단 상태 (Blocked)
6️⃣ 일시 중단 상태 (Blocked Suspended)
7️⃣ 종료 상태 (Terminated)

| 메모리 영역 | 특징 | 할당 시점 | 저장되는 데이터 예시 |
|---|---|---|---|
| Stack | 함수 호출 시 자동 생성/해제 | 런타임(동적) | 지역 변수, 매개변수, 함수 호출 정보 등 |
| Heap | 프로그래머가 직접 할당/해제 | 런타임(동적) | malloc(), new로 생성한 객체 등 |
| BSS Segment | 초기값 없는 전역/정적 변수 | 컴파일 시(정적) | static int x;, int a; |
| Data Segment | 초기값 있는 전역/정적 변수 | 컴파일 시(정적) | int a = 5;, static int b = 1; |
| Code Segment | 실행 코드 (기계어 명령어 등) | 컴파일 시(정적) | 함수, if문, 반복문 등의 실행 코드 |
PCB(Process Control Block): 운영체제가 프로세스를 관리하기 위해 생성하는 구조체
메타데이터
데이터에 관한 구조화된 데이터이자 데이터를 설명하는 작은 데이터
대량의 정보 가운데에서 찾고 있는 정보를 효율적으로 찾아내서 이용하기 위해 일정한 규칙에 따라 콘텐츠에 대해 부여되는 데이터
| 항목 | 설명 |
|---|---|
| 프로세스 상태 | Ready, Running, Blocked 등 현재 상태 |
| 프로세스 ID | 고유한 PID, 부모/자식 PID |
| 권한 정보 | 파일 접근 권한, 사용자 정보 |
| 프로그램 카운터 | 다음 실행 명령어 주소 |
| 레지스터 정보 | CPU 수행 중 저장된 값들 |
| 스케줄링 정보 | 우선순위, 스케줄링 알고리즘 관련 데이터 |
| 계정 정보 | 누적 CPU 사용 시간, 실행자 정보 |
| I/O 상태 | 열린 파일, 할당된 I/O 장치 목록 |
비용(Cost)
- 캐시 미스 발생 → 주소 공간이 달라 캐시 무효화
- 레지스터 저장/복원 비용
- 유휴 시간 (idle time) → 스위칭 중 CPU는 대기 상태
스레드 vs 프로세스
| 비교 항목 | 프로세스 컨텍스트 스위칭 | 스레드 컨텍스트 스위칭 |
|---|---|---|
| 메모리 공유 | X (독립된 주소 공간) | O (스택만 별도, 나머지 공유) |
| 전환 비용 | 높음 | 낮음 |
| 사용 목적 | 독립 실행 단위 | 경량 실행 단위 (병렬 처리 등) |
예: 크롬 브라우저
브라우저 프로세스: UI, 주소창 등
렌더러 프로세스: 웹 콘텐츠 처리
GPU 프로세스: 화면 렌더링
플러그인 프로세스: Flash 등
프로세스 간 데이터를 주고받기 위한 통신 방식
| 방식 | 특징 | 장점 | 제한점 |
|---|---|---|---|
| 공유 메모리 | 여러 프로세스가 하나의 메모리 블록 공유 | 빠름, 복사 없음 | 동기화 필수 (Race condition 위험) |
| 파일 | 파일 기반 데이터 공유 | 구조 단순 | 디스크 입출력 → 느림 |
| 소켓 | 네트워크 기반 통신 (TCP/UDP) | 원격 프로세스와도 통신 가능 | 네트워크 프로그래밍 지식 필요 |
| 익명 파이프 | 부모-자식 간 단방향 통신 | 간단 | 관계 있는 프로세스만 가능 |
| 명명된 파이프 | 이름 있는 파이프, 양방향도 가능 | 다중 클라이언트 지원 | 속도 느림, OS 의존성 |
| 메시지 큐 | 커널에서 큐 구조로 메시지 전송 | 비동기, 구조 명확 | 커널 리소스 사용 → 크기 제한 |

| 항목 | 프로세스 | 스레드 |
|---|---|---|
| 독립성 | 서로 독립 | 하나의 프로세스 내에서 동작 |
| 메모리 | 코드, 데이터, 힙, 스택 모두 독립 | 코드, 데이터, 힙 공유 / 스택만 분리 |
| 통신 방식 | IPC 필요 | 공유 메모리 통해 쉽게 통신 |
| 생성 비용 | 높음 | 낮음 |
| 하나가 죽으면? | 영향 없음 | 다른 스레드도 영향을 받음 |
동시성: 서로 독립적인 작업들을 작은 단위로 나누고 동시에 실행되는 것처럼 보여주는 것
상호 배제: 한 번에 하나만 접근 가능
한정 대기: 무한히 기다리는 스레드 없어야 함
진행: 임계 영역을 사용 중이 아니면 대기 중인 프로세스가 진입할 수 있어야 함
1️⃣ 뮤텍스 (Mutex)

2️⃣ 세마포어 (Semaphore)
| 종류 | 특징 |
|---|---|
| 바이너리 세마포어 | 0 또는 1만 가짐 (뮤텍스와 유사) |
| 카운팅 세마포어 | 여러 개의 자원에 대한 접근 제어 |

3️⃣ 모니터 (Monitor)
뮤텍스와 세마포어는 데드락(Deadlock) 발생 위험이 있음
→ 자원 순서 설정, 타임아웃 전략 등으로 방지 가능
두 개 이상의 프로세스가 서로의 자원을 기다리며 영원히 블로킹된 상태

| 조건 | 설명 |
|---|---|
| 상호 배제 (Mutual Exclusion) | 자원은 한 번에 하나의 프로세스만 사용 가능 |
| 점유 대기 (Hold and Wait) | 자원을 점유한 채로 다른 자원을 기다림 |
| 비선점 (No Preemption) | 자원을 강제로 회수할 수 없음 |
| 환형 대기 (Circular Wait) | 각 프로세스가 다음 자원을 기다리는 원형 대기 상태 |
1️⃣ 예방 (Prevention)
교착 상태 발생 조건 자체를 없앰
→ ex) 자원 점유 전에 모든 자원 요청하게 함 (→ 점유 대기 방지)
2️⃣ 회피 (Avoidance)
교착 상태 발생 가능성 있는 상황을 회피
대표 알고리즘: 은행원 알고리즘 (Banker’s Algorithm)
→ 안정 상태일 때만 자원 할당
→ 각 프로세스가 요구할 수 있는 최대 자원량을 기준으로 판단
3️⃣ 탐지 및 복구 (Detection & Recovery)
교착 상태가 이미 발생한 후 감지하여 해결
→ 사이클 감지: 자원 할당 그래프에서 사이클 여부 탐색
→ 복구 방법: 프로세스 강제 종료, 자원 회수 등
4️⃣ 무시 (Ignore)
현대 운영체제가 실제 사용하는 방식
교착 상태는 드물기 때문에, 그냥 두고 사용자에게 종료 권유
→ ex) “응답 없음”, “강제 종료하시겠습니까?”
참고: 북스터디 - 면접을 위한 CS 전공지식 노트 (Chapter 3-3)