2023. 9. 14. 20:24ㆍ컴퓨터구조와 운영체제
아마 이 포스팅의 제목을 보고 "인터럽트가 발생한다"라는 문장에서 아래와 같은 점들이 궁금했을 것이다.
첫째로, 인터럽트란 무엇인가?
둘째로, 인터럽트는 어디에서 발생하는 것인가?
인터럽트가 뭐야?
인터럽트란 컴퓨터가 작업을 수행하던 도중 예기치 못한 특수한 상황이 발생하여 작업을 중단하고, 특수한 상황을 먼저 처리한 후 원래의 작업으로 되돌아가 나머지 작업을 계속 수행하게 되는 일련의 과정이다.
필자는 인터럽트의 개념에서 3가지가 궁금했다.
첫째로, 특수한 상황은 무엇일까??
둘째로, 원래의 작업으로는 어떻게 되돌아가는 것일까??
마지막으로, 인터럽트가 발생하고 처리하는 일련의 과정의 순서는 어떻게 되는 거야??
특수한 상황
"특수한 상황은 무엇일까??" 이 질문은 필자가 처음에 궁금해했던 인터럽트는 "어디에서 발생하는 것일까?"라는 의문과 이어지는 질문인 것 같다.
인터럽트는 CPU에서 발생할 수도 있고, 외부 장치(주로 입출력 장치) 아니면 정전과 같이 외부 환경 등에서 발생할 수 있다.
- CPU에서 발생하는 인터럽트
이를 동기 인터럽트(예외)라고 한다.
CPU가 예기치 못한 상황을 접했을 때 발생하는 인터럽트이다.
- 외부 장치에서 발생하는 인터럽트
이를 비동기 인터럽트(하드웨어 인터럽트)라고 한다.
주로 입출력장치에서 발생하는 데, 입출력 장치가 CPU에게 보내는 알림이라고 생각하면 편하다.
여기서 궁금한 점이 하나 생겼다.
왜 입출력 장치가 CPU에게 인터럽트를 보내야할 까? CPU가 입출력 장치가 일을 다 했는 지 확인하면 안 되는 것인가?
이를 알기 위해서는 입출력 장치는 CPU에 비해 느리다는 사실을 알고있어야한다.
CPU가 입출력 장치에비해 훨~씬 빠르기 때문에 만약 CPU가 입출력 장치가 일을 다 했는 지 확인하다면 CPU는 계속 확인해야할 것이다. 아래 그림처럼 말이다.
리소스 낭비...
따라서, "입출력 장치가 CPU에게 일을 다 했습니다" 라고 알림을 보내는 게 더 효율적인 것이다.
정리하자면, 인터럽트는 CPU에서 발생하는 것(동기 인터럽트)과 외부 장치에서 발생(비동기 인터럽트)하는 것으로 나눌 수 있습니다.
원래의 작업으로는 어떻게 돌아가는 걸까??
인터럽트가 발생한 뒤에 원래 하고 있던 작업으로 돌아간다고 했다.
그렇다면, 원래 하고 있던 작업에 대한 정보들이 어딘가에는 저장되어있어야 한다.
이러한 정보들을 저장해두는 곳을 PCB(Process Control Block)이라고 한다.
PCB에는 인터럽트가 발생한 시점의 레지스터와 PC(Program counter : 다음번에 실행할 명령어의 주소) 등을 저장한다.
인터럽트발생 시 CPU의 처리 순서
인터럽트 발생시 부터 CPU가 이를 어떻게 처리하는 지를 다뤄보겠습니다.
- 입출력장치는 CPU에 인터럽트 요청신호를 보낸다.
- CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.
- CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들 일 수 있는 지 여부를 확인한다.
- 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업한다.
- CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.
- 인터럽트 서비스 루틴 실행이 끝나면 4번에서 백업해 둔 작업을 복구하여 실행을 재개한다.
1번
인터럽트 요청 주체(입출력장치)는 CPU에게 인터럽트 요청 신호를 보낸다.
1번의 이유에 대해서는 위의 "특수한 상황" 의문에서 어느정도 다뤘다.
2번, 3번
CPU는 명령어 사이클이 끝나고 인터럽트 여부를 확인하고, 인터럽트가 발생했다면 인터럽트 플래그를 확인하여 인터럽트를 받아들일 수 있는 지 확인해야한다.[인터럽트 사이클]
4번
CPU는 지금까지 해왔던 작업들을 PCB에 저장해둔다.
이에대해서는 "원래의 작업으로 어떻게 돌아가는 걸까?" 의문에서 다뤘다.
5번, 6번
인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.
일단, 인터럽트 서비스 루틴(Interrupt Service Routine)이란 인터럽트가 발생 시 해당 인터럽트를 처리하는 방법이다.
여기서 알 수 있는 것은 어떤 인터럽트가 발생하느냐에따라서 그 인터럽트를 처리하는 방법이 다 다르다는 것이다.
이에 대한 정보는 아래와 같이 메모리에 저장되어 있다.
하지만, 인터럽트 서비스 루틴을 실행하려면 어떤 인터럽트가 인터럽트 서비스 루틴에 대응되는 지 그리고 인터럽트 서비스 루틴이 저장되어 있는 메모리 주소는 어디인지를 알아야한다.
이에 대한 정보는 인터럽트 벡터 테이블에 저장되어있다. (인터럽트 벡터는 인터럽트 시작 주소에 대한 정보를 가지고 있다.)
인터럽트 서비스 루틴을 실행한다는 것은 인터럽트 서비스 루틴을 실행하고 본래 수행하던 작업으로 되돌아간다.
아래 그림은 인터럽트가 발생할 때와 발생하지 않을 때 프로그램이 실행되는 것을 그림으로 나타내는 것이다.
이상입니다!!
'컴퓨터구조와 운영체제' 카테고리의 다른 글
CPU의 성능에 영향을 끼치는 것들 (0) | 2023.09.19 |
---|---|
명령어 사이클을 통해 CPU 동작 원리 및 뼈대 잡기 (0) | 2023.09.10 |
컴퓨터 구조의 큰 그림을 그려보자 (2) | 2023.09.03 |
쓰레드란?? (0) | 2023.04.07 |
운영체제란? (0) | 2023.03.18 |