[운영체제 구조 1] 인터럽트와 시스템 콜

Tags
Computer Science
Published
October 11, 2025
Author

1. 서론: 운영체제의 중재자 역할과 통신 메커니즘의 중요성

운영체제(Operating System, OS)는 현대 컴퓨팅 시스템의 근간을 이루는 핵심 소프트웨어입니다. OS는 사용자가 실행하는 응용 프로그램과 복잡한 컴퓨터 하드웨어 사이에서 필수적인 중재자 역할을 수행하며, 한정된 시스템 자원을 효율적으로 관리하고 사용자에게 일관성 있는 작업 환경을 제공합니다. 이러한 중재 역할을 성공적으로 수행하기 위해, 운영체제는 하드웨어 및 사용자 프로그램과 명확하고 안정적인 방식으로 소통해야 합니다.
이 통신을 가능하게 하는 두 가지 핵심 메커니즘이 바로 **인터럽트(Interrupt)**와 **시스템 콜(System Call)**입니다. 인터럽트는 하드웨어 장치가 자신의 상태 변화나 작업 완료를 CPU에 알리는 '상향식(Bottom-up)' 신호 체계이며, 시스템 콜은 사용자 프로그램이 파일 입출력이나 메모리 할당과 같이 권한이 필요한 OS 서비스를 요청하는 '하향식(Top-down)' 통신 창구입니다. 이 두 메커니즘은 운영체제의 효율성과 안정성을 보장하는 양대 축이라 할 수 있습니다.
아래 다이어그램은 컴퓨터 시스템의 계층적 구조와 두 통신 방식의 위치를 시각적으로 보여줍니다.
+-------------------------+ 사용자 | +-------------------------+ 응용 프로그램 | <-- 시스템 콜(System Call)을 통해 OS 서비스 요청 +=========================+ 운영체제 | <-- 하드웨어 제어 및 서비스 제공 (커널 모드 / 사용자 모드) | +=========================+ 하드웨어 | <-- 인터럽트(Interrupt)를 통해 OS에 신호 전달 (CPU, 메모리, I/O 장치) | +-------------------------+
본 백서는 인터럽트와 시스템 콜의 기술적 동작 흐름을 심층적으로 분석하여, 이들이 어떻게 유기적으로 협력하며 복잡한 컴퓨팅 환경을 제어하는지 명확히 설명하고자 합니다. 이 두 메커니즘에 대한 깊이 있는 이해는 현대 컴퓨팅 시스템의 근본적인 동작 방식을 파악하는 데 필수적인 기반이 될 것입니다.
--------------------------------------------------------------------------------

2. 하드웨어와 운영체제의 소통: 인터럽트 메커니즘

인터럽트는 단어의 의미 그대로 CPU가 현재 수행 중인 작업을 '방해(interrupt)'하는 메커니즘입니다. 그러나 이 '방해'는 비효율적인 중단이 아니라, 시스템 전체의 효율성을 극대화하기 위한 고도로 설계된 전략입니다. CPU가 키보드 입력이나 디스크 읽기 같은 I/O 작업이 완료될 때까지 무작정 기다리는 대신, 다른 작업을 처리하다가 작업 완료 신호가 오면 그때 반응하도록 하는 비동기적 처리 방식의 핵심입니다. 이는 마치 스마트폰의 '푸시 알림'처럼, CPU가 불필요하게 대기하지 않고 필요할 때만 이벤트를 처리하게 하여 시스템의 반응성을 극대화합니다.

2.1. 하드웨어 인터럽트의 물리적 신호 전달 과정

하드웨어 인터럽트는 물리적인 전기 신호를 통해 발생합니다. I/O 장치에서 발생한 이벤트가 CPU에 전달되기까지의 과정은 다음과 같은 주요 하드웨어 구성 요소들의 상호작용으로 이루어집니다.
  1. I/O 작업 완료 및 신호 발생
      • 키보드, 마우스, 디스크 등 각 I/O 장치는 자신을 제어하는 **디바이스 컨트롤러(Device Controller)**를 가지고 있습니다. 사용자가 키를 누르거나 디스크가 데이터 읽기를 완료하면, 해당 디바이스 컨트롤러는 작업 완료를 알리는 전기적 신호를 생성합니다.
  1. 신호 집약 및 중재 (PIC)
      • 컴퓨터에는 수많은 장치가 연결되어 있어 동시에 여러 인터럽트가 발생할 수 있습니다. 이러한 신호들을 효율적으로 관리하기 위해 **프로그래머블 인터럽트 컨트롤러(PIC, Programmable Interrupt Controller)**가 존재합니다. PIC는 여러 디바이스 컨트롤러로부터 오는 인터럽트 신호를 한데 모아 우선순위를 정하고, 중재를 거쳐 CPU에 전달할 단일 신호를 생성합니다.
  1. CPU로의 물리적 전달
      • PIC를 거친 인터럽트 신호는 **시스템 버스(System Bus)**를 통해 CPU로 전달됩니다. CPU 칩에는 수많은 핀(pin)이 있으며, 이 중 인터럽트 신호 수신 전용 핀인 **인터럽트 요청 라인(Interrupt Request Line)**이 있습니다. 이 핀에 전기적 신호 변화(예: 0에서 1로)가 감지되면 CPU는 인터럽트 발생을 인지하게 됩니다. 최신 컴퓨터의 메인보드에서는 이러한 컨트롤러 기능들이 **칩셋(Chipset)**이라는 단일 칩에 통합되어 있습니다.

2.2. 인터럽트 처리의 소프트웨어적 절차

CPU가 물리적 신호를 감지한 후에는 운영체제 내부의 소프트웨어적 절차가 시작됩니다. 이 과정의 핵심은 **인터럽트 벡터(Interrupt Vector)**와 **인터럽트 서비스 루틴(Interrupt Service Routine, ISR)**입니다.
용어 (Term)
정의 (Definition)
역할 (Role)
디바이스 드라이버
특정 하드웨어 장치를 제어하기 위한 OS 내의 소프트웨어
응용 프로그램과 하드웨어 컨트롤러 간의 통신을 중개
인터럽트 벡터
인터럽트 종류(번호)와 해당 인터럽트를 처리할 함수의 주소를 매핑한 테이블
특정 인터럽트 발생 시, 실행해야 할 정확한 처리 루틴(ISR)을 신속하게 찾아내도록 지원
인터럽트 서비스 루틴 (ISR)
특정 인터럽트를 처리하기 위해 미리 정의된 운영체제 내의 함수(코드)
인터럽트의 원인을 파악하고 필요한 작업을 수행한 후, CPU를 원래 작업으로 복귀시킴
CPU는 인터럽트 신호를 받으면 현재 진행하던 작업의 상태를 저장하고, 인터럽트 벡터를 참조하여 발생한 인터럽트 번호에 해당하는 ISR의 메모리 주소(함수 포인터)를 찾습니다. 그리고 해당 ISR(또는 인터럽트 핸들러)로 실행 흐름을 전환하여 인터럽트 처리 작업을 수행합니다. ISR의 실행이 완료되면, CPU는 저장해두었던 원래 작업의 상태를 복원하고 중단되었던 지점부터 실행을 재개합니다. 이때 인터럽트 벡터의 구조와 내용은 Intel, ARM 등 프로세서 아키텍처에 따라 달라질 수 있습니다.

2.3. 인터럽트의 종류

인터럽트는 발생 원인에 따라 크게 두 가지로 나뉩니다.
  • 하드웨어 인터럽트 (Hardware Interrupt): 앞서 설명한 바와 같이 키보드, 디스크 등 외부 하드웨어 장치에 의해 발생하는 비동기적 인터럽트입니다. 이는 다시 두 가지로 세분화될 수 있습니다.
    • 마스커블 인터럽트 (Maskable Interrupt): 일반적인 I/O 완료 신호와 같이 OS가 일시적으로 무시(masking)할 수 있는 회복 가능한 인터럽트입니다.
    • 논마스커블 인터럽트 (Non-maskable Interrupt): 심각한 하드웨어 오류(예: 메모리 패리티 에러)와 같이 OS가 무시할 수 없는, 즉시 처리해야 하는 회복 불가능한 인터럽트입니다.
  • 소프트웨어 인터럽트 (Software Interrupt) / 예외 (Exception): 소프트웨어 실행 중에 발생하는 문제로 인해 발생하는 동기적 인터럽트입니다. 예를 들어, 어떤 숫자를 0으로 나누려고 시도하거나, 할당되지 않은 메모리 영역에 접근하는 등의 오류가 발생하면 CPU는 이를 예외 상황으로 감지하고 관련 처리 루틴을 실행합니다. 이러한 예외 처리 역시 인터럽트 메커니즘을 통해 관리됩니다.
요약하자면, 인터럽트는 하드웨어의 상태 변화나 예외적 상황을 운영체제에 알리는 핵심적인 비동기 통신 방식입니다. 이제 사용자 프로그램이 능동적으로 운영체제에 서비스를 요청하는 방식인 시스템 콜에 대해 알아보겠습니다.
--------------------------------------------------------------------------------

3. 사용자 프로그램과 운영체제의 소통: 시스템 콜

사용자 프로그램이 파일 생성, 네트워크 통신 등 시스템의 핵심 자원에 직접 접근한다면 심각한 보안 문제나 시스템 불안정을 초래할 수 있습니다. 시스템 콜(System Call)은 이러한 문제를 방지하기 위해 운영체제가 제공하는 유일한 서비스 요청 통로입니다. 운영체제는 CPU의 작동 모드를 **사용자 모드(User Mode)**와 **커널 모드(Kernel Mode)**로 구분합니다. 사용자 프로그램은 제한된 권한을 가진 사용자 모드에서 실행되며, 시스템 자원에 접근하려면 반드시 시스템 콜을 통해 특권 모드인 커널 모드로 전환하여 운영체제의 허락을 받아야 합니다. 이는 시스템의 보안과 자원 관리의 핵심 원칙입니다.

3.1. 시스템 콜의 동작 흐름: 모드 전환의 과정

사용자 프로그램이 printf와 같은 표준 라이브러리 함수를 호출할 때, 그 내부에서는 최종적으로 화면에 데이터를 쓰기 위한 write 시스템 콜이 발생하는 등 복잡한 과정이 일어납니다. 이 동작 흐름은 다음과 같은 6단계로 분석할 수 있습니다.
  1. 사용자 공간에서의 함수 호출: 사용자 프로그램이 파일 열기(open)나 화면 출력(printf)과 같은 표준 API 함수를 호출합니다.
  1. 시스템 콜 인터페이스 호출: API 함수 내부에서는 실제 OS 서비스를 요청하기 위해 특정 번호와 함께 시스템 콜 명령(예: write)을 호출합니다. 이 번호는 요청할 서비스의 종류를 식별합니다.
  1. 커널 모드로 전환 (Mode Switch): 시스템 콜 명령이 실행되면 CPU는 하드웨어적으로 사용자 모드에서 커널 모드로 전환됩니다. 이 시점부터 프로그램의 실행 제어권은 운영체제(커널)로 넘어갑니다.
  1. 시스템 콜 핸들러 실행: 커널은 전달받은 시스템 콜 번호를 이용해 **시스템 콜 테이블(System Call Table)**을 조회합니다. 이 테이블에는 각 번호에 해당하는 실제 처리 함수(시스템 콜 핸들러, 예: sys_open)의 주소가 매핑되어 있습니다. 커널은 해당 핸들러를 찾아 실행합니다. 이러한 중개 과정은 사용자 프로그램이 커널 공간에 있는 sys_open과 같은 보호된 함수를 직접 호출하는 것을 원천적으로 차단하여 시스템의 안정성을 보장하는 핵심적인 보안 메커니즘입니다.
  1. 작업 수행 및 결과 반환: 시스템 콜 핸들러가 파일 시스템 접근이나 장치 제어와 같은 요청된 작업을 수행하고, 그 결과를 준비합니다.
  1. 사용자 모드로 복귀: 작업이 완료되면 CPU는 다시 사용자 모드로 전환되고, 결과값은 사용자 프로그램에 반환됩니다. 프로그램은 중단되었던 지점부터 실행을 계속합니다.

3.2. 시스템 콜 파라미터 전달 방식 분석

사용자 프로그램이 시스템 콜을 호출할 때 필요한 인자(파라미터)를 커널에 전달하는 데에는 주로 세 가지 방식이 사용됩니다.
  • 레지스터를 이용한 방식: 파라미터의 개수가 적을 때 가장 간단하고 빠른 방법입니다. 미리 약속된 CPU 레지스터에 파라미터 값을 직접 저장하여 커널에 전달합니다. 속도가 매우 빠르지만, 사용 가능한 레지스터의 개수가 한정적이어서 많은 파라미터를 전달하기에는 한계가 있습니다.
  • 메모리 블록(테이블)을 이용한 방식: 파라미터들을 메모리의 특정 공간(블록 또는 테이블)에 연속적으로 저장하고, 이 메모리 블록의 시작 주소를 레지스터를 통해 커널에 전달합니다. 파라미터 개수에 제한이 없어 유연성이 높지만, 메모리 접근이 필요하므로 레지스터 방식보다는 속도가 느립니다.
  • 스택을 이용한 방식: 프로그램의 스택 메모리 공간에 파라미터를 순서대로 푸시(push)하여 전달하는 방식입니다. 이 역시 메모리를 활용하는 방법으로, 파라미터 개수에 제약이 없습니다.
현대의 리눅스와 같은 운영체제들은 속도가 빠른 레지스터 방식과 유연성이 높은 메모리 방식을 혼합하여 사용합니다. 예를 들어, 처음 몇 개의 파라미터는 레지스터로 전달하고, 그 이상의 파라미터는 스택이나 메모리 블록을 통해 전달하여 효율성과 유연성을 모두 확보합니다.

3.3. 시스템 콜 인터페이스의 다양성

시스템 콜은 운영체제의 서비스와 직결되므로, OS마다 고유한 인터페이스를 가집니다. 예를 들어, Windows의 Win32 API와 UNIX/Linux 계열의 시스템 콜 인터페이스는 서로 다릅니다. 이 때문에 특정 운영체제용으로 컴파일된 프로그램은 다른 운영체제에서 호환성 없이 바로 실행될 수 없습니다. 최근에는 이러한 이질성을 극복하기 위해, Windows에서 리눅스용 프로그램을 실행할 수 있도록 리눅스 시스템 콜을 지원하는 호환성 계층(Compatibility Layer) 기술이 등장하기도 했습니다.
결론적으로, 시스템 콜은 사용자 프로그램이 운영체제가 제공하는 보호된 서비스에 접근할 수 있는 공식적인 '창구' 역할을 합니다. 이제 마지막으로 인터럽트와 시스템 콜, 이 두 메커니즘을 종합적으로 정리해 보겠습니다.
--------------------------------------------------------------------------------

4. 결론: 현대 운영체제의 두 가지 핵심 통신 축

본 백서에서 분석한 바와 같이, 인터럽트와 시스템 콜은 현대 운영체제를 지탱하는 두 가지 핵심적인 통신 축입니다. 이 두 메커니즘은 서로 다른 목적과 방향성을 가지고 시스템의 동적인 흐름을 제어합니다.
  • 인터럽트하드웨어로부터의 비동기적 이벤트를 처리하는 '상향식(Bottom-up)' 통신 방식입니다. CPU는 예측할 수 없는 시점에 발생하는 외부 장치의 신호에 수동적으로 반응하여 시스템의 응답성을 보장합니다.
  • 시스템 콜사용자 프로그램의 능동적인 서비스 요청을 처리하는 '하향식(Top-down)' 통신 방식입니다. 프로그램은 OS가 정의한 공식적인 절차를 통해 보호된 자원에 대한 접근을 요청하고, OS는 이를 통제하며 서비스를 제공합니다.
이처럼 인터럽트는 하드웨어의 상태 변화를 운영체제에 전달하는 역할을, 시스템 콜은 응용 프로그램의 서비스 요구를 운영체제에 전달하는 역할을 수행합니다. 이 두 메커니즘의 정교한 협력을 통해 컴퓨터 시스템은 외부 장치와의 효율적인 상호작용(효율성), 보호된 커널 영역을 통한 자원 관리(안정성), 그리고 권한 분리를 통한 시스템 보호(보안)라는 세 가지 핵심 가치를 동시에 달성할 수 있습니다. 따라서 인터럽트와 시스템 콜에 대한 이해는 운영체제의 구조뿐만 아니라 현대 컴퓨팅 시스템 전체의 동작 원리를 파악하는 첫걸음이라 할 수 있습니다.