면접을 위한 CS 전공지식 노트 - 프로세스와 스레드/스케줄링 알고리즘

프로세스(Process)의 이해
프로세스는 실행 중인 프로그램을 의미하며, CPU 스케줄링의 기본 단위가 됩니다. 프로그램이 메모리에 적재되어 인스턴스화될 때 프로세스가 되며, 운영체제의 CPU 스케줄러에 의해 관리 및 실행됩니다.
프로그램의 프로세스화 과정: 컴파일
C언어와 같은 컴파일 언어는 소스 코드를 컴퓨터가 이해할 수 있는 기계어로 번역하는 컴파일 과정을 거쳐 실행 가능한 파일을 만듭니다.
컴파일 과정은 다음과 같은 단계로 이루어집니다.
전처리(Preprocessing): 소스 코드의 주석 제거,
#include
와 같은 헤더 파일 병합, 매크로 치환.컴파일(Compilation): 전처리된 코드를 어셈블리어로 변환. 오류 처리 및 코드 최적화 수행.
어셈블(Assembly): 어셈블리어를 기계어(목적 코드, Object Code)로 변환. (확장자는 OS마다 다름)
링크(Linking): 목적 코드와 프로그램에서 사용하는 라이브러리 코드 등을 결합하여 최종 실행 파일 생성.
라이브러리 연결 방식
링킹 과정에서 라이브러리를 연결하는 방식에는 정적 방식과 동적 방식이 있습니다.
방식 | 설명 | 장점 | 단점 |
정적 라이브러리 | 빌드 시 실행 파일에 라이브러리 코드를 모두 포함시키는 방식 | 외부 의존성 낮음 | 메모리 비효율성, 코드 중복 |
동적 라이브러리 | 실행 시 필요한 함수 정보(DLL 등)만 참조하여 라이브러리 사용 | 메모리 효율성 높음 | 외부 의존성 높음 |
프로세스의 상태 변화
프로세스는 생성부터 소멸까지 다양한 상태를 거칩니다.
생성(Create):
fork()
나exec()
함수로 프로세스 생성, PCB 할당.fork()
: 부모 프로세스 주소 공간 복사하여 자식 프로세스 생성 (비동기 작업 등은 상속 안 함).exec()
: 새로운 프로세스 생성.
대기(Ready): CPU 할당을 기다리는 상태 (메모리 할당 완료).
대기 중단(Ready Suspended): 메모리 부족으로 대기 상태에서 일시 중단된 상태.
실행(Running): CPU와 메모리를 할당받아 명령어 수행 중인 상태 (CPU burst).
중단(Blocked): 특정 이벤트(예: I/O 작업 완료)를 기다리며 실행이 차단된 상태.
일시 중단(Blocked Suspended): 중단 상태에서 메모리 부족으로 다시 일시 중단된 상태.
종료(Terminated): 프로세스 실행 완료 또는 비자발적 종료(abort)로 모든 자원 반납.
프로세스의 메모리 구조
운영체제는 프로세스에 다음과 같은 구조로 메모리를 할당합니다. 스택은 높은 주소에서 낮은 주소로, 힙은 낮은 주소에서 높은 주소로 자랍니다.
스택(Stack): 함수 호출 시 지역 변수, 매개변수, 함수 정보 등이 저장되는 동적 할당 영역. 함수 호출 시 스택 프레임 생성, 복귀 시 소멸.
힙(Heap): 프로그래머가 직접 관리(malloc, free 등)하는 동적 할당 영역. 자료구조 등 저장.
데이터 영역(Data Segment): 전역 변수, 정적(static) 변수 등이 저장되는 정적 할당 영역.
BSS Segment: 0 또는 초기화되지 않은 전역/정적 변수 저장.
Data Segment: 0이 아닌 값으로 초기화된 전역/정적 변수 저장.
코드 영역(Code Segment/Text Segment): 실행할 프로그램 코드가 저장되는 정적 할당 영역.
프로세스 제어 블록 (PCB: Process Control Block)
PCB는 운영체제가 각 프로세스를 관리하기 위해 필요한 메타데이터를 저장하는 자료구조입니다. 프로세스 생성 시 함께 생성되며, 커널 영역에 위치하여 보호됩니다.
PCB에 저장되는 주요 정보는 다음과 같습니다.
프로세스 ID (PID) 및 부모/자식 프로세스 ID
프로세스 상태 (생성, 대기, 실행, 중단 등)
프로그램 카운터 (다음에 실행할 명령어 주소)
CPU 레지스터 값
CPU 스케줄링 정보 (우선순위, 스케줄링 큐 포인터 등)
메모리 관리 정보 (페이지 테이블, 세그먼트 테이블 등)
계정 정보 (CPU 사용 시간, 사용자 정보 등)
입출력 상태 정보 (할당된 I/O 장치 목록 등)
프로세스 권한
컨텍스트 스위칭 (Context Switching)
컨텍스트 스위칭은 하나의 프로세스에서 다른 프로세스로 CPU 제어권을 넘겨주는 과정입니다. 이때 현재 실행 중인 프로세스의 상태(문맥, Context)를 PCB에 저장하고, 다음 실행할 프로세스의 상태를 PCB에서 불러옵니다. 타임 슬라이스 만료나 인터럽트 발생 시 일어납니다.
과정: 실행 중단 -> 현 프로세스 PCB 저장 -> 다음 프로세스 PCB 로드 -> 실행 재개
비용: 컨텍스트 스위칭 자체에 소요되는 시간(유휴 시간)과 캐시 메모리를 비우고 다시 채우는 과정에서 발생하는 캐시 미스(Cache Miss) 비용 발생.
스레드: 스레드 간 컨텍스트 스위칭은 공유하는 메모리 영역이 많아 프로세스 간 전환보다 비용이 적게 듭니다.
멀티프로세싱과 프로세스 간 통신 (IPC)
멀티프로세싱은 여러 프로세스를 동시에 실행하여 병렬 처리를 가능하게 하는 방식입니다. 하나의 프로세스에 문제가 생겨도 다른 프로세스에 영향을 주지 않아 신뢰성이 높습니다. 웹 브라우저가 대표적인 멀티프로세스 구조 애플리케이션입니다 (브라우저 프로세스, 렌더러 프로세스, 플러그인 프로세스, GPU 프로세스 등).
프로세스 간 통신 (IPC: Inter-Process Communication)
독립된 메모리 공간을 가지는 프로세스들이 서로 데이터를 주고받거나 자원을 공유하는 메커니즘입니다. 메모리를 공유하는 스레드보다는 속도가 느립니다.
IPC의 주요 종류는 다음과 같습니다.
공유 메모리(Shared Memory): 특정 메모리 공간을 여러 프로세스가 공유. 데이터 복사 오버헤드가 없어 가장 빠르지만, 동기화 문제 발생 가능.
파일(File): 디스크 상의 파일을 매개로 데이터 주고받음.
소켓(Socket): 네트워크 인터페이스를 통해 동일/다른 컴퓨터의 프로세스 간 통신 (TCP/UDP).
익명 파이프(Unnamed Pipe): 단방향 통신(FIFO). 부모-자식 프로세스 간 통신에 주로 사용.
명명 파이프(Named Pipe): 이름 있는 파이프를 통해 관계없는 프로세스 간, 또는 네트워크 간 통신 가능. 단방향/양방향 지원.
메시지 큐(Message Queue): 커널이 관리하는 메시지 큐를 통해 비동기적 메시지 전달. 사용이 직관적이고 간편.
스레드(Thread)와 멀티스레딩
스레드
스레드는 프로세스 내에서 실행되는 가장 작은 작업 단위입니다. 하나의 프로세스는 여러 스레드를 가질 수 있습니다.
메모리 공유: 프로세스의 코드, 데이터, 힙 영역은 같은 프로세스 내의 다른 스레드들과 공유.
독립 영역: 스택 영역은 스레드마다 독립적으로 할당.
멀티스레딩
하나의 프로세스 내에서 여러 스레드를 사용하여 작업을 병렬로 처리하는 기법입니다. 자원을 공유하므로 효율성이 높고 응답성이 빠릅니다. 한 스레드가 블록되어도 다른 스레드는 계속 실행될 수 있어 동시성 확보에 유리합니다. 웹 서버, 웹 브라우저의 렌더러 프로세스(메인 스레드, 워커 스레드 등)가 대표적인 예입니다.
장점: 자원 공유 효율성, 빠른 응답성, 동시성 향상.
단점: 하나의 스레드 문제가 전체 프로세스에 영향 가능, 동기화 문제 발생 가능성.
공유 자원 동기화 및 교착 상태
공유 자원과 임계 영역
공유 자원(Shared Resource): 여러 프로세스/스레드가 공동으로 사용하는 자원 (메모리, 변수, 파일, 장치 등).
경쟁 상태(Race Condition): 둘 이상의 프로세스/스레드가 공유 자원을 동시에 접근하여 조작할 때, 접근 순서나 타이밍에 따라 결과가 달라질 수 있는 상태.
임계 영역(Critical Section): 공유 자원에 접근하여 조작하는 코드 영역. 경쟁 상태가 발생할 수 있는 부분.
임계 영역 문제 해결 방법 (동기화 기법)
임계 영역 접근을 제어하여 데이터의 일관성을 보장하는 기법입니다. 다음 세 가지 조건을 만족해야 합니다.
상호 배제(Mutual Exclusion): 한 번에 하나의 프로세스/스레드만 임계 영역 진입 허용.
한정 대기(Bounded Waiting): 특정 프로세스/스레드가 임계 영역에 영원히 들어가지 못하는 상황 방지.
융통성(Progress): 임계 영역이 비어있고 들어가려는 프로세스/스레드가 있다면, 진입을 허용해야 함.
주요 동기화 도구는 다음과 같습니다.
도구 | 기반 메커니즘 | 특징 | 종류 |
뮤텍스(Mutex) | 잠금(Lock) |
| - |
세마포어(Semaphore) | 신호(Signal) | 정수 값과 | 바이너리, 카운팅 |
모니터(Monitor) | 인터페이스 | 공유 자원을 숨기고 접근 인터페이스만 제공. 내부 큐로 순차 처리. 상호 배제 자동. | - |
교착 상태 (Deadlock)
두 개 이상의 프로세스/스레드가 서로 상대방이 점유한 자원을 기다리면서 무한 대기 상태에 빠지는 현상입니다.
발생 조건 (4가지 모두 충족 시):
상호 배제(Mutual Exclusion): 자원은 한 번에 한 프로세스만 사용 가능.
점유 대기(Hold and Wait): 자원을 보유한 프로세스가 다른 자원을 추가로 기다림.
비선점(No Preemption): 다른 프로세스의 자원을 강제로 빼앗을 수 없음.
환형 대기(Circular Wait): 프로세스들이 원형으로 서로의 자원을 기다림.
해결 방법:
예방(Prevention): 4가지 발생 조건 중 하나를 제거하도록 시스템 설계.
회피(Avoidance): 자원 할당 시 교착 상태 가능성을 검사하여 안전한 경우에만 할당 (예: 은행원 알고리즘).
탐지 및 회복(Detection & Recovery): 교착 상태 발생을 탐지하고, 관련된 프로세스를 종료하거나 자원을 선점하여 회복.
무시(Ignorance): 교착 상태는 드물게 발생하므로, 발생 시 시스템/사용자가 직접 처리하도록 둠 (현대 OS의 일반적 접근).
CPU 스케줄링 알고리즘
CPU 스케줄러는 어떤 프로세스/스레드에 CPU를 할당할지 결정하는 역할을 하며, 이때 사용되는 정책이 스케줄링 알고리즘입니다. 목표는 CPU 이용률 및 처리량 극대화, 대기 시간 및 응답 시간 최소화입니다.
비선점형(Non-preemptive) 방식
프로세스가 CPU를 할당받으면 작업 완료 또는 스스로 반납할 때까지 계속 사용합니다. 컨텍스트 스위칭 오버헤드가 적습니다.
FCFS (First Come, First Served): 준비 큐에 도착한 순서대로 처리. 긴 작업이 뒤따르는 짧은 작업들을 오래 기다리게 하는 '호위 효과(Convoy Effect)' 발생 가능.
SJF (Shortest Job First): 실행 시간이 가장 짧은 작업을 먼저 처리. 평균 대기 시간 최소화. 실행 시간이 긴 작업이 계속 대기하는 '기아 현상(Starvation)' 발생 가능. 실제 실행 시간 예측 어려움.
우선순위(Priority): 정적/동적 우선순위를 부여하여 높은 순위부터 처리. SJF의 기아 현상을 완화하기 위해 오래 기다린 프로세스의 우선순위를 높이는 '에이징(Aging)' 기법 사용 가능.
선점형(Preemptive) 방식
실행 중인 프로세스를 강제로 중단시키고 다른 프로세스에 CPU를 할당할 수 있습니다. 현대 OS에서 주로 사용합니다.
라운드 로빈 (Round Robin, RR): 각 프로세스에 동일한 시간 할당량(Time Quantum/Slice) 부여. 시간 내 미완료 시 준비 큐 맨 뒤로 이동. 평균 응답 시간 단축, 시분할 시스템에 적합. 할당 시간이 너무 길면 FCFS, 너무 짧으면 잦은 컨텍스트 스위칭으로 오버헤드 증가. 로드밸런서에서도 사용됨.
SRF (Shortest Remaining Time First): SJF의 선점형 버전. 현재 실행 중인 프로세스의 남은 시간보다 더 짧은 실행 시간의 프로세스가 도착하면 CPU를 선점하여 해당 프로세스 실행.
다단계 큐 (Multilevel Queue): 우선순위별로 여러 개의 준비 큐 사용. 각 큐는 독립적인 스케줄링 알고리즘(RR, FCFS 등) 적용. 큐 간 이동 불가. 스케줄링 부담 적으나 유연성 부족.
핵심 포인트
프로세스는 실행 중인 프로그램, 스레드는 프로세스 내 실행 단위입니다. 프로세스는 독립된 메모리, 스레드는 스택 제외 메모리 공유.
PCB는 프로세스 관리 정보 저장소이며, 컨텍스트 스위칭 시 PCB를 통해 상태 저장/복원합니다.
멀티프로세싱은 신뢰성, 멀티스레딩은 자원 효율성과 응답성에 장점이 있습니다. IPC는 프로세스 간 통신 방법입니다.
공유 자원 접근 시 경쟁 상태 방지를 위해 뮤텍스, 세마포어, 모니터 등 동기화 기법 사용.
교착 상태는 4가지 조건(상호배제, 점유대기, 비선점, 환형대기) 충족 시 발생하며, 예방, 회피, 탐지/회복, 무시 등으로 처리합니다.
CPU 스케줄링은 비선점형(FCFS, SJF)과 선점형(RR, SRF, 다단계 큐) 방식으로 나뉘며, 시스템 목표에 따라 알고리즘 선택.
출처
면접을 위한 CS 전공지식 노트