안녕하세요 오늘은 인터럽트에 대해서 알아보겠습니다.
여기 선생님이 계십니다. 이 선생님을 CPU라고 생각해봅시다. 이 선생님이 칠판에서 열심히 수업을 하고 있었는데
중간에 학생이 질문이 있다고하면서 선생님의 수업을 끊게됩니다. 선생님의 수업을 방해한 이게 바로 인터럽트입니다.
내부와 외부
차단가능 인터럽트와 차단불가 인터럽트
조사형와 벡터형
이렇게 나눠지게 됩니다.
오늘은 가장 일반적인 내부와 외부로 나눠서 분류를 해보겠습니다.
내부와 외부 그 아래로는 하드웨어, 프로그램, 타이머, I/O가 있습니다.
먼저 내부먼저 살펴보게되면 하드웨어는 말그대로 하드웨어적 결함으로 인터럽트가 발생합니다. 예를 들어서 컴퓨터 고장, 전원이 나간 경우 등이있고 프로그램은 0으로 나눈다던가 여러가지 문법적 에러를 포함해서 프로그램이라고 지칭했습니다
외부는 타이머 먼저 보면 타이머가 일정한 시간 간격으로 중앙처리장치에게 인터럽트를 요청하는 것이고 I/O은 입출력 준비가 완료되었음을 알리기위해 인터럽트를 요청하게 됩니다.
인터럽트의 처리 과정을 알아보자면 위의 그림을 보면 쉽게 이해할 수 있습니다.
아까 선생님이 수업을 하고 있었습니다. 그리고 중간에 학생이 질문을 하면서 인터럽트가 발생한 것까지 했습니다.
이제 아까의 처리과정을 토대로 질문을 처리해볼 것 입니다.
1. 인터럽트 발생
첫번째로 선생님이 swift란 무엇인가라고하면서 수업을 진행하고 있었습니다. 여기서 학생일 질문을 하면 말했듯이 인터럽트가 발생하게 됩니다.
2. 프로그램 중단 및 상태보관
수업을 하다가 중간에 끊겼으니 진행 중이던 수업을 중단하고 지금 수업 상태를 기억 속에 저장하게 됩니다. 실제로는 실행 중이었던 프로세스를 중단하고 PC 상태를 스택에 저장합니다. 현재 진행중이 프로그램의 레지스터들도 따로 저장합니다. 이것이 2단계 프로그램 중단 및 상태보관입니다.
3. 인터럽트 처리와 수행
이제 학생의 질문을 받아들여 질문에 대한 답을 해주면서 인터럽트에 대한 처리와 수행을하게 됩니다. 여기서 아까 언급했던 인터럽트 서비스 루틴에 대해서 말해볼건데, 이게 가장 핵심적인 내용입니다. 인터럽트 서비스 루틴이란 어떤 소스(source)가 인터럽트 요청을 하면 반복적으로 수행하는 일이 있다는 뜻입니다. 다른 말로 인터럽트 핸들러(interrupt handler)라고도 합니다.
이 표는 인터럽트 백터 테이블인데 인터럽트가 발생하였을 때 해야할 일이 무엇인가를 정해놓은 것으로 인터럽트 서비스 루틴의 시작주소 입니다. 여길 보면 어떤 인터럽트가 발생했는지 알 수 있습니다. 아까 인터럽트 서비스 루틴을 3단계인 인터럽트 처리와 수행에서 가장 중요한 역할을 한다고 했습니다. 왜냐면 이 인터럽트 백터 테이블에서 인터럽트 서비스 루틴(ISR) 주소값을 얻게 되기 때문입니다. 주소값을 얻어 루틴을 실행하게 됩니다.
4. 프로그램 상태 복구 및 재실행
마지막으로 인터럽트 처리를 모두 했으니 스택에 저장했던 저장된 PC 값을 복원하여 이전 실행 위치로 복원하게 되면서 일시정지되었던 수업을 재개할 수 있습니다. 이게 4단계 프로그램 상태 복구 및 재실행입니다.
첫번째는 CPU가 인터럽트 서비스 루틴을 처리하는 중에 새로운 인터럽트가 들어오더라도 수행중인 인터럽트 서비스 루틴이 끝날 때 까지 새로운 인터럽트 사이클을 수행하지 않도록 하는것이고(마치 인터럽트 불가능 상태와 같습니다.)
두번째는 인터럽트 간의 우선순위를 정하고, 우선순위가 낮은 인터럽트를 처리하는 중에 우선순위가 높은 인터럽트가 발생한다면, 현재 수행중인 명령어를 멈춰두고, 새로운 인터럽트를 먼저 처리하도록 하는 것입니다.