티스토리 뷰
2️⃣ 프로세스 관리 (Process Management)
✅ 프로세스란?
**프로세스(Process)**는 실행 중인 프로그램의 인스턴스입니다. 단순한 프로그램 코드가 실제 메모리에서 실행되면서 **자원(CPU, 메모리, 파일 등)**을 할당받은 존재예요.
구성 요소:
- 프로그램 코드 (텍스트 섹션)
- 프로세스 스택 (함수 호출, 지역변수)
- 데이터 섹션 (글로벌 변수)
- 힙 (동적 할당)
- 프로세스 상태 정보 (레지스터, 프로그램 카운터 등)
✅ 프로세스 상태 (Process States)
- New: 생성 중
- Ready: 실행 준비 상태
- Running: CPU에서 실행 중
- Waiting (Blocked): I/O 등 대기 중
- Terminated: 실행 종료
✅ 프로세스 제어 블록 (PCB)
운영체제가 각 프로세스를 관리하기 위해 사용하는 데이터 구조입니다.
포함 내용:
- 프로세스 ID (PID)
- 프로세스 상태
- 프로그램 카운터
- CPU 레지스터
- 메모리 관리 정보
- 계정 정보 (UID 등)
- I/O 상태 정보
👉 컨텍스트 스위칭 시 이 PCB 정보가 저장/복원됩니다.
✅ 프로세스 계층 및 관계
- 부모/자식 프로세스:
- fork() 시스템 콜로 부모 → 자식 생성
- 프로세스 트리: 계층적 구조
✅ 멀티프로세싱과 멀티스레딩
구분 멀티프로세싱 멀티스레딩
정의 | 여러 프로세스가 동시에 실행 | 하나의 프로세스 내에서 여러 쓰레드 실행 |
메모리 공간 | 각자 독립적 | 메모리(힙, 데이터)는 공유 |
예시 | 여러 브라우저 인스턴스 | 웹 페이지 렌더링 + 다운로드 동시 진행 |
✅ 프로세스 생성 & 종료 (UNIX 기준)
- 생성: fork(), exec()
- 종료: exit()
- 좀비 프로세스: 부모가 자식의 종료 상태를 수거하지 않으면 생김 (wait() 필요)
✅ 쓰레드 개념 (간략)
쓰레드는 프로세스 내의 경량 실행 단위로, 프로세스와 달리 같은 주소 공간을 공유합니다. 프로세스와 다르게 오버헤드가 작아 빠른 병렬 처리가 가능합니다.
- POSIX Thread (pthreads)
- C++11 이후: std::thread
🛠 C++ 간단 예시
#include <iostream>
#include <thread>
void task() {
std::cout << "Hello from thread!\n";
}
int main() {
std::thread t(task);
t.join(); // join 호출 안 하면 메인 종료 시 크래시
}
✅ 심화 개념
- 컨텍스트 스위칭 비용:
- 프로세스 간: 무겁다 (메모리 맵까지 바꿔야 함)
- 쓰레드 간: 상대적으로 가볍다
- 프로세스 간 통신 (IPC):
- 파이프, 소켓, 공유 메모리, 메시지 큐
"스핀락을 사용할 때, 컨텍스트 스위칭 비용은 원칙적으로 발생하지 않습니다."
하지만 조건이 있습니다.
✅ 왜 컨텍스트 스위칭 비용이 발생하지 않나?
- 일반적인 std::mutex나 OS 커널 수준의 뮤텍스는 락을 획득하지 못하면 **커널에 제어권을 넘기고 대기 상태(블록 상태)**로 전환되며 컨텍스트 스위치가 발생합니다.
- 반면 **스핀락(SpinLock)**은:
- 락을 잡을 때까지 계속 루프를 돌면서(active waiting) CPU를 점유합니다.
- 다른 쓰레드로 전환되지 않고 현재 쓰레드가 계속 CPU를 차지합니다.
따라서:
- 스핀락을 사용하는 동안에는 쓰레드가 블록되지 않으므로 컨텍스트 스위칭이 발생하지 않습니다.
- 이 때문에 락 대기 시간이 매우 짧은 상황에서는 스핀락이 mutex보다 빠를 수 있어요.
🚨 그런데 주의할 점
- 스핀락은 컨텍스트 스위칭은 안 하지만, CPU 자원을 낭비합니다. CPU 코어 하나가 그 락을 기다리며 계속 바쁘게 루프를 돌기 때문입니다.
- 운영체제의 스케줄러가 "이건 너무 오래 스핀만 돈다"라고 판단하면 강제로 다른 스레드로 전환시킬 수 있습니다. 이건 운영체제 스케줄링 정책에 따라 다릅니다만, 긴 스핀은 결국 컨텍스트 스위치를 유발할 가능성이 있습니다.
✅ 정리
질문 답변
스핀락 사용 시 컨텍스트 스위칭이 발생하는가? | 아니요, 기본적으로 발생하지 않습니다. |
언제든 컨텍스트 스위치가 발생할 수 있는가? | OS 스케줄러가 개입하거나 타임 슬라이스가 끝나면 발생할 수 있습니다. |
락 점유 시간이 길면 어떤 문제가 생기는가? | 스핀락이 비효율적이고, 결국 컨텍스트 스위칭이 발생할 수도 있습니다. |
따라서, 짧은 임계구역에서는 스핀락이 유리하지만, 긴 대기 시간이 예상되면 일반 mutex 같은 커널 락을 쓰는 게 안전합니다.
'다시 정리하는 CS 이론 > OS' 카테고리의 다른 글
[OS] CPU 스케쥴링 (CPU Scheduling) (0) | 2025.05.03 |
---|---|
[OS] 운영체제 개요 (0) | 2025.05.03 |
[OS] 운영체제 커리큘럼 (1) | 2025.05.03 |
Comments
최근에 올라온 글