인터럽트
''' Interrupt'''
인터럽트란 CPU가 특정 기능을 수행하는 도중에 급하게 다른 일을 처리하고자 할 때 사용할 수 있는 기능이다.
대부분의 컴퓨터는 한 개의 CPU를 사용하므로 한 순간에는 하나의 일 밖에 처리할 수 없기 때문에 [1] 어떤 일을 처리하는 도중에 우선 순위가 급한 일을 처리할 필요[2] 가 있을 때 대처할 수 있는 방안이 필요하다.
예를 들면, 키보드의 키를 하나 누르면, 눌려진 키 코드 값이 키보드 버퍼에 입력된 후 CPU에 인터럽트가 걸린다. 그럼 현재 처리하던 작업에 대한 정보를 수집하여 저장한 뒤에 인터럽트 서비스 루틴(Interrupt Service Routine)을 수행한다.(이 경우에는 키보드 버퍼에 있는 키 코드 값을 가져가는 일을 한다.) 이렇게 인터럽트 처리를 마친 후에는 다시 이전에 처리하던 작업으로 돌아간다.
이제 이런 인터럽트의 처리 과정을 간단하게 정리해서 설명하면 다음과 같다.
이렇게 인터럽트가 한 개씩만 실행되면 참 좋겠지만 여러 인터럽트가 동시에 발생하는 경우는 많이 존재한다. 이 때 한 개의 CPU인 상황이라면 동시에 여러 개의 인터럽트가 발생한다면 우선 순위를 정해서 순차적으로 처리해야 한다. 이를 인터럽트 우선 순위라 하고 이런 우선 순위는 아래와 같이 중요하고 심각한 인터럽트가 우선적으로 처리되어야 한다.
이렇게 많은 인터럽트의 우선 순위를 정렬하기 위해서 소프트웨어적인 방법과 하드웨어적 방법이 있다.
소프트웨어적인 방법으로는 폴링 등이있다.
하드웨어적인 방법은 벡터 인터럽트(Vectored Interrupt)라고도 불린다. 하드웨어적 방법은 인터럽트를 요청할 수 있는 장치에 버스를 직렬 또는 병렬로 연결해 인터럽트 요청 자치의 번호를 CPU에게 알리는 방식이다.
인터럽트는 다양한 종류가 있다. 일반적으로 사용되는 인터럽트는 두가지 갈래로 나뉠 수 있는데,
1. 개요
인터럽트란 CPU가 특정 기능을 수행하는 도중에 급하게 다른 일을 처리하고자 할 때 사용할 수 있는 기능이다.
2. 상세
대부분의 컴퓨터는 한 개의 CPU를 사용하므로 한 순간에는 하나의 일 밖에 처리할 수 없기 때문에 [1] 어떤 일을 처리하는 도중에 우선 순위가 급한 일을 처리할 필요[2] 가 있을 때 대처할 수 있는 방안이 필요하다.
예를 들면, 키보드의 키를 하나 누르면, 눌려진 키 코드 값이 키보드 버퍼에 입력된 후 CPU에 인터럽트가 걸린다. 그럼 현재 처리하던 작업에 대한 정보를 수집하여 저장한 뒤에 인터럽트 서비스 루틴(Interrupt Service Routine)을 수행한다.(이 경우에는 키보드 버퍼에 있는 키 코드 값을 가져가는 일을 한다.) 이렇게 인터럽트 처리를 마친 후에는 다시 이전에 처리하던 작업으로 돌아간다.
3. 과정
이제 이런 인터럽트의 처리 과정을 간단하게 정리해서 설명하면 다음과 같다.
- 기존의 작업을 처리하던 도중, 인터럽트가 발생하면
- 현재 컴퓨터가 처리하는 일을 중지하고 현재의 컴퓨터의 상태(CPU 내부의 레지스터, 메인 메모리 내용 등을) 저장한다.
- 해당하는 인터럽트를 처리해주기 위한 인터럽트 서비스 루틴을 처리한다.
- 인터럽트 처리 이후 저장되었던 이전 작업의 상태를 복구하고 이전 작업 수행을 재개한다.
3.1. 인터럽트 우선 순위
이렇게 인터럽트가 한 개씩만 실행되면 참 좋겠지만 여러 인터럽트가 동시에 발생하는 경우는 많이 존재한다. 이 때 한 개의 CPU인 상황이라면 동시에 여러 개의 인터럽트가 발생한다면 우선 순위를 정해서 순차적으로 처리해야 한다. 이를 인터럽트 우선 순위라 하고 이런 우선 순위는 아래와 같이 중요하고 심각한 인터럽트가 우선적으로 처리되어야 한다.
- 전원 공급의 이상
- CPU의 기계적인 오류
- 외부 신호에 의한 인터럽트
- 입출력 전송 요청 및 전송 완료, 전송 오류
- 프로그램 검사 인터럽트
- 수퍼바이저 호출(SVC 인터럽트)
3.1.1. 정렬 방법
이렇게 많은 인터럽트의 우선 순위를 정렬하기 위해서 소프트웨어적인 방법과 하드웨어적 방법이 있다.
3.1.1.1. 소프트웨어적 방법
소프트웨어적인 방법으로는 폴링 등이있다.
- 폴링
폴링은 CPU가 모든 제어기에 연결된 TEST I/O 선을 이용해 인터럽트를 요청한 장치를 검사하는 방식이다.
즉 INTR(INTerrupt Request)선에 올린 요청 플래그를 차례로 검사해서, 이에 해당하는 인터럽트 서비스 루팅을 수행하는 소프트웨어적인 방식이다. 이방식은 하드웨어를 추가할 필요가 없어 회로가 간단하지만 검사할 때의 CPU 자원이 필요해 반응 시간이 느리다는 단점이 있다.
3.1.1.2. 하드웨어적 방법
하드웨어적인 방법은 벡터 인터럽트(Vectored Interrupt)라고도 불린다. 하드웨어적 방법은 인터럽트를 요청할 수 있는 장치에 버스를 직렬 또는 병렬로 연결해 인터럽트 요청 자치의 번호를 CPU에게 알리는 방식이다.
- 직렬 연결 방식
데이지 체인이라고도 불린다.[3] 어디에 인터럽트가 발생했는지 확인하는 회로를 직렬로 연결하는 하드웨어적 방법으로 INTR, INTA 선에 장치들을 우선순위에 따라 순서대로 연결하는 방식이라 다른 방법에 비해 구성이 간단하다. 그러나 그 단순한 구조 때문에 CPU 가까이 연결된 장치에 비해 멀리있는 장치는 인터럽트 요청이 지연된다. - 병렬 연결 방식
I/O 제어기 마다 별도의 버스 선을 이용 하여 INTR, INTA(INTerrupt acknowledgements)선을 이용해서 확인하는 방법. 이 방법은 인터럽트를 요청한 장치를 쉽게 찾을 수 있는 장점이 있다. 그러나 하드웨어 구성이 매우 복잡하며, CPU가 가지고 있는 인터럽트 포트 수에 의해서 연결할 수 있는 장치의 수가 제한 된다는 점이 단점으로 꼽힌다.
4. 종류
인터럽트는 다양한 종류가 있다. 일반적으로 사용되는 인터럽트는 두가지 갈래로 나뉠 수 있는데,
- 외부 인터럽트: 입출력 장치, 타이밍 장치, 전원 등의 외부적인 요인에 의해서 발생하는 인터럽트.
- 전원 이상 인터럽트: 정전이나 전원이 이상이 있는 경우
- 기계 고장 인터럽트: CPU등의 기능적인 동작 오류가 발생한 경우
- 입출력 인터럽트(I/O Interrupt): 입출력의 종료 등의 이유로 CPU의 수행을 요청하는 인터럽트.
- 내부 인터럽트: 잘못된 명령이나 데이터를 사용할 때 발생하는 인터럽트
[1] 대부분의 컴퓨터가 동시에 여러 가지 일을 동시에 처리하는 것 같지만 사실 매우 빠른 속도로 시간을 매우 잘게 쪼개고 일을 나누어서 처리한다. 이런 방식을 time-sharing(시-분할) 방식이라고 한다.[2] 비교적 낮은 수준에서 간단한 예를 들면 '4순위 입출력 전송 요청 및 전송 완료, 전송 오류(마우스 커서 이동 및 클릭, 키보드 입출력, 디스플레이 출력 등)'이 있다. 렉이 좀 많이 걸려 화면의 모든 페이지가 죄다 튕기는 한이 있어도 어지간해서는 마우스 동작 자체는 문제 없는 것도 이런 이유. 하지만 심각한 오류가 있을 때는 저런 것들을 죄다 씹어버리고 컴퓨터는 심각한 오류를 먼저 해결한다. 후술하겠지만 최우선 사항은 전원 공급 문제.[3] 꽃이름으로 꽃들의 뿌리가 땅속에서 직렬로 연결 된것을 뜻한다.[4] 이상하게 메모리 장소를 참조하는 경우 등.[5] 주로 기계어 레벨에서 제공되지 않는 인스트럭션을 운영 체제의 시스템 콜(System Call)의 형태로 제공되는 인터럽트.