[Daily morning study] 인터럽트와 시스템 콜 동작 방식

#daily morning study

Image


인터럽트 (Interrupt)

인터럽트란?

CPU가 현재 실행 중인 작업을 잠시 멈추고 다른 중요한 이벤트를 처리하게 하는 메커니즘이다. 하드웨어나 소프트웨어에서 신호가 발생하면 CPU는 하던 일을 잠시 저장하고 해당 이벤트를 처리한 뒤 원래 작업으로 돌아온다.

인터럽트의 종류

하드웨어 인터럽트 (외부 인터럽트)

  • 키보드 입력, 마우스 클릭, 디스크 I/O 완료 등 외부 장치가 CPU에 신호를 보냄
  • 프로그램 실행과 무관하게 비동기적으로 발생

소프트웨어 인터럽트 (트랩 / 내부 인터럽트)

  • 0으로 나누기, 잘못된 메모리 접근, 시스템 콜 호출 등 프로그램 실행 중에 발생
  • 프로그램 흐름에 따라 동기적으로 발생

인터럽트 처리 흐름

  1. 인터럽트 신호 발생
  2. CPU가 현재 실행 중인 명령어 완료
  3. 현재 컨텍스트(레지스터, PC 등)를 스택에 저장
  4. 인터럽트 벡터 테이블에서 ISR(Interrupt Service Routine) 주소 조회
  5. ISR 실행 (인터럽트 처리)
  6. 저장해둔 컨텍스트 복원
  7. 원래 작업 재개

인터럽트 벡터 테이블은 각 인터럽트 번호에 대응하는 ISR 주소를 저장한 배열이다. CPU는 인터럽트 번호를 인덱스로 삼아 해당 핸들러를 바로 찾아 실행한다.


시스템 콜 (System Call)

시스템 콜이란?

사용자 프로그램(User Mode)이 파일 읽기/쓰기, 프로세스 생성, 네트워크 통신처럼 OS 커널(Kernel Mode)만 할 수 있는 작업을 요청하는 인터페이스다.

운영체제는 보안과 안정성을 위해 실행 모드를 둘로 나눈다.

 User ModeKernel Mode
권한제한적모든 하드웨어/메모리 접근
실행 주체일반 응용 프로그램OS 커널
장애 영향해당 프로세스만 종료시스템 전체 위험

응용 프로그램이 직접 하드웨어를 건드리지 못하게 막고, 반드시 커널을 통해서만 접근하도록 강제한다.

시스템 콜 동작 과정

  1. 응용 프로그램에서 시스템 콜 함수 호출 (예: read(), write())
  2. 소프트웨어 인터럽트 발생 (x86은 int 0x80, x86-64는 syscall 명령어)
  3. CPU 모드 전환: User Mode → Kernel Mode
  4. 커널이 시스템 콜 번호를 보고 해당 핸들러 실행
  5. 실행 결과를 레지스터(보통 rax)에 저장
  6. CPU 모드 복귀: Kernel Mode → User Mode
  7. 응용 프로그램이 반환 값 수신

시스템 콜 종류

분류주요 시스템 콜
프로세스 제어fork(), exec(), exit(), wait()
파일 관리open(), read(), write(), close()
장치 관리ioctl()
정보 관리getpid(), time()
통신socket(), bind(), connect(), send()

시스템 콜 예시 (C)

#include <unistd.h>
#include <fcntl.h>

int main() {
    // open(), read(), close() 모두 내부적으로 시스템 콜 발생
    int fd = open("data.txt", O_RDONLY);
    char buf[256];
    ssize_t n = read(fd, buf, sizeof(buf));
    close(fd);
    return 0;
}

strace 명령어로 실제 시스템 콜 호출을 추적할 수 있다.

$ strace ./a.out
execve("./a.out", ["./a.out"], ...) = 0
openat(AT_FDCWD, "data.txt", O_RDONLY) = 3
read(3, "hello\n", 256) = 6
close(3) = 0
...

인터럽트와 시스템 콜의 관계

시스템 콜은 소프트웨어 인터럽트(트랩)의 한 형태다. 사용자 프로그램이 의도적으로 트랩을 발생시켜 커널 서비스를 요청하는 방식으로 동작한다.

 하드웨어 인터럽트시스템 콜
발생 원인외부 장치응용 프로그램
발생 시점비동기동기
목적I/O 완료 알림, 타이머 등커널 기능 요청
처리 루틴ISR시스템 콜 핸들러

모드 전환 오버헤드와 최적화

시스템 콜을 호출할 때마다 User Mode ↔ Kernel Mode 전환이 일어나고, 여기에는 비용이 따른다.

  • 레지스터 저장/복원
  • TLB 플러시 (일부 아키텍처)
  • 캐시 상태 변경

이 오버헤드를 줄이기 위한 기법들:

vDSO (Virtual Dynamic Shared Object)
gettimeofday() 같이 커널 데이터를 읽기만 하는 시스템 콜을 User Space 메모리에 매핑해서 모드 전환 없이 실행한다.

io_uring (Linux 5.1+)
여러 I/O 요청을 링 버퍼에 쌓아두고 한 번에 커널에 전달해서 시스템 콜 횟수를 대폭 줄인다. 고성능 I/O가 필요한 서버에서 사용된다.