컴퓨터 시스템/CSAPP

예외적인 제어 흐름

bewisesh91 2021. 12. 23. 00:11
728x90

프로그램 카운터는 프로세서가 동작하는 동안에 아래와 같이 개별 인스트럭션에 대응되는 주소들을 연속된 값들로 가정한다. 

 

이때, 특정 인스트럭션 주소에서 특정 인스트럭션 주소로의 전환을 제어 이동이라 부른다. 그리고 이러한 일련의 제어 이동 시퀀스를

제어 흐름이라고 부른다. 가장 간단한 유형의 제어 흐름은 "점진적"이다. 각각의 인스트럭션이 메모리에서 나란히 있는 경우다. 

그런데 시스템의 상태 변화에 따라 제어 흐름의 갑작스러운 변화를 만들어야 하는 경우가 발생한다. 이와 같은 급격한 변화를 예외적인

제어 흐름이라고 부른다. 이러한 예외적인 제외 흐름은 컴퓨터 시스템의 모든 수준에서 발생한다(예를 들어, 하드웨어 수준에서 여러

입력 장치가 이벤트들을 발생시키거나, 시스템 소프트웨어 수준에서 문맥 전환이 발생하거나, 응용 소프트웨어 수준에서 제어를

변경하는 시그널을 보내는 등)

 

예외 상황

예외 상황은 부분적으로는 하드웨어와 운영 체제에 의해서 구현된 예외적인 제어 흐름의 한 가지 형태다. 예외 상황은 어떤 프로세서 

상태 변화에 대한 대응으로 이러한 상태 변화를 이벤트라 부른다. 이 이벤트는 현재 인스트럭션의 실행과 직접적으로 관련이 있을 수도

관련이 없을 수도 있다. 어느 경우이든지 프로세서가 이벤트가 발생했다는 것을 감지하면, 특정 종류의 이벤트를 처리하기 위하여

예외 처리 핸들러로 프로시저 콜을 하게 된다. 

 

예외 처리

한 시스템 내에서 가능한 예외 상황 종류마다 중복되지 않는 양의 정수를 예외 번호로 할당하고 있다. 이러한 예외 번호는 프로세서 

설계자와 운영체제 설계자가 할당한다. 시스템 부팅 시, 운영 체제는 예외 테이블을 만든다. 이때, 테이블의 엔트리 K는 예외 K에 대한

핸들러 코드 주소를 갖는다. 따라서 프로세서가 이벤트가 발생했다는 것을 감지하고 해당 이벤트에 대응되는 번호 K를 결정하면, 

예외 테이블에서 그 번호를 인덱스로 이용하여 프로시저 콜을 진행하는 것이다. 

 

 

예외의 종류

예외 상황은 인터럽트, 트랩, 오류, 중단, 네 가지 종류로 구분할 수 있다. 인터럽트는 프로세서 외부에 있는 입출력 디바이스로부터의 

시그널의 결과로 비동기적으로 발생한다. 네트워크 어댑터, 디스크 컨트롤러, 타이머 칩 같은 하드웨어들은 프로세서 칩의 핀에 시그널을

보내면서 인터럽트를 발생시킨다. 이 같은 하드웨어 인터럽트는 특정 인스트럭션을 실행해서 발생한 것이 아니기에 비동기적이다.

트랩은 의도적인 예외 상황으로 어떤 인스트럭션을 실행한 결과로 발생한다. 예를 들어, 인스트럭션의 결과로 파일을 읽거나, 새 프로세스를 만들거나, 혹은 현재 프로세스를 종료하는 등의 서비스를 커널에게 요쳥할 필요가 발생할 수 있다. 이때, 프로그램은 시스템 콜을 요청하여

예외 상황을 발생시킨다.

 

오류는 핸들러가 정정할 수 있을 가능성이 있는 에러 조건으로부터 발생한다. 오류가 발생하면 프로세서는 제어를 오류 핸들러로

이동시킨다. 오류의 대표적인 예는 인스트럭션이 가상메모리 테이블을 참조했을 때 대응되는 실제 메모리 페이지가 존재하지 않는

페이지 오류가 있다. 중단은 DRAM이나 SRAM이 고장날 때 발생하는 패리티 에러와 같은 대개 복구할 수 없는 치명적인 에러로부터

발생한다.