컴퓨터(Computer Science)/컴퓨터구조(Computer Arichitecture)

Exception & Interrupt, 예외 처리 [컴퓨터구조]

게임이 더 좋아 2021. 6. 19. 21:08
반응형
728x170

 

우리는 우리가 설계한 대로 굴러가길 바라지만

항상 세상은 뭔가 예외를 만든다.

 

여기에도 예외를 만든다.

알아보자

 


 

차에 기름이 부족하면 주유소에 멈추어서 기름을 넣고 간다.

그렇다면 우리 파이프라인에 문제가 생기면 그냥 무시하고 가나??

멈춰서 문제 해결을 하고 가야한다.

 

 

 


 

도대체 실행중인 프로세서를 어떻게 멈추게 하고 문제를 해결할 것인가?

설계 다음으로 중요해졌다.

 

 

 

바로 예상치 못한 event 라는 것이 발생한다.

 

다시 말해서

Exception, Interrupt를 발생시킨다.

 

Exception은 CPU 내부에서 발생하고 undefined 된 코드나 overflow 등등이 원인이다.

 

Interrupt는 외부 I/O에 의해서 발생한다. (외부 장치에 의함, Hardware)

**Software에서도 Interrupt를 발생시키는데 이것은 Trap이라고 따로 구분해준다.

-> 명령어로 Interrupt를 발생시키는 것

 

Exception이 발생하는 이유는 많다.

 

 


 

하지만 우리는 이것을 그냥 지켜보는 것이 아니라

처리를 해줘야 한다.

Handling을 통해 프로세서 성능이 낮아지지 않도록 해야한다.

 

 

MIPS에서는 System Control Coprocessor가 담당한다.

 

Handler가  처리하는 방식은 아래와 같다.

 

1. 일단 Exception이 일어난 PC(해당 Instruction의) 를 저장한다. -> EPC에 저장

 

2. Handling 할 수 있는 OS에 제어를 넘긴다. -> 이 OS는 각 문제별로 address 지정되어 있다.

(일반적으로 Vectored Interrupt라서 interrupt에 따른 handler가 존재)

 

3. OS가 문제에 따른 적절한 조치를 취하고 EPC에 저장된 주소를 활용해

insterrupt된 프로그램으로 돌아가는 등

후 작업을 결정한다.

 

++해결이 되지 않으면 프로그램을 종료하고 error를 report한다.

 

 

**위에와 반대로 Non-vectored Exception도 있는데 얘는

모든 interrupt에 대해 하나의 handler가 모두 처리하는 것을 의미한다.

 


 

실제 우리가 pipeline에 적용한다면 어떻게 되는지 보자

 

사실 exception은 Control Hazard의 일종이다.

 

 

overflow같은 Exception 상황이 발생한 경우

위와 같은 과정을 통해 Handler로 제어가 넘어간다.

 

Dapapath는 이렇다.

 

 


 

예를 들어서보자

 

 

4c에서 exception이 발생됐다면

해당 이전까지의 instruction은 다 complete하고

이후의 instruction은 flush 해야한다.

 

 

그 다음 클럭은 이렇게 된다.

 

 

앞에 SW 명령어가 온다.

Handler가 실행하는 것이다.

 


 

어렵지 않은 것 같은데?

근데 만약 다중 Exception 발생하면 어떨까?

현재의 EX, 다음 instruction의 ID, 다다음의 IF  과연 어떻게 될까??'

 

 

파이프라인 단계가 많아질수록 당연히 exception도 많이 발생할 수 있다.

 

 

간단하게 가장 먼저 실행된 instruction만 남기고 다 flush 시킬 수도 있다.

**precise란 원인이 명확히 무엇인지 알 수 있는 exception을 말한다.

 

당연히 가장 먼저 실행된 instruction부터 하니까 원인을 알 수 있는 것이다.

 

하지만 요즘에는 파이프라인이 complex화 되고 있다.

여러 개의 instruction을 한 싸이클에 실행하며

명령어 수행 순서에 대해 알 수가 없다.(out of order)

 

이 경우에가 Imprecise exception을 뱉는다.

 

 

파이프라인을 멈추고 현재 상태를 저장한다.

핸들러가 동작한다.

어떤 것이 exception이 발생했고 어떤 명령어들이 flush가 될 것이고 complete될 것인지 정한다.

 

하드웨어는 간단하지만 소프트웨어가 복잡하게 설계되어있다.

때문에 파이프라인에서 지양하면서도 지향해야 한다.

 

즉, 빠르게 처리하기 위해선 순서도 없고 여러개 씩 실행되어야 하지만

그렇다고 명확하게 exception을 모른다면 해결할 수가 없다.

그래서 요즘은 섞어서 사용한다고 한다.

 

반응형
그리드형