CSAPP: 8장 예외적인 제어흐름 [ 크래프톤 정글 41일차 ]

jinsung·2025년 6월 24일

크래프톤 정글 9기

목록 보기
39/59

예외적인 제어흐름이라는 제목을 보고 "어..? try catch excetion 같은 건가" 했는데

어떤 오류가 발생했을 때의 예외적인 제어흐름이 아니라
정말 어떤 특별한 이벤트를 예외라고 하는 것 같다.

이 장에서는 이 예외라는 것을 만들어서 컴퓨터가 어떻게 특별한 제어흐름을 만들어 가는지 알아볼 수 있다.

1. 예외의 종류

예외에는 총 4가지 종류가 있다.

  • 인터럽트(Interrupt)
  • 트랩(Trap)
  • 폴트(fault)
  • 중단(abort)

1-1. 인터럽트

인터럽트는 프로세서 외부에 있는 입출력 디바이스 ( 마우스, 키보드 ) 등으로부터 이벤트를 받았을 때 발생한다.

인터럽트 핀이 high 로 올라가게 되는데, 프로세서는 인스트럭션을 실행하다가 인터럽트 핀이 high 로 올라간 것을 확인하고 제어흐름을 넘긴다.

가장 기본적인 예외흐름인데 인터럽트에 적용된다.

그냥 인스터럭션이 잘 실행되고있다가..두궁두궁..

  • 현재 실행되고 있는 인스트럭션이 종료되면 제어흐름을 넘긴다.
  • 제어핸들링이 완료되면 다시 다음 인스트럭션 부터 실행한다.

아무래도 사용자가 언제 입출력을 실행할지 모르니 비동기적이다.
즉, 현재 실행되고 있는 인스트럭션과 관련이없다.

나머지 3개의 예외의 종류들은

인스트럭션의 실행결과로 동기적으로 일어난다. 우리는 이것을 오류 인스트럭션이라고 부르기로 했다.

1-2. 트랩 (Trap)

트랩은 프로세서 내부에서 발생한 이벤트에 의한 예외로, 주로 운영체제에 어떤 서비스를 요청할 때 사용된다. 예를 들어, 파일을 열거나, 데이터를 읽거나, 네트워크로 메시지를 전송할 때 등이다.

보통 사용자 프로그램이 직접 시스템 호출(System Call)이라는 것을 통해 커널에 요청하면서 발생한다.

즉, 트랩은 다음과 같은 특징을 가진다:

  • 동기적(synchronous): 실행 중인 인스트럭션의 결과로 발생한다.

  • 복귀 가능(recoverable): 예외 핸들러가 끝나면 원래 인스트럭션의 다음 인스트럭션부터 다시 실행을 계속할 수 있다.

  • 일부러 일으킨다: 오류가 아니라 의도적으로 발생시키는 경우가 많다.

예를 들어 C 코드에서 write()나 read() 같은 시스템 콜을 호출하면 내부적으로 int $0x80 같은 트랩 인스트럭션을 사용하게 된다 (x86 기준).

트랩 흐름은 이렇게 된다:

  1. 트랩 인스트럭션 실행
  2. 운영체제 커널의 핸들러로 제어 이동
  3. 커널이 요청 작업 수행
  4. 완료 후, 원래 프로그램으로 복귀

정리하면, 트랩은 사용자 → 커널로 넘어가기 위한 정상적인 통로다!

1-3. 폴트 (Fault)

폴트는 예외 상황이 발생했지만, 해결 가능성이 있는 경우 발생하는 예외다. 이때 프로세서는 현재 실행 중이던 인스트럭션을 다시 시도(restart) 할 수 있도록 제어흐름을 예외 핸들러로 넘긴다.

대표적인 예시로는 페이지 폴트(Page Fault)가 있다.

운영체제는 가상 메모리를 사용하기 때문에, 어떤 메모리 주소에 접근하려 했을 때 그 페이지가 아직 메모리에 로드되지 않았다면 페이지 폴트가 발생한다.

이때 OS는 다음과 같은 절차로 처리한다:

  1. 페이지 폴트 발생 → 제어를 커널로 넘김
  2. 커널이 해당 페이지를 디스크에서 메모리로 로드
  3. 모든 준비가 끝난 후 → 같은 인스트럭션을 다시 실행

폴트의 핵심은 복구 가능성이다. 예외 핸들러가 문제를 해결할 수 있다면, 인스트럭션을 다시 실행해서 아무 일도 없었던 것처럼 진행된다.

1-4. 어보트 (Abort)

어보트는 복구 불가능한 심각한 오류가 발생했을 때 나타난다.

예를 들어, 하드웨어 자체에 문제가 생겼거나, 시스템의 내부 상태가 너무 손상되었을 때 발생하며, 현재 실행 중인 프로그램을 종료시킨다.

주요 특징:

  • 동기적
  • 복구 불가능

핸들러는 프로그램을 종료하거나, 시스템을 멈춘다

예시로는 하드웨어 메모리 오류, 시스템 버스 에러, FPU(부동소수점 연산 장치) 내부의 심각한 오류 등이 있다.

요약

예외 종류발생 원인동기 여부복구 가능 여부제어 흐름 이후
인터럽트 (Interrupt)외부 장치비동기가능다음 인스트럭션
트랩 (Trap)내부 요청 (시스템 콜 등)동기가능다음 인스트럭션
폴트 (Fault)내부 오류 (페이지 폴트 등)동기재시도 가능현재 인스트럭션 재시작
어보트 (Abort)심각한 내부 오류동기불가능프로그램 종료

예외적인 제어 흐름은 단순한 오류처리는 아닌 것 같고, 입출력 처리나 CPU가 어떻게 여러가지 프로세스를 동시에 실행하는 것 처럼 보이게 하는지 알려준다.

특히 트랩과 폴트는 우리가 작성하는 일반적인 프로그램에서도 자주 사용되는 개념이기 때문에, 이를 명확하게 구분하고 이해하는 것이 중요하다.

이 예외 처리 메커니즘을 활용한 프로세스 간 전환(context switching), 시그널 처리, 그리고 프로세스 생성(fork) 등의 내용으로 이어지는데, 그거는 다음에 따로 포스팅해볼게용가리

1개의 댓글

comment-user-thumbnail
2025년 6월 24일

용가리치킨

답글 달기