devlog.
면접 준비#CS#OS

운영체제 면접 질문 완벽 정리

·8분 읽기

프로세스와 스레드의 차이#

**프로세스(Process)**는 실행 중인 프로그램의 인스턴스입니다. 각 프로세스는 독립적인 메모리 공간(코드, 데이터, 힙, 스택)을 가지며, OS로부터 자원을 할당받습니다.

**스레드(Thread)**는 프로세스 내에서 실행되는 작업의 단위입니다. 같은 프로세스 내의 스레드들은 코드, 데이터, 힙 영역을 공유하지만 스택은 각자 독립적으로 가집니다.

핵심 차이점 정리#

구분프로세스스레드
메모리독립 메모리 공간메모리 공유
통신IPC 필요공유 메모리 직접 접근
컨텍스트 스위칭무겁다가볍다
안정성한 프로세스 오류가 다른 프로세스에 영향 없음한 스레드 오류가 전체 프로세스에 영향

데드락(Deadlock)이란?#

데드락은 두 개 이상의 프로세스가 서로가 가진 자원을 기다리며 무한정 대기하는 상태입니다.

데드락 발생 조건 (4가지 모두 충족 시 발생)#

  1. 상호 배제(Mutual Exclusion): 자원은 한 번에 하나의 프로세스만 사용 가능
  2. 점유 대기(Hold and Wait): 자원을 점유한 채로 다른 자원을 기다림
  3. 비선점(No Preemption): 다른 프로세스의 자원을 강제로 빼앗을 수 없음
  4. 순환 대기(Circular Wait): 프로세스들이 순환 형태로 자원을 기다림

데드락 해결 방법#

# 데드락 예방 - 자원 순서 정하기
import threading

lock_a = threading.Lock()
lock_b = threading.Lock()

def process_1():
    # 항상 lock_a 먼저, lock_b 나중에 획득
    with lock_a:
        with lock_b:
            print("Process 1 실행 중")

def process_2():
    # 동일한 순서 유지
    with lock_a:
        with lock_b:
            print("Process 2 실행 중")

메모리 관리#

페이징(Paging)#

페이징은 물리 메모리를 고정 크기의 **프레임(Frame)**으로, 논리 메모리를 같은 크기의 **페이지(Page)**로 분할하는 메모리 관리 기법입니다.

장점:

  • 외부 단편화 없음
  • 연속적이지 않은 물리 메모리 사용 가능

단점:

  • 내부 단편화 발생 가능
  • 페이지 테이블 메모리 오버헤드

세그멘테이션(Segmentation)#

프로그램을 논리적 단위(코드, 데이터, 스택 등)로 분할하는 방식입니다.

// 가상 주소 변환 예시
struct SegmentDescriptor {
    uint32_t base;   // 세그먼트 시작 주소
    uint32_t limit;  // 세그먼트 크기
    uint8_t  flags;  // 접근 권한
};

uint32_t translate(uint16_t segment, uint32_t offset,
                   struct SegmentDescriptor *table) {
    struct SegmentDescriptor desc = table[segment];
    if (offset > desc.limit) {
        // 세그먼트 폴트 발생
        return -1;
    }
    return desc.base + offset;
}

컨텍스트 스위칭(Context Switching)#

CPU가 현재 실행 중인 프로세스에서 다른 프로세스로 전환할 때 발생합니다. 현재 프로세스의 상태(레지스터, PC, 스택 포인터 등)를 PCB에 저장하고, 다음 프로세스의 상태를 복원합니다.

컨텍스트 스위칭은 순수한 오버헤드로, 최소화하는 것이 성능에 중요합니다. 스레드의 컨텍스트 스위칭은 프로세스보다 훨씬 빠릅니다.

관련 포스트