예외처리 #1 [CSAPP Chap 8]

예외, 프로세스, 시그널 순으로 알아본다.


예외

예외는 CPU가 정상적인 프로그램 실행 흐름을 벗어나 미리 정해진 운영체제 코드를 실행하도록 만드는 사건이다. 프로세서 상태에 어떤 변화가 생겼을 때 발생하곤 한다. 이 예외를 처리하고 나면, 원래 프로그램으로 돌아가거나 프로그램을 종료하는 결과가 된다.

인터럽트, 트랩, 오류, 중단 네 가지로 구성된다.

 

 

인터럽트

인터럽트는 비동기적이다. 다시 말해 현재 실행 중인 명령어와는 상관없이, 프로세서 외부의 I/O 장치 등에서 보내는 신호 때문에 발생한다. 키보드와 마우스도 흔한 인터럽트 신호 중 하나이다.

인터럽트가 발생하면, CPU는 현재 하던 일을 잠시 멈추고 운영체제 내의 인터럽트 처리 루틴으로 점프해서 해당 입력을 처리한다. 그리고 처리가 끝나면, 원래 하던 일로 다시 돌아와서 중단되었던 바로 다음 명령어부터 실행을 이어가게 된다.

이런 인터럽트 덕분에 CPU는 키보드 입력이 있을 때까지 아무것도 안하고 기다릴 필요 없이, 다른 작업을 하다가 필요할 때만 입력을 처리 할 수 있게 되었다.

또, 랜포트에 데이터 패킷이 도착하는 상황도 인터럽트의 핵심적인 특징을 잘 확인해볼 수 있다 :

  1. 비동기성 : 프로그램이 무엇을 하고 있든, 패킷은 언제 도착할지 예측 할 수 없이 외부로부터 발생한다.
  2. 외부 발생 : 실행 중인 프로그램이 아닌, 네트워크 카드라는 I/O 장치가 신호의 근원이다.

그렇다면, 인터럽트가 발생 했을 때 인터럽트 당한 작업의 내용을 직접 변경하는 일도 있을 수 있을까?
NO. 인터럽트로 인한 내용은 Context Switch로 인해 나름대로 보호된다. Context Switch는 후술 한다.

 

 

트랩

트랩은 인터럽트와 달리 동기적으로 발생한다. 즉, 현재 실행 중인 명령어의 직접적인 결과로 발생하는 ‘의도적인’ 예외이다. 대표적인 예는 시스템 콜로, 프로그램이 파일을 읽거나, 화면에 글자를 출력하는 등 커널의 도움이 필요한 작업을 요청 할 때 발생한다.

그렇다면 트랩이 처리 된 후에는 프로그램의 실행은 어디서 다시 재개될까? 사실 인터럽트와 별반 다르지 않다. 시스템 콜을 발생시킨 명령어는 그 자체로 하나의 완결된 작업으로 취급되기 때문이다. 프로그램 입장에서 보면, “운영체제에게 파일 읽기 요청”과 같은 명령어를 실행 한 것이고 운영체제가 해당 요청을 마치면 자연스럽게 다음 순서의 명령어를 실행하는 것이다.

인터럽트와 트랩은 다음 명령어로 복귀한다는 점에서 같지만 의도적인지 아닌지에 따라 구분된다고 할 수 있다.

 

 

오류

오류는 현재 실행 중인 명령어가 어떤 문제를 일으켰지만 운영체제의 해결 여지를 둔 상태를 말한다. 동기적으로 발생하는데, 의도된 것은 아니라는 점에서 차이가 있다.

페이지 폴트는 이 오류 면에서 가장 대표적인 예시이다. 프로그램이 메모리에 있는 데이터에 접근하려고 했는데, 알고 보니 그 데이터가 아직 물리 메모리에 없고 하드디스크에 있을 때 이 오류가 발생한다.

이 상황에서 운영체제는 다음과 같이 대응 할 수 있다 :

  1. 프로그램 실행을 잠시 멈추고, 페이지 폴트 핸들러를 실행한다.
  2. 디스크에서 필요한 데이터를 찾아 물리 메모리로 가져온다.
  3. 데이터를 메모리로 가져왔으니, 이제 원래 프로그램이 하던 일을 계속하게 해줘야한다.

운영체제가 성공적으로 오류를 처리했다면 프로그램은 오류를 일으켰던 방금의 명령어부터 다시 실행한다.

페이지 폴트는 치명적인 오류라기 보단 실행에 필요한 준비가 아직 안 된 상태가 더 맞는 표현이다. 운영체제가 그 준비를 완료하면 실패했던 바로 그 명령어가 성공 할 수 있게 되었으니 다시 실행하는 것이다.

 

 

중단

중단은 회복이 불가능한 치명적인 하드웨어 오류가 발생 했을 때 일어나는 에외이다. 메모리 칩에 물리적인 오류가 생겨 데이터에 오류가 발생하는 Parity Error가 대표적이다.

이런 오류는 운영체제가 어떻게 손을 쓸 수 있는 수준이 아니다. 따라서 중단 예외 핸들러가 실행되면 이 핸들러는 원래 프로그램으로 제어를 되돌려 주지 않는다. 시스템 상태를 저장하고 진단 정보를 남긴 뒤 프로그램이 강제 종료된다.

 

 

Word를 켜놓고 4가지 예외의 시연을 설명해본다.

  • 250페이지로 스크롤을 내림 : 오류
    • 프로그램이 250페이지의 데이터가 담긴 메모리 주소에 접근하려고 한다. 하지만 운영체제는 메모리 절약을 위해 그 부분을 이미 디스크로 내려놓은 상태이다. 페이지 폴트가 발생하게 된다.
    • 운영체제는 프로그램을 멈추고 250페이지에 해당하는 내용을 RAM으로 가져온다. 오류를 일으켰던 바로 그 읽기 명령을 다시 실행시키게 되고, 이제는 데이터가 RAM에 있으니 명령이 성공하고 250페이지의 내용을 사용자가 확인 할 수 있다.
  • 1분 단위의 ‘자동 저장 기능’ : 인터럽트
    • 프로그램의 코드와는 전혀 상관없이, 외부의 하드웨어 타이머 칩이 CPU에 “1분 단위 경과”라는 신호를 보낸다. 이는 비동기적으로 발생한 이벤트이다.
    • CPU는 하는 일을 멈추고 운영체제의 타이머 인터럽트 핸들러를 실행한다. 핸들러는 ‘자동 저장 실시’ 표시를 남기고 기존 프로그램의 다음 명령어로 돌아간다.
  • ‘자동 저장 기능’을 위한 하드디스크 쓰기 : 트랩
    • 프로그램은 디스크에 직접 접근할 권한이 없다. 그래서 운영체제에게 “이 데이터를 파일에 쓰기” 에 대응하는 시스템 콜을 의도적으로 호출한다.
    • 운영체제는 요청을 받아 디스크에 데이터를 쓰는 작업을 안전하게 처리한다. 작업이 끝나면, 제어권을 프로그램의 시스템 콜 다음 명령어로 넘긴다.
  • 운영체제가 디스크에 쓰고 있는 와중에, RAM이 실제로 망가져 있어 오류 검출 비트에 불일치가 발생했다 : 중단
    • 소프트웨어로 해결 될 수 없는 치명적 오류로 인해 운영체제 중단 핸들러가 실행된다.
    • 이 오류는 복구가 불가능하므로, 블루 스크린이나 커널 패닉을 내고 프로그램을 강제 종료하게 된다.

 

'컴퓨터 이론 > CS:APP' 카테고리의 다른 글

예외처리 #3 [CSAPP Chap 8]  (0) 2025.10.20
예외처리 #2 [CSAPP Chap 8]  (0) 2025.10.20
링커 #2 [CSAPP Chap 7]  (0) 2025.10.20
링커 다루기 [CSAPP Chap 7]  (0) 2025.10.20
Input Cash to get Cache [CSAPP Chap 6]  (4) 2025.09.01