예외상황

2025. 8. 10. 22:29·CS:APP

예외(Exception)란?

예외는 프로그램이 정상적으로 진행되던 도중, 특정 상황이 발생했을 때 운영체제(OS)가 프로그램 흐름을 강제로 바꾸는 사건. 이를 예외적 제어 흐름(Exceptional Control Flow)

  • 필요성:
    • 외부 장치 입력 (키보드 입력, 마우스 클릭, 네트워크 데이터 수신 등)
    • 프로그램의 예기치 않은 오류 (0으로 나누기, 메모리 접근 오류 등)
    • OS의 서비스 요청(시스템 콜)

정상적 함수 호출(call) 방식으로 대응 불가능하기 때문에 운영체제의 특수한 처리(예외 처리, Exception Handling)가 필요


예외 처리 구조 (Exception Handling)

예외 처리는 다음과 같은 방식으로 진행

  1. 예외 발생 시 CPU가 이를 감지하고 `예외 번호를 찾음` (그림 1)
  2. CPU가 미리 설정된 `예외 처리 루틴(Exception Handler)의 주소를 조회` (그림 2)
  3. (파생개념: 예외 테이블 - Interrupt Descriptor Table, IDT)
  4. CPU가 현재 상태(컨텍스트)를 자동으로 저장하고, `커널 모드`로 전환
  5. OS의 예외 처리 루틴을 실행하여 예외 상황 처리
  6. 처리 후 이전 상태를 복원하여 프로그램 실행을 재개하거나, 프로그램을 종료

그림 1 예외번호 탐색
그림 2 예외 주소 조회

함수 호출과 차이점

  • 함수 호출은 프로그램이 직접 호출하나, 예외는 CPU와 OS가 자동 개입
  • 예외는 사용자 스택이 아니라 별도의 커널 스택을 사용하고, 권한 모드가 바뀜(사용자→커널)

예외의 주요 유형 (4가지)

유형 발생 원인 발생 시점 복구 가능성 예시
인터럽트(Interrupt) 외부 하드웨어 이벤트 비동기 복구 가능 (항상 다음 명령으로 복귀) 키보드 입력, 네트워크 신호
트랩(Trap) 프로그램이 OS 서비스 요청 시 동기 복구 가능 (항상 다음 명령으로 복귀) 시스템 콜(system call, open(), read())
폴트(Fault) 실행 중인 명령어가 오류 발생 시 동기 대부분 복구 가능(현재 명령 재실행)하지만, 복구 불가 시 종료 페이지 폴트(page fault), 0으로 나누기(divide-by-zero)
어보트(Abort) 치명적 하드웨어 오류 동기 복구 불가, 무조건 종료 하드웨어 손상, 심각한 시스템 오류
- 동기 vs 비동기:        
- 동기: 현재 실행 명령과 관련 있음 (트랩, 폴트, 어보트)        
- 비동기: 현재 실행 명령과 무관하게 발생 (인터럽트)        

리눅스(x86-64) 시스템에서 예외 처리 방식

  • CPU는 예외 번호(0~255)를 부여하여 관리
  • 예외 번호를 통해 예외 테이블(Interrupt Descriptor Table, IDT)에서 처리 루틴 주소를 찾음
  • 처리 루틴은 커널 모드에서 수행되고, 상황에 따라 프로그램을 재개하거나 종료함

예시로 중요한 예외 번호:

  • 0번 (Divide Error): 0으로 나누기, 복구 불가(프로그램 종료)
  • 13번 (General Protection Fault): 잘못된 메모리 접근(복구 불가, 프로그램 종료)
  • 14번 (Page Fault): 메모리 페이지 로딩 필요(복구 가능, 재실행)
  • 128번 (시스템 콜): 시스템 서비스 호출 (복구 가능, 트랩)

예외와 함수 호출의 차이점

구분 함수 호출 예외 처리
호출 주체 프로그램 코드(명시적) CPU, OS(자동)
실행 모드 같은 모드 유지(사용자↔사용자) 사용자→커널로 권한 전환
스택 사용자 스택 사용 별도의 커널 스택 사용
컨텍스트 저장 호출자가 직접 수행 CPU가 자동 수행
복귀 위치 항상 호출 다음 명령 예외 유형에 따라 현재/다음 명령 또는 복귀 안함

파생 개념 (이후 학습과 연결)

예외 처리 메커니즘을 이해하면 다음과 같은 OS의 주요 개념 이해로 자연스럽게 확장

  • 프로세스(Process)
    • 예외 처리(특히 타이머 인터럽트)를 통해 CPU가 여러 프로세스를 교대로 실행(컨텍스트 스위칭)
  • 시스템 콜(System Call)
    • 사용자 프로그램이 커널 서비스 요청 시 사용하는 인터페이스, 트랩 예외로 구현됨
    • 프로그램이 파일 시스템, 프로세스 관리, 메모리 관리 등을 커널에 요청할 때 활용
  • 시그널(Signal)
    • 프로그램 간, 커널과 프로그램 간의 소프트웨어 인터럽트 방식의 통신 수단
    • 예외 상황(예: segmentation fault)이 발생하면 커널이 프로세스에 시그널을 전달하여 처리하거나 종료하게 함

요약 정리

  • 예외는 프로그램의 정상 흐름을 중단하고 운영체제가 개입하는 사건
  • 인터럽트, 트랩, 폴트, 어보트 4가지 유형이 존재
  • 리눅스에서는 예외 번호를 부여하고 IDT를 통해 관리
  • 함수 호출과 달리 커널 모드로 전환되고, 자동 컨텍스트 저장 및 별도의 커널 스택 사용
  • 예외 메커니즘은 이후 프로세스, 시스템 콜, 시그널 개념과 밀접히 연결됨
728x90

'CS:APP' 카테고리의 다른 글

시그널  (0) 2025.08.10
실행 가능 목적파일의 로딩  (0) 2025.08.09
ELF, Executable and Linkable Format (재배치 가능 목적파일)  (0) 2025.08.08
컴파일러 드라이버  (0) 2025.08.04
함수는 추상화의 결과다 - CS:APP 3.7 프로시저 호출  (0) 2025.04.08
'CS:APP' 카테고리의 다른 글
  • 시그널
  • 실행 가능 목적파일의 로딩
  • ELF, Executable and Linkable Format (재배치 가능 목적파일)
  • 컴파일러 드라이버
ahpicl64
ahpicl64
in the clouds
  • ahpicl64
    구름
    ahpicl64
  • 전체
    오늘
    어제
    • 분류 전체보기 (95)
      • WIL (4)
      • Jungle (36)
      • AWS (2)
      • SQL (2)
      • CS:APP (17)
      • Algorithm (10)
      • K8s (7)
      • 자료 구조 (10)
      • Spring (4)
      • React (0)
      • 운영체제 (1)
      • 기타등등 (2)
      • 이야기 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    python
    AWS
    github actions
    Spring
    트러블슈팅
    부하테스트
    queue
    컴퓨터시스템
    자료구조
    IAM
    DevOps
    S3
    k8s
    CSAPP
    CloudFront
    DB
    Spring boot
    어셈블리
    EC2
  • 02-21 07:23
  • hELLO· Designed By정상우.v4.10.3
ahpicl64
예외상황
상단으로

티스토리툴바