cs

[크래프톤 정글] 예외상황(CSAP 8.1장)

하루이2222 2024. 10. 12. 12:44

8.1 예외(Exception) - 상세 설명

예외는 프로그램의 실행 중에 정상적인 제어 흐름을 방해하는 예기치 않은 사건이 발생할 때 나타나는 현상이다. 이러한 예외는 하드웨어나 소프트웨어 모두에 의해 발생할 수 있으며, 시스템은 이를 처리하기 위해 제어 흐름을 변경하여 예외 처리 코드를 실행한다. 이 과정은 컴퓨터 시스템에서 중요한 개념인 예외적인 제어 흐름(ECF: Exceptional Control Flow)를 이해하는 데 핵심적인 역할을 한다.

예외 처리의 개념

프로세서는 예외가 발생하면 즉시 현재 실행 중인 명령어의 실행을 중단하고, 특정 예외 처리 루틴을 호출한다. 이 루틴은 발생한 예외를 처리한 뒤, 필요에 따라 원래 프로그램으로 돌아가거나, 프로그램을 종료할 수 있다. 예외 처리는 시스템의 핵심 메커니즘 중 하나로, 예외가 발생할 때 프로그램이 올바르게 대응하도록 한다.

예외 처리의 과정

  1. 예외 발생: 하드웨어 또는 소프트웨어가 문제를 감지하여 예외를 발생시킨다. 예를 들어, 잘못된 메모리 접근(페이지 폴트)이나 0으로 나누기 같은 상황에서 발생할 수 있다.

  2. 예외 처리 루틴 실행: 프로세서는 현재의 명령어 실행을 중지하고, 예외 테이블(exception table)을 참조하여 발생한 예외에 대응하는 처리 루틴으로 점프한다. 이 예외 테이블은 예외 유형별로 처리해야 할 핸들러 코드를 저장하는 테이블이다.

  3. 제어 흐름 복구: 예외 처리가 완료되면, 시스템은 다음 세 가지 방식으로 제어 흐름을 복구할 수 있다.

    • 재시도: 예외를 발생시킨 명령어를 다시 실행한다.
    • 건너뛰기: 오류가 발생한 명령어를 건너뛰고 다음 명령어로 제어를 넘긴다.
    • 중단: 프로그램을 종료하고 제어를 운영체제에 반환한다.

예외의 주요 유형

예외는 네 가지 기본 유형으로 분류된다:

  1. 인터럽트(Interrupts): 하드웨어에서 발생하며, 외부 장치가 CPU에 주기적으로 신호를 보내어 발생한다. 예를 들어, 키보드나 마우스 입력 등이 이에 해당한다. 이는 비동기적으로 발생한다.

  2. 트랩(Traps): 의도적으로 발생시키는 예외로, 주로 소프트웨어에서 시스템 호출을 할 때 사용된다. 예외 발생 후 프로세스는 정상적인 흐름으로 계속해서 명령어를 실행한다. 이는 동기적으로 발생한다.

  3. 폴트(Faults): 오류가 발생했을 때 프로그램이 다시 시도할 수 있는 상황이다. 예를 들어, 페이지 폴트는 일시적으로 메모리에 접근할 수 없을 때 발생하는데, 페이지가 적재되면 명령어를 다시 실행할 수 있다.

  4. 어보트(Aborts): 복구할 수 없는 심각한 오류가 발생했을 때 사용된다. 이 경우 예외는 다시 시도되지 않으며 프로그램은 종료된다. 주로 하드웨어 결함이나 치명적인 시스템 오류가 원인이다.

리눅스의 예외 처리

리눅스 시스템에서는 x86-64 아키텍처를 기반으로 예외 처리를 수행한다. 리눅스에서 예외는 시스템 전체에서 발생할 수 있으며, 다음과 같은 방식으로 분류된다:

  • 프로세서 예외: 프로세서 내부에서 발생하는 오류로, 페이지 폴트, 불법 명령어, 보호 오류 등이 있다.
  • 외부 장치 예외: 타이머 인터럽트나 입출력 장치의 신호 등 외부 하드웨어가 트리거하는 예외이다.

예외 처리는 하드웨어 및 소프트웨어가 협력하여 프로그램이 중단되지 않고 계속 실행되거나, 안전하게 종료될 수 있도록 보장하는 메커니즘이다. 이를 통해 시스템의 안정성을 유지하고 프로그램이 올바르게 동작할 수 있도록 돕는다