운영체제

1. 시스템 콜이 무엇인지 설명해 주세요.

기본 답변

시스템 콜은 사용자 프로그램이 운영체제 커널의 기능을 사용하기 위해 호출하는 인터페이스입니다.

파일 입출력, 프로세스 생성, 메모리 할당, 네트워크 통신처럼 하드웨어나 보호된 자원에 접근해야 하는 작업은 커널을 통해 수행됩니다.

사용자 모드에서 직접 하드웨어를 제어하면 안전성과 보안 문제가 생기므로, 시스템 콜을 통해 커널 모드로 전환한 뒤 필요한 작업을 수행하고 다시 사용자 모드로 돌아옵니다.

핵심 키워드

  • user mode
  • kernel mode
  • trap
  • system call number
  • protection
  • kernel API

꼬리질문

질문 우리가 사용하는 시스템 콜의 예시를 들어주세요.

답변 포인트 read, write, open, close, fork, exec, wait, mmap, socket 등이 있습니다.

질문 시스템 콜이, 운영체제에서 어떤 과정으로 실행되는지 설명해 주세요.

답변 포인트 사용자 프로그램이 시스템 콜 번호와 인자를 준비하고 trap 명령으로 커널 모드에 진입합니다.

커널은 번호에 맞는 핸들러를 실행하고 결과를 반환한 뒤 사용자 모드로 복귀합니다.

질문 시스템 콜의 유형에 대해 설명해 주세요.

답변 포인트 프로세스 제어, 파일 관리, 장치 관리, 정보 유지, 통신, 보호 관련 시스템 콜로 나눌 수 있습니다.

질문 운영체제의 Dual Mode 에 대해 설명해 주세요.

답변 포인트 CPU가 사용자 모드와 커널 모드를 구분해 실행 권한을 제한하는 구조입니다.

커널 모드에서만 특권 명령을 실행할 수 있습니다.

질문 왜 유저모드와 커널모드를 구분해야 하나요?

답변 포인트 잘못된 프로그램이 전체 시스템을 망가뜨리거나 다른 프로세스의 메모리와 장치에 접근하는 것을 막기 위해서입니다.

질문 서로 다른 시스템 콜을 어떻게 구분할 수 있을까요?

답변 포인트 시스템 콜 번호와 인자 레지스터를 통해 구분합니다.

커널은 번호를 보고 시스템 콜 테이블에서 핸들러를 찾습니다.

주의할 점

  • 라이브러리 함수와 시스템 콜을 구분해야 합니다. 예를 들어 printf는 라이브러리 함수이고 내부적으로 write 시스템 콜을 사용할 수 있습니다.

2. 인터럽트가 무엇인지 설명해 주세요.

기본 답변

인터럽트는 CPU가 현재 실행 중인 작업을 잠시 멈추고 더 우선적으로 처리해야 할 이벤트를 처리하도록 알리는 신호입니다.

키보드 입력, 디스크 I/O 완료, 타이머, 예외 상황 등이 인터럽트를 발생시킬 수 있습니다.

인터럽트가 발생하면 CPU는 현재 상태를 저장하고 인터럽트 벡터를 통해 적절한 인터럽트 핸들러로 이동해 처리한 뒤 원래 작업으로 돌아옵니다.

핵심 키워드

  • interrupt
  • interrupt handler
  • interrupt vector
  • context save
  • hardware interrupt
  • software interrupt

꼬리질문

질문 인터럽트는 어떻게 처리하나요?

답변 포인트 현재 실행 상태를 저장하고, 인터럽트 벡터에서 핸들러 주소를 찾아 실행한 뒤, 저장한 상태를 복원해 원래 흐름으로 돌아갑니다.

질문 Polling 방식에 대해 설명해 주세요.

답변 포인트 CPU가 장치 상태를 주기적으로 확인하는 방식입니다.

구현은 단순하지만 계속 확인해야 하므로 CPU 자원을 낭비할 수 있습니다.

질문 HW / SW 인터럽트에 대해 설명해 주세요.

답변 포인트 HW 인터럽트는 외부 장치가 발생시키고, SW 인터럽트는 프로그램 명령이나 예외, 시스템 콜 등을 통해 발생합니다.

질문 동시에 두 개 이상의 인터럽트가 발생하면, 어떻게 처리해야 하나요?

답변 포인트 인터럽트 우선순위와 마스킹을 이용해 중요한 인터럽트를 먼저 처리하고, 나머지는 대기시킵니다.

중첩 인터럽트를 허용할 수도 있습니다.

주의할 점

  • 인터럽트 처리는 짧게 끝내고, 오래 걸리는 작업은 지연 처리하는 구조가 일반적입니다.

3. 프로세스가 무엇인가요?

기본 답변

프로세스는 실행 중인 프로그램의 인스턴스입니다.

프로그램은 디스크에 저장된 정적인 코드이고, 프로세스는 메모리에 적재되어 CPU 시간을 할당받으며 실행되는 동적인 존재입니다.

프로세스는 독립적인 주소 공간과 PCB를 가지며, 하나 이상의 스레드를 포함할 수 있습니다.

스레드는 같은 프로세스 안에서 코드, 데이터, 힙을 공유하면서 각자 스택과 레지스터 상태를 가집니다.

핵심 키워드

  • process
  • program
  • thread
  • PCB
  • address space
  • fork/exec

꼬리질문

질문 프로그램과 프로세스, 스레드의 차이에 대해 설명해 주세요.

답변 포인트 프로그램은 실행 파일, 프로세스는 실행 중인 프로그램, 스레드는 프로세스 안의 실행 흐름입니다.

질문 PCB가 무엇인가요?

답변 포인트 Process Control Block으로, 프로세스 ID, 상태, 레지스터, PC, 스케줄링 정보, 메모리 정보, 열린 파일 정보 등을 저장하는 커널 자료구조입니다.

질문 그렇다면, 스레드는 PCB를 갖고 있을까요?

답변 포인트 프로세스 단위 PCB와 별도로 스레드는 TCB 또는 task 구조처럼 스레드 실행 상태를 관리하는 자료구조를 가집니다.

OS 구현에 따라 표현은 다릅니다.

질문 리눅스에서, 프로세스와 스레드는 각각 어떻게 생성될까요?

답변 포인트 프로세스는 fork 후 exec 흐름이 대표적이고, 스레드는 clone 계열 시스템 콜로 주소 공간 등 자원을 공유하는 task를 만듭니다.

질문 자식 프로세스가 상태를 알리지 않고 죽거나, 부모 프로세스가 먼저 죽게 되면 어떻게 처리하나요?

답변 포인트 자식이 종료됐지만 부모가 wait하지 않으면 zombie가 됩니다.

부모가 먼저 죽으면 orphan이 되고 init/systemd 같은 프로세스가 입양해 정리합니다.

질문 리눅스에서, 데몬프로세스에 대해 설명해 주세요.

답변 포인트 터미널과 분리되어 백그라운드에서 동작하는 서비스 프로세스입니다.

질문 리눅스는 프로세스가 일종의 트리를 형성하고 있습니다. 이 트리의 루트 노드에 위치하는 프로세스에 대해 설명해 주세요.

답변 포인트 전통적으로 PID 1인 init, 현대 리눅스에서는 systemd가 루트 역할을 하며 서비스 관리와 orphan 프로세스 입양을 수행합니다.

주의할 점

  • 프로세스와 스레드 차이는 “메모리 공유 여부”와 “실행 단위”를 같이 설명해야 합니다.

4. 프로세스 주소공간에 대해 설명해 주세요.

기본 답변

프로세스 주소공간은 프로세스가 사용할 수 있다고 보는 가상 메모리 영역입니다.

일반적으로 code, data, bss, heap, stack, mmap 영역 등으로 나뉩니다.

각 프로세스는 독립된 가상 주소 공간을 가지며, 실제 물리 메모리와의 매핑은 페이지 테이블과 MMU를 통해 이뤄집니다.

이를 통해 프로세스 간 격리와 효율적인 메모리 관리가 가능합니다.

핵심 키워드

  • virtual address space
  • code segment
  • data/bss
  • heap
  • stack
  • mmap

꼬리질문

질문 초기화 하지 않은 변수들은 어디에 저장될까요?

답변 포인트 전역 변수나 static 변수 중 초기화되지 않은 값은 bss 영역에 저장됩니다.

질문 일반적인 주소공간 그림처럼, Stack과 Heap의 크기는 매우 크다고 할 수 있을까요? 그렇지 않다면, 그 크기는 언제 결정될까요?

답변 포인트 가상 주소 공간상 넓게 보일 수 있지만 실제 물리 메모리는 필요할 때 할당됩니다.

스택 제한은 OS 설정이나 스레드 생성 시 정해지고, 힙은 런타임에 확장됩니다.

질문 Stack과 Heap 공간에 대해, 접근 속도가 더 빠른 공간은 어디일까요?

답변 포인트 일반적으로 스택은 할당/해제가 단순해 빠릅니다.

하지만 실제 접근 속도는 캐시 지역성, 접근 패턴, 할당 방식에 영향을 받습니다.

질문 다음과 같이 공간을 분할하는 이유가 있을까요?

답변 포인트 코드, 데이터, 동적 할당, 호출 스택의 권한과 생명주기가 다르기 때문에 관리와 보호를 쉽게 하기 위해 나눕니다.

질문 스레드의 주소공간은 어떻게 구성되어 있을까요?

답변 포인트 같은 프로세스의 스레드는 주소 공간 대부분을 공유하지만 각 스레드는 별도의 스택과 레지스터 상태를 가집니다.

질문 "스택"영역과 "힙"영역은 정말 자료구조의 스택/힙과 연관이 있는 걸까요?

답변 포인트 스택 영역은 함수 호출이 LIFO 방식으로 쌓인다는 점에서 자료구조 스택과 관련이 있습니다.

힙 영역은 우선순위 큐의 힙 자료구조와 직접 관련은 없고, 동적 메모리 영역을 뜻합니다.

질문 IPC의 Shared Memory 기법은 프로세스 주소공간의 어디에 들어가나요?

답변 포인트 보통 mmap/shared memory 영역으로 가상 주소 공간에 매핑됩니다.

여러 프로세스가 같은 물리 메모리를 각자의 주소 공간에 매핑해 공유합니다.

질문 스택과 힙영역의 크기는 언제 결정되나요? 사용자가 수정할 수 있나요?

답변 포인트 스택 크기는 OS나 런타임 설정으로 제한되며 사용자가 ulimit, JVM 옵션 등으로 조정할 수 있습니다.

힙도 런타임이나 allocator 정책에 따라 늘어나며 JVM은 -Xms, -Xmx로 조절합니다.

주의할 점

  • 주소공간 그림은 개념도입니다. 실제 배치는 OS, 아키텍처, ASLR, 런타임에 따라 달라질 수 있습니다.

5. 단기, 중기, 장기 스케줄러에 대해 설명해 주세요.

기본 답변

스케줄러는 어떤 프로세스나 스레드가 CPU와 메모리 같은 자원을 사용할지 결정합니다.

장기 스케줄러는 어떤 작업을 시스템에 들일지, 중기 스케줄러는 메모리에서 내보내거나 다시 들이는 swapping을, 단기 스케줄러는 ready 상태의 작업 중 CPU를 받을 대상을 결정합니다.

현대 범용 OS에서는 전통적인 장기/중기/단기 구분이 교과서만큼 명확하지 않을 수 있지만, CPU 스케줄링과 메모리 압박 시 swap/kill 같은 정책은 여전히 존재합니다.

핵심 키워드

  • long-term scheduler
  • medium-term scheduler
  • short-term scheduler
  • ready
  • running
  • blocked

꼬리질문

질문 현대 OS에는 단기, 중기, 장기 스케줄러를 모두 사용하고 있나요?

답변 포인트 전통적 배치 시스템처럼 명확한 장기 스케줄러는 약해졌지만, CPU 스케줄러와 메모리 압박 대응은 존재합니다.

질문 프로세스의 스케줄링 상태에 대해 설명해 주세요.

답변 포인트 new, ready, running, waiting/blocked, terminated가 기본 상태입니다.

swap을 고려하면 suspended 상태도 있습니다.

질문 preemptive/non-preemptive 에서 존재할 수 없는 상태가 있을까요?

답변 포인트 상태 자체보다 running에서 ready로 강제로 전환될 수 있는지가 다릅니다.

비선점형에서는 자발적 양보나 I/O 요청 전까지 CPU를 빼앗지 않습니다.

질문 Memory가 부족할 경우, Process는 어떠한 상태로 변화할까요?

답변 포인트 메모리에서 swap out되어 suspended 상태가 될 수 있고, 심한 경우 OOM killer에 의해 종료될 수 있습니다.

주의할 점

  • 프로세스 상태 모델은 OS마다 이름과 세부 구현이 다를 수 있습니다.

6. 컨텍스트 스위칭 시에는 어떤 일들이 일어나나요?

기본 답변

컨텍스트 스위칭은 CPU가 실행 중인 작업을 멈추고 다른 작업을 실행하기 위해 현재 실행 상태를 저장하고 다음 작업의 상태를 복원하는 과정입니다.

저장 대상에는 레지스터, 프로그램 카운터, 스택 포인터, 메모리 매핑 정보 등이 포함될 수 있습니다.

컨텍스트 스위칭은 필요한 기능이지만, 그 자체는 실제 작업을 하지 않는 오버헤드입니다.

캐시와 TLB가 무효화되거나 효율이 떨어질 수 있어 잦은 전환은 성능에 영향을 줍니다.

핵심 키워드

  • context switch
  • register
  • program counter
  • kernel stack
  • scheduler
  • TLB/cache

꼬리질문

질문 프로세스와 스레드는 컨텍스트 스위칭이 발생했을 때 어떤 차이가 있을까요?

답변 포인트 프로세스 전환은 주소 공간도 바뀌므로 비용이 더 큽니다.

같은 프로세스 내 스레드 전환은 주소 공간을 공유해 상대적으로 가볍지만 레지스터와 스택 전환은 필요합니다.

질문 컨텍스트 스위칭이 발생할 때, 기존의 프로세스 정보는 커널스택에 어떠한 형식으로 저장되나요?

답변 포인트 인터럽트나 시스템 콜 진입 시 레지스터 상태가 trap frame이나 task 구조에 저장되고, 커널은 스케줄링 후 다음 task의 저장된 상태를 복원합니다.

구체 구조는 OS와 아키텍처마다 다릅니다.

질문 컨텍스트 스위칭은 언제 일어날까요?

답변 포인트 타이머 인터럽트, I/O 대기, 시스템 콜로 인한 block, 우선순위 높은 작업 등장, yield 등이 있을 때 발생합니다.

주의할 점

  • 스레드 전환이 항상 싸다고만 말하면 부족합니다. 락 경합, 캐시 미스, 스케줄링 정책에 따라 비용이 커질 수 있습니다.

7. 프로세스 스케줄링 알고리즘에는 어떤 것들이 있나요?

기본 답변

프로세스 스케줄링 알고리즘은 ready queue에 있는 작업 중 어떤 작업에 CPU를 줄지 정하는 정책입니다.

FCFS, SJF, Priority, Round Robin, Multilevel Queue, Multilevel Feedback Queue 등이 대표적입니다.

평균 대기 시간, 응답 시간, 처리량, 공정성, starvation 방지 같은 기준에 따라 적합한 알고리즘이 달라집니다.

핵심 키워드

  • FCFS
  • SJF
  • Round Robin
  • priority scheduling
  • MLFQ
  • starvation

꼬리질문

질문 RR을 사용할 때, Time Slice에 따른 trade-off를 설명해 주세요.

답변 포인트 time slice가 작으면 응답성은 좋아지지만 컨텍스트 스위칭이 늘고, 크면 오버헤드는 줄지만 FCFS처럼 되어 응답성이 나빠질 수 있습니다.

질문 싱글 스레드 CPU 에서 상시로 돌아가야 하는 프로세스가 있다면, 어떤 스케줄링 알고리즘을 사용하는 것이 좋을까요?

답변 포인트 실시간성이 필요하면 priority나 real-time scheduling을 고려합니다.

일반 interactive 환경에서는 RR이나 MLFQ가 응답성과 공정성을 맞추기 좋습니다.

질문 동시성과 병렬성의 차이에 대해 설명해 주세요.

답변 포인트 동시성은 여러 작업이 번갈아 진행되어 동시에 다뤄지는 구조이고, 병렬성은 실제로 여러 코어에서 동시에 실행되는 것입니다.

질문 타 스케줄러와 비교하여, Multi-level Feedback Queue는 어떤 문제점들을 해결한다고 볼 수 있을까요?

답변 포인트 작업 특성을 미리 몰라도 CPU-bound와 I/O-bound를 동적으로 구분하고, 짧은 작업의 응답성을 높이며, aging으로 starvation을 완화할 수 있습니다.

질문 FIFO 스케줄러는 정말 쓸모가 없는 친구일까요?

답변 포인트 단순하고 오버헤드가 낮아 배치 작업이나 예측 가능한 순차 처리에는 유용할 수 있습니다.

다만 interactive 환경에서는 convoy effect가 문제입니다.

질문 우리는 스케줄링 알고리즘을 "프로세스" 스케줄링 알고리즘이라고 부릅니다. 스레드는 다른 방식으로 스케줄링을 하나요?

답변 포인트 현대 OS는 실제 CPU 스케줄링 단위를 커널 스레드 또는 task로 보는 경우가 많습니다.

프로세스 안의 스레드도 스케줄링 대상입니다.

질문 유저 스레드와 커널 스레드의 스케줄링 알고리즘은 똑같을까요?

답변 포인트 커널 스레드는 OS가 직접 스케줄링합니다.

유저 스레드는 런타임 라이브러리가 사용자 공간에서 스케줄링할 수 있어 매핑 모델에 따라 다릅니다.

주의할 점

  • “가장 좋은 스케줄링 알고리즘”은 없고, 시스템 목표에 따라 선택이 달라집니다.

8. 뮤텍스와 세마포어의 차이점은 무엇인가요?

기본 답변

뮤텍스는 임계 영역에 한 번에 하나의 스레드만 들어가게 하는 상호 배제 도구입니다.

보통 락을 획득한 스레드가 락을 해제해야 한다는 소유권 개념이 있습니다.

세마포어는 정수 카운터를 이용해 동시에 접근 가능한 자원의 개수를 제어하는 동기화 도구입니다.

카운트가 1인 이진 세마포어는 뮤텍스처럼 보일 수 있지만, 소유권과 사용 목적에서 차이가 있습니다.

핵심 키워드

  • mutex
  • semaphore
  • binary semaphore
  • counting semaphore
  • ownership
  • critical section

꼬리질문

질문 이진 세마포어와 뮤텍스의 차이에 대해 설명해 주세요.

답변 포인트 둘 다 0/1 상태로 상호 배제처럼 사용할 수 있지만, 뮤텍스는 소유권이 있어 획득한 스레드가 해제하는 것이 원칙이고, 세마포어는 신호 전달이나 자원 카운팅에도 사용됩니다.

질문 Lock을 얻기 위해 대기하는 프로세스들은 Spin Lock 기법을 사용할 수 있습니다. 이 방법의 장단점은 무엇인가요?

답변 포인트 spin lock은 커널 sleep/wakeup 비용 없이 짧은 대기에는 빠르지만, 오래 기다리면 CPU를 낭비합니다.

짧은 임계 영역, 멀티코어 환경에 적합하고, 긴 대기에는 blocking lock이 낫습니다.

질문 뮤텍스와 세마포어 모두 커널이 관리하기 때문에, Lock을 얻고 방출하는 과정에서 시스템 콜을 호출해야 합니다. 이 방법의 장단점이 있을까요?

답변 포인트 항상 시스템 콜이 필요한 것은 아닙니다.

현대 구현은 user-space fast path와 futex 같은 방식으로 경쟁이 없으면 사용자 공간에서 처리하고, 경쟁이 있을 때만 커널 도움을 받습니다.

주의할 점

  • mutex와 semaphore를 “둘 다 락”으로만 설명하면 부족합니다. 소유권과 카운팅 목적을 구분해야 합니다.

9. Deadlock 에 대해 설명해 주세요.

기본 답변

데드락은 여러 프로세스나 스레드가 서로가 가진 자원을 기다리며 영원히 진행하지 못하는 상태입니다.

대표적으로 두 스레드가 각각 A와 B 락을 잡고 서로 반대 락을 기다리는 상황이 있습니다.

데드락은 상호 배제, 점유 대기, 비선점, 순환 대기 네 가지 조건이 동시에 성립할 때 발생할 수 있습니다.

예방, 회피, 탐지 후 복구, 무시 등의 전략이 있습니다.

핵심 키워드

  • mutual exclusion
  • hold and wait
  • no preemption
  • circular wait
  • prevention
  • detection

꼬리질문

질문 Deadlock 이 동작하기 위한 4가지 조건에 대해 설명해 주세요.

답변 포인트 상호 배제, 점유 대기, 비선점, 순환 대기입니다.

질문 그렇다면 3가지만 충족하면 왜 Deadlock 이 발생하지 않을까요?

답변 포인트 네 조건 중 하나라도 깨지면 순환적으로 서로 자원을 기다리는 구조가 완성되지 않기 때문입니다.

질문 어떤 방식으로 예방할 수 있을까요?

답변 포인트 락 순서 고정으로 순환 대기를 제거하거나, 필요한 자원을 한 번에 요청해 점유 대기를 줄이거나, timeout과 tryLock을 사용할 수 있습니다.

질문 왜 현대 OS는 Deadlock을 처리하지 않을까요?

답변 포인트 일반 시스템에서는 데드락 발생 빈도보다 탐지/회피 비용이 클 수 있어 무시하거나 애플리케이션 책임으로 두는 경우가 많습니다.

DBMS처럼 중요한 시스템은 별도 탐지와 복구를 합니다.

질문 Wait Free와 Lock Free를 비교해 주세요.

답변 포인트 lock-free는 전체 시스템 중 적어도 누군가는 진행함을 보장하고, wait-free는 모든 스레드가 유한 단계 안에 진행함을 보장합니다.

wait-free가 더 강한 조건입니다.

주의할 점

  • livelock, starvation, deadlock은 서로 다른 개념입니다.

10. 프로그램이 컴파일 되어, 실행되는 과정을 간략하게 설명해 주세요.

기본 답변

컴파일 언어에서는 소스 코드가 전처리, 컴파일, 어셈블, 링크 과정을 거쳐 실행 파일이 됩니다.

실행 시 OS의 로더가 실행 파일을 메모리에 적재하고 필요한 동적 라이브러리를 연결한 뒤 진입점부터 실행합니다.

Java 같은 JVM 언어는 소스 코드가 바이트코드로 컴파일되고, JVM이 클래스를 로딩한 뒤 인터프리터와 JIT 컴파일러를 통해 실행합니다.

핵심 키워드

  • compile
  • link
  • loader
  • dynamic library
  • interpreter
  • JIT

꼬리질문

질문 링커와, 로더의 차이에 대해 설명해 주세요.

답변 포인트 링커는 여러 object 파일과 라이브러리를 연결해 실행 가능한 형태로 만들고, 로더는 실행 시 프로그램을 메모리에 적재하고 실행 준비를 합니다.

질문 컴파일 언어와 인터프리터 언어의 차이에 대해 설명해 주세요.

답변 포인트 컴파일 언어는 실행 전 기계어 또는 중간 코드로 변환하고, 인터프리터 언어는 실행 중 코드를 해석합니다.

현대 언어는 JIT 등으로 경계가 섞여 있습니다.

질문 JIT에 대해 설명해 주세요.

답변 포인트 Just-In-Time 컴파일은 실행 중 자주 사용되는 코드를 네이티브 코드로 컴파일해 성능을 높이는 방식입니다.

질문 본인이 사용하는 언어는, 어떤식으로 컴파일 및 실행되는지 설명해 주세요.

답변 포인트 Java는 .java를 javac가 .class 바이트코드로 컴파일하고, JVM이 클래스 로딩, 검증, 인터프리팅/JIT를 통해 실행합니다.

질문 CPython, Jython, PyPy등의 다양한 구현체는 어떤 차이가 있을까요?

답변 포인트 CPython은 C로 구현된 표준 구현체, Jython은 JVM 위에서 동작, PyPy는 JIT를 활용한 Python 구현체입니다.

질문 fork(), exec() 시스템 콜과 로더는 어떤 관계가 있나요?

답변 포인트 fork는 프로세스를 복제하고, exec는 현재 프로세스 이미지를 새 프로그램으로 교체합니다.

이때 커널 로더가 실행 파일을 주소 공간에 적재합니다.

주의할 점

  • “컴파일 언어 vs 인터프리터 언어”는 단순 이분법보다 구현 방식과 실행 모델을 같이 봐야 합니다.

11. IPC가 무엇이고, 어떤 종류가 있는지 설명해 주세요.

기본 답변

IPC는 Inter-Process Communication, 즉 프로세스 간 통신입니다.

프로세스는 기본적으로 독립된 주소 공간을 가지므로 데이터를 주고받기 위해 OS가 제공하는 통신 수단이 필요합니다.

대표적으로 pipe, named pipe, message queue, shared memory, socket, signal 등이 있습니다.

속도만 보면 shared memory가 빠르지만 동기화 문제가 있고, socket은 네트워크를 통한 통신까지 확장할 수 있습니다.

핵심 키워드

  • pipe
  • message queue
  • shared memory
  • socket
  • signal
  • synchronization

꼬리질문

질문 Shared Memory가 무엇이며, 사용할 때 유의해야 할 점에 대해 설명해 주세요.

답변 포인트 여러 프로세스가 같은 물리 메모리를 각자의 주소 공간에 매핑해 공유하는 방식입니다.

빠르지만 race condition을 막기 위해 semaphore, mutex 같은 동기화가 필요합니다.

질문 메시지 큐는 단방향이라고 할 수 있나요?

답변 포인트 큐 하나는 보통 한 방향 흐름으로 볼 수 있지만, 양방향 통신이 필요하면 큐를 두 개 두거나 요청/응답 큐를 분리해 설계할 수 있습니다.

주의할 점

  • IPC는 데이터 전달 방식뿐 아니라 동기화와 오류 처리까지 함께 고려해야 합니다.

12. Thread Safe 하다는 것은 어떤 의미인가요?

기본 답변

Thread safe하다는 것은 여러 스레드가 동시에 접근해도 객체나 함수의 상태가 깨지지 않고 의도한 결과를 보장한다는 뜻입니다.

공유 상태가 있는 경우 race condition, visibility 문제, atomicity 문제가 생길 수 있습니다.

Thread safe를 보장하는 방법에는 락, 불변 객체, atomic 연산, thread confinement, concurrent collection 사용 등이 있습니다.

핵심 키워드

  • race condition
  • atomicity
  • visibility
  • immutability
  • lock
  • CAS

꼬리질문

질문 Thread Safe 를 보장하기 위해 어떤 방법을 사용할 수 있나요?

답변 포인트 synchronized, Lock, volatile, Atomic 클래스, immutable object, ThreadLocal, concurrent collection 등을 사용할 수 있습니다.

질문 Peterson's Algorithm 이 무엇이며, 한계점에 대해 설명해 주세요.

답변 포인트 두 프로세스 간 상호 배제를 소프트웨어적으로 구현하는 고전 알고리즘입니다.

현대 멀티코어 메모리 모델과 컴파일러 최적화, N개 스레드 확장성 측면에서 한계가 있습니다.

질문 Race Condition 이 무엇인가요?

답변 포인트 실행 순서나 타이밍에 따라 결과가 달라지는 경쟁 상태입니다.

공유 데이터를 동기화 없이 읽고 쓸 때 발생합니다.

질문 Thread Safe를 구현하기 위해 반드시 락을 사용해야 할까요?

답변 포인트 아닙니다.

immutable, atomic/CAS, thread confinement, lock-free 자료구조 등으로도 구현할 수 있습니다.

주의할 점

  • volatile은 가시성은 보장하지만 복합 연산의 원자성을 보장하지 않습니다.

13. Thread Pool, Monitor, Fork-Join에 대해 설명해 주세요.

기본 답변

Thread Pool은 스레드를 매번 생성하지 않고 미리 만들어 재사용하는 구조입니다.

생성 비용을 줄이고 동시에 실행되는 작업 수를 제한해 시스템 안정성을 높입니다.

Monitor는 락과 조건 변수를 묶어 공유 자원 접근을 제어하는 동기화 개념입니다.

Fork-Join은 큰 작업을 작은 작업으로 나눠 병렬 처리한 뒤 결과를 합치는 모델로, Java의 ForkJoinPool이 대표적입니다.

핵심 키워드

  • thread pool
  • worker thread
  • queue
  • monitor
  • condition variable
  • fork-join

꼬리질문

질문 Thread Pool을 사용한다고 가정하면, 어떤 기준으로 스레드의 수를 결정할 것인가요?

답변 포인트 CPU-bound 작업은 코어 수 근처, I/O-bound 작업은 대기 시간이 많으므로 코어 수보다 더 크게 설정할 수 있습니다.

작업 특성, 대기 시간, 처리량, 메모리, 외부 시스템 한계를 함께 봐야 합니다.

질문 어떤 데이터를 정렬 하려고 합니다. 어떤 방식의 전략을 사용하는 것이 가장 안전하면서도 좋은 성능을 낼 수 있을까요?

답변 포인트 데이터 크기와 메모리, 안정성 요구에 따라 병렬 정렬, merge sort, external sort를 고려합니다.

공유 상태를 줄이고 chunk 단위로 정렬 후 병합하는 전략이 안전합니다.

주의할 점

  • Thread Pool 크기를 무작정 크게 하면 context switching과 메모리 사용량이 늘어 성능이 나빠질 수 있습니다.

14. 캐시 메모리 및 메모리 계층성에 대해 설명해 주세요.

기본 답변

메모리 계층성은 CPU 레지스터, L1/L2/L3 캐시, 메인 메모리, 디스크처럼 빠르고 작은 저장소부터 느리고 큰 저장소까지 계층적으로 구성하는 방식입니다.

CPU와 메모리의 속도 차이를 줄이기 위해 캐시가 사용됩니다.

캐시는 지역성 원리를 이용합니다.

최근 사용한 데이터가 다시 사용될 가능성이 높은 시간 지역성과, 근처 데이터가 사용될 가능성이 높은 공간 지역성을 활용합니다.

핵심 키워드

  • memory hierarchy
  • L1/L2/L3 cache
  • cache line
  • locality
  • cache miss
  • coherence

꼬리질문

질문 캐시 메모리는 어디에 위치해 있나요?

답변 포인트 CPU 내부 또는 CPU와 매우 가까운 곳에 위치합니다.

L1은 코어별로 가장 가깝고, L2/L3는 구조에 따라 코어별 또는 공유로 구성됩니다.

질문 L1, L2 캐시에 대해 설명해 주세요.

답변 포인트 L1은 가장 작고 빠르며 명령어/데이터 캐시로 나뉘는 경우가 많습니다.

L2는 L1보다 크고 느리며 L3보다 빠릅니다.

질문 캐시에 올라오는 데이터는 어떻게 관리되나요?

답변 포인트 메모리에서 cache line 단위로 가져오고, 교체 정책에 따라 오래되거나 덜 쓰인 라인이 밀려납니다.

질문 캐시간의 동기화는 어떻게 이루어지나요?

답변 포인트 멀티코어에서는 MESI 같은 cache coherence protocol로 코어별 캐시의 일관성을 유지합니다.

질문 캐시 메모리의 Mapping 방식에 대해 설명해 주세요.

답변 포인트 direct mapped, fully associative, set associative 방식이 있습니다.

질문 캐시의 지역성에 대해 설명해 주세요.

답변 포인트 시간 지역성은 최근 접근한 데이터를 다시 접근할 가능성, 공간 지역성은 접근한 주소 근처를 접근할 가능성입니다.

질문 이차원 배열을 가로/세로로 탐색했을 때의 성능 차이에 대해 설명해 주세요.

답변 포인트 row-major 저장 언어에서는 행 단위 탐색이 연속 메모리를 따라가므로 cache hit가 많고, 열 단위 탐색은 cache miss가 늘 수 있습니다.

질문 캐시의 공간 지역성은 어떻게 구현될 수 있을까요?

답변 포인트 캐시는 byte 하나가 아니라 cache line 단위로 데이터를 가져오므로 인접한 데이터 접근이 빠릅니다.

주의할 점

  • 캐시 성능은 알고리즘의 Big-O에는 드러나지 않지만 실제 성능에 큰 영향을 줍니다.

15. 메모리의 연속할당 방식 세 가지를 설명해주세요. (first-fit, best-fit, worst-fit)

기본 답변

연속할당은 프로세스나 메모리 요청에 연속된 빈 공간을 할당하는 방식입니다.

first-fit은 처음 만나는 충분한 공간에 할당하고, best-fit은 가장 딱 맞는 공간에 할당하며, worst-fit은 가장 큰 빈 공간에 할당합니다.

각 방식은 탐색 비용과 단편화 양상이 다릅니다.

first-fit은 빠르고 단순하지만 앞쪽에 작은 조각이 생길 수 있고, best-fit은 작은 남는 공간이 많이 생길 수 있으며, worst-fit은 큰 공간을 쪼개 중간 크기 요청에 대응하려는 목적이 있습니다.

핵심 키워드

  • contiguous allocation
  • first-fit
  • best-fit
  • worst-fit
  • external fragmentation
  • compaction

꼬리질문

질문 worst-fit 은 언제 사용할 수 있을까요?

답변 포인트 가장 큰 빈 공간을 나눠서 남은 공간도 어느 정도 쓸 수 있게 하려는 경우 고려할 수 있습니다.

다만 실제로 항상 좋은 성능을 보장하지는 않습니다.

질문 성능이 가장 좋은 알고리즘은 무엇일까요?

답변 포인트 상황에 따라 다릅니다.

first-fit은 속도가 빠르고 실용적인 경우가 많지만, 단편화와 요청 패턴에 따라 결과가 달라집니다.

주의할 점

  • best-fit이 이름 때문에 항상 최선이라고 생각하면 안 됩니다.

16. Thrashing 이란 무엇인가요?

기본 답변

Thrashing은 시스템이 실제 작업보다 페이지 교체에 대부분의 시간을 쓰는 상태입니다.

메모리에 비해 실행 중인 프로세스들의 working set이 너무 크면 page fault가 급증하고, CPU는 디스크 I/O 대기 때문에 제대로 일을 하지 못합니다.

결과적으로 CPU 사용률은 낮아지고 디스크 I/O는 높아지며 시스템 전체 성능이 급격히 떨어집니다.

핵심 키워드

  • page fault
  • working set
  • swapping
  • memory pressure
  • locality
  • multiprogramming degree

꼬리질문

질문 Thrashing 발생 시, 어떻게 완화할 수 있을까요?

답변 포인트 동시에 실행되는 프로세스 수를 줄이고, 메모리를 늘리거나, working set을 고려해 페이지 할당을 조정하고, 불필요한 프로세스를 종료하거나 swap 사용을 줄입니다.

주의할 점

  • CPU 사용률이 낮다고 무조건 작업을 더 넣으면 thrashing이 악화될 수 있습니다.

17. 가상 메모리란 무엇인가요?

기본 답변

가상 메모리는 프로세스가 실제 물리 메모리 크기와 위치를 직접 신경 쓰지 않고 독립된 주소 공간을 사용하는 것처럼 보이게 하는 메모리 관리 기법입니다.

가상 주소는 MMU와 페이지 테이블을 통해 물리 주소로 변환됩니다.

이를 통해 프로세스 격리, 보호, 물리 메모리보다 큰 주소 공간 제공, demand paging 같은 기능이 가능해집니다.

핵심 키워드

  • virtual memory
  • virtual address
  • physical address
  • page table
  • demand paging
  • page fault

꼬리질문

질문 가상 메모리가 가능한 이유가 무엇일까요?

답변 포인트 프로그램은 전체 메모리를 항상 동시에 사용하지 않고 지역성을 가지며, MMU가 가상 주소를 물리 주소로 변환해 주기 때문입니다.

질문 Page Fault가 발생했을 때, 어떻게 처리하는지 설명해 주세요.

답변 포인트 CPU가 현재 매핑으로 처리할 수 없는 페이지 접근을 감지하면 trap이 발생하고, OS가 원인과 접근 권한을 확인합니다.

페이지가 보조 저장장치에 있는 major fault라면 페이지를 읽어 page table을 갱신한 뒤 명령을 재시작합니다. demand-zero, copy-on-write, page cache 재매핑 같은 minor fault는 디스크 I/O 없이 처리될 수 있습니다.

유효하지 않거나 권한을 위반한 접근이면 복구하지 않고 프로세스에 오류를 전달하거나 종료할 수 있습니다.

질문 페이지 크기에 대한 Trade-Off를 설명해 주세요.

답변 포인트 페이지가 크면 page table 크기와 I/O 횟수는 줄 수 있지만 내부 단편화가 늘고 불필요한 데이터 로드가 증가할 수 있습니다.

페이지가 작으면 반대입니다.

질문 페이지 크기가 커지면, 페이지 폴트가 더 많이 발생한다고 할 수 있나요?

답변 포인트 단정할 수 없습니다.

공간 지역성이 좋으면 줄 수 있고, 불필요한 데이터가 많이 올라오면 오히려 비효율이 생길 수 있습니다.

질문 세그멘테이션 방식을 사용하고 있다면, 가상 메모리를 사용할 수 없을까요?

답변 포인트 사용할 수 있습니다.

세그멘테이션과 페이징은 함께 사용될 수도 있으며, 둘 다 가상 주소 변환과 보호에 관련된 기법입니다.

주의할 점

  • 가상 메모리는 단순히 “디스크를 메모리처럼 쓰는 것”만이 아닙니다. 주소 공간 추상화와 보호가 핵심입니다.

18. 세그멘테이션과 페이징의 차이점은 무엇인가요?

기본 답변

페이징은 메모리를 고정 크기 페이지와 프레임으로 나누어 관리하는 방식이고, 세그멘테이션은 코드, 데이터, 스택처럼 의미 있는 논리 단위로 나누어 관리하는 방식입니다.

페이징은 외부 단편화를 줄이지만 내부 단편화가 생길 수 있고, 세그멘테이션은 논리적 보호와 공유가 쉽지만 외부 단편화가 생길 수 있습니다.

핵심 키워드

  • paging
  • segmentation
  • page
  • frame
  • internal fragmentation
  • external fragmentation

꼬리질문

질문 페이지와 프레임의 차이에 대해 설명해 주세요.

답변 포인트 페이지는 가상 메모리의 고정 크기 블록이고, 프레임은 물리 메모리의 고정 크기 블록입니다.

질문 내부 단편화와, 외부 단편화에 대해 설명해 주세요.

답변 포인트 내부 단편화는 할당된 블록 내부의 남는 공간이고, 외부 단편화는 빈 공간 총합은 충분하지만 연속되지 않아 할당하지 못하는 상황입니다.

질문 페이지에서 실제 주소를 어떻게 가져올 수 있는지 설명해 주세요.

답변 포인트 가상 주소를 page number와 offset으로 나누고, page table에서 frame number를 찾은 뒤 frame base와 offset을 더합니다.

질문 어떤 주소공간이 있을 때, 이 공간이 수정 가능한지 확인할 수 있는 방법이 있나요?

답변 포인트 page table entry나 segment descriptor의 권한 비트를 확인합니다.

read/write/execute 권한이 설정됩니다.

질문 32비트 주소 공간에서 페이지 크기가 1KB라면 최대 가상 페이지 수와 단일 단계 페이지 테이블의 엔트리 수는 몇 개인가요?

답변 포인트 32비트 주소 공간은 2^32바이트, 페이지 크기 1KB는 2^10바이트이므로 최대 가상 페이지와 PTE는 각각 2^22개입니다.

페이지 테이블의 바이트 크기는 2^22 * PTE 크기이며, 다단계 페이지 테이블에서는 실제 매핑된 영역에 따라 필요한 하위 테이블만 할당할 수 있습니다.

질문 32비트 운영체제는 램을 최대 4G 까지 사용할 수 있습니다. 이 이유를 페이징과 연관 지어서 설명해 주세요.

답변 포인트 32비트 가상 주소는 표현 가능한 주소가 2^32개라 주소 공간이 4GB입니다.

다만 PAE 같은 기술로 물리 메모리는 더 사용할 수 있는 경우도 있습니다.

질문 Segmentation Fault는 세그멘테이션/페이징과 어떤 관계가 있을까요?

답변 포인트 잘못된 메모리 접근이나 권한 위반이 발생했을 때 OS가 보내는 오류입니다.

이름은 segmentation fault지만 현대 시스템에서는 페이지 보호 위반과도 관련됩니다.

주의할 점

  • 32비트는 프로세스 가상 주소 공간 한계와 물리 메모리 사용 한계를 구분해서 말해야 합니다.

19. TLB는 무엇인가요?

기본 답변

TLB는 Translation Lookaside Buffer로, 가상 주소를 물리 주소로 변환한 결과를 캐싱하는 작은 고속 캐시입니다.

매 메모리 접근마다 페이지 테이블을 조회하면 비용이 크기 때문에 최근 주소 변환 결과를 저장해 빠르게 변환합니다.

TLB hit가 나면 페이지 테이블 접근 없이 주소 변환이 가능하고, miss가 나면 페이지 테이블을 조회해야 합니다.

핵심 키워드

  • TLB
  • address translation
  • page table
  • MMU
  • TLB hit/miss
  • TLB shootdown

꼬리질문

질문 TLB를 쓰면 왜 빨라지나요?

답변 포인트 페이지 테이블 메모리 접근을 줄여 주소 변환 시간을 크게 줄이기 때문입니다.

질문 MMU가 무엇인가요?

답변 포인트 Memory Management Unit으로 가상 주소를 물리 주소로 변환하고 권한 검사를 수행하는 하드웨어입니다.

질문 TLB와 MMU는 어디에 위치해 있나요?

답변 포인트 CPU 내부 또는 CPU와 매우 가까운 메모리 관리 하드웨어에 위치합니다.

질문 코어가 여러개라면, TLB는 어떻게 동기화 할 수 있을까요?

답변 포인트 페이지 테이블 변경 시 다른 코어의 관련 TLB 항목을 무효화하는 TLB shootdown을 수행합니다.

질문 TLB 관점에서, Context Switching 발생 시 어떤 변화가 발생하는지 설명해 주세요.

답변 포인트 주소 공간이 바뀌면 기존 TLB 항목이 잘못될 수 있어 flush가 필요할 수 있습니다.

ASID/PCID가 있으면 프로세스별 항목을 구분해 flush 비용을 줄입니다.

주의할 점

  • TLB는 데이터 캐시가 아니라 주소 변환 캐시입니다.

20. 동기화를 구현하기 위한 하드웨어적인 해결 방법에 대해 설명해 주세요.

기본 답변

하드웨어 동기화는 CPU가 제공하는 원자적 명령과 메모리 순서 보장 기능을 이용해 공유 자원 접근을 안전하게 만드는 방식입니다.

대표적으로 test-and-set, compare-and-swap(CAS), fetch-and-add 같은 atomic instruction이 있습니다.

이런 명령은 락 구현, lock-free 자료구조, atomic 변수의 기반이 됩니다.

멀티코어 환경에서는 캐시 일관성과 메모리 배리어도 중요합니다.

핵심 키워드

  • atomic instruction
  • test-and-set
  • compare-and-swap
  • memory barrier
  • cache coherence
  • volatile

꼬리질문

질문 volatile 키워드는 어떤 의미가 있나요?

답변 포인트 언어마다 의미가 다릅니다.

Java의 volatile은 변수 읽기/쓰기의 가시성과 일정한 순서 보장을 제공합니다.

하지만 i++ 같은 복합 연산의 원자성은 보장하지 않습니다.

질문 싱글코어가 아니라 멀티코어라면, 어떻게 동기화가 이뤄질까요?

답변 포인트 원자 명령, 캐시 일관성 프로토콜, 메모리 배리어를 통해 코어 간 메모리 상태를 조정합니다.

락은 이런 하드웨어 기능 위에 구현됩니다.

주의할 점

  • volatile만으로 모든 동기화 문제가 해결되는 것은 아닙니다.

21. 페이지 교체 알고리즘에 대해 설명해 주세요.

기본 답변

페이지 교체 알고리즘은 메모리가 부족할 때 어떤 페이지를 내보낼지 결정하는 정책입니다.

목표는 page fault를 줄이고 자주 사용될 페이지를 메모리에 남기는 것입니다.

대표적으로 FIFO, Optimal, LRU, Clock 등이 있습니다.

Optimal은 미래를 알아야 하므로 실제 구현은 어렵고, LRU는 최근 사용 정보를 바탕으로 교체합니다.

핵심 키워드

  • page replacement
  • FIFO
  • Optimal
  • LRU
  • Clock
  • locality

꼬리질문

질문 LRU 알고리즘은 어떤 특성을 이용한 알고리즘이라고 할 수 있을까요?

답변 포인트 최근 사용한 페이지가 가까운 미래에도 다시 사용될 가능성이 높다는 시간 지역성을 이용합니다.

질문 LRU 알고리즘을 구현한다면, 어떻게 구현할 수 있을까요?

답변 포인트 해시맵과 doubly linked list를 조합하면 조회와 갱신을 O(1)로 처리할 수 있습니다.

질문 LRU 알고리즘의 단점을 설명해 주세요. 이를 해결할 수 있는 대안에 대해서도 설명해 주세요.

답변 포인트 정확한 LRU 구현은 비용이 크고, 순차 스캔에 약할 수 있습니다.

Clock, Second Chance, LFU, LRU-K 같은 대안을 사용할 수 있습니다.

주의할 점

  • 실제 OS는 비용 때문에 정확한 LRU보다 근사 알고리즘을 쓰는 경우가 많습니다.

22. File Descriptor와, File System에 대해 설명해 주세요.

기본 답변

File Descriptor는 프로세스가 열린 파일, 소켓, 파이프 같은 I/O 대상을 식별하기 위해 사용하는 작은 정수입니다.

프로세스별 fd table이 있고, 각 fd는 커널의 열린 파일 객체를 가리킵니다.

File System은 디스크 같은 저장장치에 파일과 디렉터리를 저장하고 관리하는 구조입니다.

파일 이름, 메타데이터, 권한, 블록 위치 등을 관리합니다.

핵심 키워드

  • file descriptor
  • fd table
  • inode
  • open file table
  • file system
  • buffer cache

꼬리질문

질문 I-Node가 무엇인가요?

답변 포인트 inode는 파일의 메타데이터와 데이터 블록 위치 정보를 담는 파일 시스템 자료구조입니다.

파일 이름은 디렉터리 엔트리가 inode를 가리키는 형태입니다.

질문 프로그래밍 언어 상에서 제공하는 파일 관련 함수는, 파일을 어떤 방식으로 읽어들이나요?

답변 포인트 언어의 I/O 라이브러리는 내부적으로 OS 시스템 콜을 사용합니다.

버퍼링 계층이 있어 매번 시스템 콜을 하지 않고 일정 크기씩 읽어 성능을 높입니다.

주의할 점

  • fd는 파일 자체가 아니라 프로세스가 열린 I/O 객체를 참조하기 위한 핸들입니다.

23. 동기와 비동기, 블로킹과 논블로킹의 차이에 대해 설명해 주세요.

기본 답변

동기/비동기는 작업 완료를 누가 어떻게 통지하고 흐름을 이어가는지에 관한 개념이고, 블로킹/논블로킹은 호출한 스레드가 결과가 준비될 때까지 기다리느냐에 관한 개념입니다.

동기는 호출자가 결과를 직접 확인하며 흐름을 맞추는 방식이고, 비동기는 작업 완료를 콜백, future, 이벤트 등으로 나중에 통지받는 방식입니다.

블로킹은 호출이 완료될 때까지 대기하고, 논블로킹은 즉시 반환됩니다.

핵심 키워드

  • synchronous
  • asynchronous
  • blocking
  • non-blocking
  • callback
  • I/O multiplexing

꼬리질문

질문 동기이면서 논블로킹이고, 비동기이면서 블로킹인 경우는 의미가 있다고 할 수 있나요?

답변 포인트 가능합니다.

동기 논블로킹은 호출자가 계속 상태를 확인하는 polling 형태가 될 수 있습니다.

비동기 블로킹은 비동기 작업을 요청해 놓고 future.get처럼 결과를 기다리는 형태가 될 수 있습니다.

질문 I/O 멀티플렉싱에 대해 설명해 주세요.

답변 포인트 하나의 스레드가 여러 I/O 대상의 준비 상태를 감시하고, 준비된 것만 처리하는 방식입니다.

select, poll, epoll, kqueue 등이 있습니다.

질문 논블로킹 I/O를 수행한다고 하면, 그 결과를 어떻게 수신할 수 있나요?

답변 포인트 준비 상태를 반복 확인하거나, 이벤트 루프와 I/O 멀티플렉싱을 통해 읽기/쓰기 가능 이벤트를 받은 뒤 처리합니다.

주의할 점

  • 동기/비동기와 블로킹/논블로킹은 서로 다른 축입니다. 같은 의미로 섞어 말하면 안 됩니다.

24. 우선순위 역전이 무엇이며, 어떻게 완화할 수 있나요?

기본 답변

우선순위 역전은 높은 우선순위 작업이 낮은 우선순위 작업이 보유한 락을 기다리는 상황에서 발생합니다. 이때 락과 무관한 중간 우선순위 작업이 낮은 우선순위 작업을 계속 선점하면, 결과적으로 높은 우선순위 작업이 중간 우선순위 작업보다 늦게 진행될 수 있습니다.

낮은 우선순위 작업이 임계 구역을 실행하는 동안 높은 우선순위 작업이 잠시 기다리는 것 자체는 정상적인 blocking입니다. 문제는 중간 우선순위 작업 때문에 락 소유자가 실행되지 못해 대기 시간이 예측할 수 없게 늘어나는 것입니다. 따라서 최악 응답시간을 보장해야 하는 실시간 시스템에서 특히 중요합니다.

Priority Inheritance는 높은 우선순위 작업을 막고 있는 락 소유자에게 대기 중인 작업의 높은 우선순위를 일시적으로 상속합니다. 락 소유자가 임계 구역을 끝내고 락을 해제하면 원래 우선순위로 돌아갑니다. 중첩된 락에서는 상속이 여러 작업을 따라 전파될 수 있으므로 구현이 이를 올바르게 처리해야 합니다.

Priority Ceiling은 각 자원에 그 자원을 사용할 수 있는 작업 중 가장 높은 우선순위를 ceiling으로 지정합니다. 구체적인 ceiling protocol은 락 획득 시 우선순위를 올리거나 다른 락 획득을 제한해 blocking 시간을 경계 안에 두며, 프로토콜의 가정이 만족되면 특정 교착 상태도 방지할 수 있습니다. 대신 스케줄러와 락 구현이 복잡해지고 모든 일반 시스템이 이를 제공하는 것은 아닙니다.

핵심 키워드

  • Priority Inversion
  • Priority Inheritance
  • Priority Ceiling
  • 임계 구역
  • 실시간 스케줄링

꼬리질문

질문 우선순위 역전과 기아 상태는 어떻게 다른가요?

답변 포인트 우선순위 역전은 낮은 우선순위 작업이 가진 자원 때문에 높은 우선순위 작업이 지연되는 구체적 현상이고, 기아는 실행이나 자원 획득 기회를 계속 얻지 못하는 더 일반적인 현상입니다.

질문 우선순위 상속은 모든 동기화 도구에 똑같이 적용할 수 있나요?

답변 포인트 소유자가 명확한 mutex에는 어떤 작업의 우선순위를 올려야 하는지 알 수 있어 적용하기 쉽습니다. 반면 counting semaphore처럼 특정 소유자가 없거나 여러 실행 흐름이 신호를 보낼 수 있는 도구에는 같은 규칙을 직접 적용하기 어렵습니다.

운영체제가 제공하는 실제 동기화 객체가 priority inheritance나 ceiling protocol을 지원하는지도 별도로 확인해야 합니다.

질문 낮은 우선순위 작업이 여러 락을 중첩해서 보유하면 Priority Inheritance는 어떻게 동작하나요?

답변 포인트 높은 우선순위 작업이 기다리는 락의 소유자가 다시 다른 락을 기다린다면 우선순위 상속이 그 다음 소유자에게 전파되어야 합니다. 이를 transitive priority inheritance라고 합니다.

락을 하나씩 해제할 때는 아직 남아 있는 대기 관계를 다시 계산해 필요한 우선순위만 유지해야 합니다. 무조건 원래 우선순위로 즉시 낮추면 다른 높은 우선순위 대기자를 다시 지연시킬 수 있습니다.

질문 Priority Inheritance를 적용하면 실시간 응답시간이 항상 보장되나요?

답변 포인트 아닙니다. 불필요한 중간 우선순위 선점은 줄이지만 임계 구역 자체가 길거나 I/O로 block되면 높은 우선순위 작업도 그만큼 기다립니다.

교착 상태, 과도한 락 중첩, 인터럽트 지연과 스케줄링 비용도 별도로 분석해야 하므로 최악 임계 구역 길이와 blocking bound를 함께 계산해야 합니다.

주의할 점

  • 우선순위 상속은 긴 임계 구역이나 교착 상태 자체를 제거하지 않습니다.
  • 실시간 요구가 있다면 최악 응답시간과 임계 구역 길이를 함께 분석해야 합니다.