본문 바로가기
정글

TIL(19일차) 예외흐름 제어

by 진득한진드기 2023. 5. 13.

프로그래밍을 하다보면 예외에 대한 처리를 하는데 한번씩 이 예외들은 안에서 어떻게 처리가 될까?

 

문득 궁금했던 적이 있었다.

 

간단하게 글로보면 예외상황이 나오면 다른 행동을 하게 시키는 것이지만 막상 컴퓨터 내부에서는 그리 말처럼 쉽게 돌아가지는 않는다.

 

예외 상황은 하드웨어와 운영체제에 의해서 구현된 예외적인 제어흐름의 한 가지 형태인데,

 

부분적으로 하드웨어로 구현되어 있다.

 

 

예외상황

 

우리가 어떤 App을 사용하면서 무난하게 PC가 작동한다고 가정해보자.

 

프로세서는 현재 어떤 명령어 인스트럭션(I cur)을 실행하고 있을때, 프로세서 상태에 중요한 변화가 일어나고 있다.

 

이 상태(State)는 프로세서 내 다양한 비트들과 신호들로 인코드되는데,

 

이런 상태의 변화를 이벤트(Event)라고한다.

 

이벤트는 현재 인스트럭션(I cur)에 직접적으로 관련이 있을 수도 있고 없을 수도 있는데 연관이 있는 예로 페이지 오류, 산술 오버플로우 0나누기 등이 있고,

 

없는 예로 시스템 타이머 정지나 I/O 요청이 있다.

 

뭐 어떤 경우든 프로세서는 이벤트가 발생했다는걸 감지하면, 예외 테이블(점프 테이블)을 통해서 

 

이런 특정 이벤트를 처리하기 위해 설계된 서브루틴(예외처리 핸들러)으로 간접 프로시저를 부른다.

 

그러면 저 서브루틴에서는 3개중 1가지 일이 발생하는데,

 

1. 핸들러 제어를 현재로 돌려주거나

2. 제어를 돌려주는데 다음 인스트럭션에 돌려주거나

3. 핸들러가 프로그램을 종료하거나

 

예외상황의 분간은 예외 상황의 종류마다 중복없는 정수번호를 할당한다.

 

시스템 부팅시 전원이 공급될 때 운영체제는 예외 테이블(점프 테이블)을 할당하고 초기화해서 개체 K의 예외상황 k 에 대한 핸들러의 주소를 가지게 된다.

 

점프 테이블

 

그러면 실행중에 이벤트가 발생하는것을 감지하면 대응되는 예외번호 k를 결정하고, 프로세서가 후에 예외 테이블의 엔트리 K를 통해서 간접 프로시저 콜을 하는 방법을 사용해 예외 상황을 발생시킨다.

 

테이블의 시작주소는 예외 테이블 베이스 레지스터라는 특별한 CPU 레지스터에 저장되어 있는데,

 

슬쩍 보면 프로시저 콜 과 유사해보이지만 차이점이 있다.

 

프로시저 콜과의 차이점 

 

1. 프로세서는 프로시저 콜을 사용해서 핸들러로 분기전에 스택에 리턴주소를 푸시한다.

2. 프로세서는 중단된 프로그램을 다시 시작하기 위해 필요하게 될 스택 상에 추가적인 프로세서 상태(State)를 푸시한다.

3. 제어가 사용자에서 커널로 전환할 때,사용자 스택 위가 아니라 커널 스택 상에 푸시된다.

4. 예외 핸들러는 커널 모드에서 돌아가는데, 모든 시스템 자원에 완전히 접근 가능

 

 

 

예외의 종류

 

예외 상황은 4가지로 나누는데,

 

1. 인터럽트(interuppt)

2. 트랩(trap)

3. 오류(Fault)

4. 중단(Abort)

 

 

인터럽트란

 

인터럽트는 프로세서 외부에 있는 입출력 디바이스의 시그널의 결과이며, 비동기적으로 발생한다.

 

항상 다음 인스트럭션을 반환한다.

 

 

트랩 and 시스템콜

 

트랩은 의도적인 예외상황이고, 인트럽트 핸들러와 마찬가지로 트랩은 다음 인스트럭션(I next)로 리턴한다.

 

트랩의 가장 중요한 사용은 시스템 콜이라고 하는 사용자와 커널 사이 프로시저와 유사한 인터페이스를 제공하는것이다.

 

사용자의 파일을 읽거나(read) 만들거나(fork) 새 프로그램을 로드하거나(execve) 현재 프로그램을 종료하는 등의 서비스를 종종 커널에서 요청할 필요가 있다.

 

오류

 

오류가 발생하면 프로세서는 제어를 오류 핸들러로 이동해준다.

 

제어를 오류 발생 시킨 인스트럭션으로 돌려줘서 거기서부터 재실행한다.

 

만약 그렇지 저 행동이 안된다면 abort루틴으로 리턴해서 오류를 발생시킨 application을 종료한다.

 

 

중단 

보통 DRAM이나 SRAM이 고장날 때 발생하는 패리티 에러와 하드웨어 같은 복구할 수 없는 에러에서 발생한다.

 

리턴을 하지 않는 것이 특징이다.

 

 

 

'정글' 카테고리의 다른 글

TIL(21일차) 메모리 할당기 제작 기초  (1) 2023.05.17
TIL(20일차) 동적 메모리 할당  (0) 2023.05.14
WIL (RB트리 vs AVL트리)  (1) 2023.05.11
TIL(18일차) RB트리 삭제  (0) 2023.05.10
TIL(17일차) 레드블랙트리 삽입  (0) 2023.05.08