인터럽트를 이용한 I/O
인터럽트란?
CPU가 어떤 프로그램을 순차적으로 수행하는 도중에 외부로부터 인터럽트 요구가 들어오게 되면, CPU는 원래의 프로그램 수행을 중단하고, 요구된 인터럽트를 처리해주기 위한 프로그램을 먼저 수행한다.
CPU와 외부장치들 간의 상호작용을 위해서 필요한 기능이다.
위 인터럽트 메커니즘을 이용하면 I/O 동작이 I/O제어기와 I/O 장치에 의해 수행되는 동안 CPU는 다른 작업을 처리할 수 있게 되어, 시간을 유용하게 활용할 수 있다. 이러한 방식을 인터럽트-구동 I/O라고 부른다.
인터럽트-구동I/O의 동작 순서를 알아보자
- CPU가 I/O 제어기에게 명령을 보낸다. 이후 CPU는 다른 작업을 수행한다.
- 제어기는 I/O 명령을 이용하여 I/O 장치를 제어한다.
- I/O 장치가 명령 수행을 완료하면, 제어기는 CPU로 인터럽트 신호를 보낸다.
CPU는 인터럽트 신호를 받는 즉시 원래의 프로그램으로 돌아와서 I/O 장치가 끝난 직후에 해야할 작업을 계속한다.
마치 스택의 동작과 비슷하다. 실제로 프로그램 동작을 하기위해 실행할, 실행중인 프로그램의 주소를 스택에 쌓아둘 것이다.
여러 종류의 I/O 장치들이 접속되어 있는 컴퓨터가 있다고 가정하자.
각 I/O 장치의 제어기는 I/O 동작의 수행이 종료되는 즉시 CPU로 인터럽트 신호를 보낸다.
이때 CPU는 인터럽트를 보낸 제어기의 신호를 확인할 수 있어야 그에 대한 적절한 처리를 할 수 있다.
또한, 두 개 이상의 I/O 제어기들이 동시에 인터럽트 신호를 발생한 경우에 어느 제어기에 대한 서비스부터 처리할 것인지도 결정할 수 있어야 한다.
이처럼 I/O장치들이 여러 개가 존재하는 시스템에서 인터럽트 순서에 관련된 문제를 해결하는 방법은 다음과 같다.
- 다중 인터럽트 방식
- 데이지-체인 방식
- 소프트웨어 폴링 방식
다중 인터럽트 방식
각 I/O 제어기와 CPU 사이에 별도의 인터럽트 요구 신호(INTR) 선과 인터럽트 확인(INTA) 신호 선이 한 개씩 존재한다.
따라서 위 그림과 같이 네 개의 I/O 장치들이 제어기를 통하여 CPU와 접속되는 시스템에서는 네 개의 INTR 선과 네 개의 INTA 선이 필요하다.
CPU가 각 I/O 제어기로부터 인터럽트 요구를 받았을 때, 만약 즉시 응답할 수 있는 상태라면 인터럽트 확인 신호(INTA)를 보내준다.
I/O제어기2가 인터럽트를 요구하는 경우
- I/O 제어기2가 INTR2신호를 세트한다.
- CPU는 INTA2신호를 세트함으로써 그 제어기에게 인터럽트 요구를 인식하였음을 알리고, 인터럽트를 위한 서비스를 시작한다.
- I/O 제어기2는 INTR2 신호를 0으로 리셋한다.
- CPU도 INTA2 신호를 리셋한다.
만약 2개 이상의 I/O 장치들이 동시에 인터럽트를 요구한다면?
각 I/O 장치들에 대한 우선순위를 정하고, 더 높은 우선순위를 가진 장치의 인터럽트부터 처리한다.
CPU가 인터럽트 요구에 대한 서비스를 시작하는 순간에 인터럽트 플래그를 인터럽트 disable 상태로 세트한다면, 그 요청에 대한 서비스를 처리하는 동안에는 다른 인터럽트가 들어와도 무시한다.
하지만 인터럽트 플래그를 disable 하지 않았고 더 높은 우선순위를 가진 인터럽트 요구가 들어오면, 현재 서비스를 잠시 중단하고 새로운 인터럽트에 대하여 응답해야한다. <- 이러한 방식을 선점형 방식이라고 할 수 있다.
다중 인터럽트 방식의 장점은 각 I/O 장치가 별도의 인터럽트 선을 가지고 있기 때문에 CPU가 인터럽트를 요구한 장치를 쉽게 찾아낼 수 있다는 점이다.
반면에, 이 방법은 각 I/O 장치에 대하여 두 개씩의 신호 선들이 필요하므로 하드웨어가 복잡해지고, 접속 가능한 I/O 장치들의 수가 그 신호들을 위해 할당되는 CPU칩의 핀 수에 의해 제한된다.
데이지-체인 방식
모든 I/O 제어기들은 한 개의 INTR 선을 공유한다. 그리고 CPU로부터 발생되는 INTA 출력 선은 가장 가까이 위치한 I/O 제어기1의 인터럽트 확인 입력(AI1) 선으로 연결된다. 그리고 제어기1의 인터럽트 확인 출력(AO1) 선은 다음에 위치한 I/O 제어기의 AI2로 연결되고 이것이 반복된다. 형태가 마치 데이지 꽃들을 연속적으로 연결한 모습과 같아서 데이지-체인 방식이라고 부른다.
작동 순서
이 방식에서 하나 이상의 I/O 제어기가 인터럽트 요구를 보낸다면, INTR 선이 세트된다.
CPU는 INTA신호를 즉시 세트하고, 첫 번째 I/O 제어기로 신호를 보낸다.
만약 그 제어기가 인터럽트를 요구한 상태라면, 즉시 데이터 버스를 통하여 자신의 식별 변호를 CPU로 보낸다.
식별 변호를 인터럽트 벡터라고 불리는데, CPU가 해당 I/O장치를 위한 인터럽트 서비스 루틴의 시작 주소를 찾는데 사용된다.
만약 여러 개의 I/O 장치들이 동시에 인터럽트 요구를 보낸다면, INTA 신호는 그들 중에서 가장 우선순위가 높은(가장 가까이 있는) 장치에 의해 먼저 인식된다. 우선순위가 높은 장치에 대한 인터럽트 서비스가 이루어지지만, 그 동안에도 아직 서비스 받지 못한 I/O 장치들이 INTR 신호를 보내기 때문에 INTR 선은 여전히 세트된 상태로 있다. CPU는 그 장치에 대한 서비스를 완료한 다음에 다시 INTA 신호를 세트하게 되며, 다른 장치들은 계속 기다려야 한다.
데이지-체인 방식의 장점은 신호 선의 수가 적기 때문에 하드웨어가 간단한 것이다.
단점으로는 많은 수의 I/O 장치들이 접속된 시스템에서는 우선 순위가 낮은 장치들이 서비스를 받지 못하고 매우 오랫동안 기다리게 된다는 것이다.(starving)
소프트웨어 폴링 방식
새로운 신호 선인 TEST I/O선이 연결된다. 각 제어기 내에는 해당 I/O 장치의 인터럽트 요구 상태를 가리키는 인터럽트 플래그가 있는데, TEST I/O 신호는 그 플래그의 상태를 검사하는데 사용된다.
이 방식에서도 인터럽트 요구(INTR)선은 모든 I/O 제어기들에 의해 공통으로 사용된다. 어떤 I/O 장치가 인터럽트 요구를 발생하면, 해당 제어기 내에 있는 인터럽트 플래그가 세트됨과 동시에 공통 INTR 신호가 세트된다. 이후 CPU는 즉시 다음과 같은 검사 과정을 수행한다.
- TEST I/O 선을 이용하여 첫 번째 I/O 제어기의 인터럽트 플래그가 세트되어 있는 지 검사한다.
만약 세트되어 있지 않다면, CPU는 인터럽트를 요구한 장치를 찾을 때까지 검사 과정을 모든 제어기들에 대하여 차례대로 수행한다. - 인터럽트를 요구한 I/O 장치를 확인하면, CPU는 그 장치를 위한 인터럽트 서비스 루틴으로 분기하여 서비스를 수행한다.
이 방법은 인터럽트를 요구한 장치를 찾아내는 과정에서 마이크로프로그램을 이용하기 때문에 소프트웨어 폴링 방식이라고 불린다.
하드웨어가 간단하다는 장점이 있지만, 검사를 위한 시간이 많이 걸린다는 단점도 있다.
DMA를 이용한 I/O
지금까지 기억장치와 I/O 장치간의 데이터 이동에 CPU가 직접 개입하는 방식을 알아보았다.
예를 들어 주기억장치의 데이터를 I/O 장치에 저장하는 I/O 쓰기인 경우에, CPU가 주기억장치로부터 데이터를 하나씩 읽어서 내부 레지스터에 담은 다음에 I/O 장치로 내보내고, I/O 명령도 함께 보내게 된다.
만약 큰 데이터 블록을 전송하는 경우 CPU가 위 동작을 수행하는데 많은 시간을 사용할 것이고, 시스템 버스도 대부분의 시간 동안 I/O 동작들을 위해 사용될 수 밖에 없을 것이다.
이러한 문제점을 해결하기 위해서 직접기억장치액세스(Direct Memory Access: DMA)가 널리 사용되고 있다.
DMA의 매커니즘은 CPU의 개입 없이 I/O 장치와 기억장치 사이의 데이터 전송을 수행하는 것이다.
DMA 방식을 사용하기 위해서는 위 그림과 같이 DMA 제어기가 추가되어야 한다.
I/O 쓰기, I/O 읽기 명령을 수행하기 위해서는 CPU가 DMA 제어기로 다음과 같은 정보가 포함된 명령을 보내야 한다.
- I/O 장치의 주소
- 연산(read/write) 지정자
- 데이터가 읽혀지거나 쓰여질 주기억장치 영역의 시작 주소
- 전송될 데이터 단어들의 개수
CPU는 이러한 정보들을 DMA 제어기로 보낸 다음에는 다른 일을 계속 한다.
즉, I/O동작을 DMA 제어기에게 맡기고, 모든 데이터 전송 동작이 완료될 때까지 전혀 개입하지 않는다.
위 그림에서 보듯이 CPU와 DMA 제어기가 시스템 버스를 공유한다.
그런데 DMA 제어기는 가능한 CPU의 동작을 방해하지 않기 위해서 CPU가 내부적으로 명령을 해독하거나, ALU 연산을 수행하는 시간에만 시스템 버스를 사용한다.
이렇게 CPU가 시스템 버스를 사용하지 않는 동안에 DMA 제어기가 버스를 사용하는 것을 사이클 스틸링이라고 한다.
하지만 데이터 블록이 큰 경우에 CPU가 일을 하지 않을 때만 시스템 버스를 사용하면 I/O 처리 시간이 너무 길어진다. 따라서 DMA 제어기는 시스템 버스 사용을 요청하게 되고 CPU는 현재 사이클이 끝나는 즉시 허가를 해준다.
DMA 제어기가 CPU에게 버스 사용을 요구하는 신호를 버스 요구(BUS REQ)신호라고 하며, CPU가 DMA제어기에게 버스 사용을 허가하는 신호를 버스 사용 승인(BUS GRANT)신호라고 한다.
그리고 DMA동작이 완료되면 DMA제어기는 CPU로 INTR 신호를 보내어 완료를 알린다.
주기억장치 내의 어떤 데이터블록을 디스크에 저장하기 위한 DMA 동작의 처리 순서는 다음과 같다.
- CPU가 DMA 제어기에게 명령을 보낸다.
- DMA 제어기는 CPU로 BUS REQ 신호를 보낸다.
- CPU가 DMA 제어기로 BUS GRANT 신호를 보낸다.
- DMA 제어기가 버스를 사용하여 주기억장치로부터 데이터를 읽고 디스크 제어기로 보낸다.(데이터 저장)
- 저장할 데이터가 없을 때까지 2-4를 반복한다.
- 모든 데이터 저장이 완료되면, CPU로 INTR 신호를 보낸다.
이러한 기능을 수행하기 위한 DMA 제어기의 내부 구조는 다음과 같다.
주소 레지스터 : I/O 장치의 주소를 저장
데이터 레지스터 : 데이터 버퍼 역할
카운트 레지스터 : 전송될 데이터 수를 저장한다.
이들은 별도의 주소를 할당받으며, CPU는 그 주소를 이용하여 레지스터들을 액세스한다.
위 그림과 같은 시스템 구성에는 한 가지 문제가 있다.
예를 들어, 디스크 쓰기 동작을 위해 주기억장치의 데이터를 디스크 제어기로 전송하는 경우를 고려해보자.
- 데이터를 주기억장치로부터 DMA로 이동시키기 위하여 시스템 버스를 사용한다.
- DMA 제어기로부터 데이터를 디스크 제어기로 이동시키기 위하여 시스템 버스를 사용한다.
따라서 1024바이트 크기의 데이터 블록을 저장하기 위해서는 총 2048번의 시스템 버스 이용이 필요하다.
결과적으로, DMA 동작을 위하여 시스템 버스가 너무 많이 사용되어 전체 성능이 저하될 수 있다.
위 문제를 해결하기 위해서 아래 그림과 같은 구조를 고려할 수 있다.
I/O 제어기를 시스템버스와 접속하지 않고, DMA 제어기에 직접 접속하는 것이다.
이 경우에는 DMA 제어기가 데이터를 I/O 제어기로 이동시키기 위해 시스템버스를 사용하지 않기 때문에 1024바이트 블록을 전송하는데 시스템 버스를 1024번만 사용하면 된다.
하지만 DMA 제어기에 직접 접속하는 구조에서는 각 DMA 제어기에 접속할 수 있는 I/O 제어기의 수가 제한된다는 단점이 있다. 따라서 다양하고 많은 I/O 장치를 포함하는 시스템에서는 여러개의 DMA 제어기들을 시스템 버스에 접속시켜야 한다.
이러한 단점을 개선한 구조가 아래 그림과 같은 구조이다.
I/O 버스가 도입되었다.
각종 I/O 제어기들이 I/O 버스에 접속하고, I/O버스와 시스템 버스를 DMA 제어기가 이어주고 있다.
이 구조에서는 DMA 제어기 내부에 I/O 버스 인터페이스의 회로가 추가되어야 한다.
여기까지 DMA 구조를 최대한 개선시킨 결과를 볼 수 있었다.
하지만 DMA 제어기를 이용한 I/O 데이터 전송은 다음과 같은 근본적인 문제점을 가지고 있다.
- I/O 장치들은 종류와 속도가 다양하고 제어 방법도 복잡하기 때문에, 간단한 구조를 가진 DMA 제어기로 I/O 장치를 지원하는데는 한계가 있다.
- 디스크 쓰기/읽기 동작은 블록의 크기가 512 바이트 이상이기 때문에 그 데이터들을 임시 저장하기 위한 내부 기억장치가 필요하다.
IOP
DMA의 단점을 해결하기 위해 최근 컴퓨터는 DMA 제어기를 확장시킨 I/O 프로세서(I/O Processor: IOP)를 사용한다.
IOP는 I/O 채널이라고도 부른다.
IOP 구성요소
- I/O 제어 프로그램을 수행할 수 있는 프로세서
- 데이터 블록들을 임시 저장할 수 있는 용량의 지역 기억장치
- 시스템 버스 인터페이스 및 버스 마스터 회로
- I/O 버스 인터페이스 및 중재 회로
IOP가 데이터 입출력을 위한 모든 동작들을 지원하게 됨에 따라서, CPU는 I/O 동작에 대한 부담을 거의 가지지 않게 됨.
특히 IOP는 프로세서와 내부 기억장치도 포함하고 있기 때문에, OS의 I/O 장치 드라이버 프로그램들을 수행할 수도 있다.
I/O 프로세서가 사용된 시스템의 구성도이다.
'CS > Computer Architecture' 카테고리의 다른 글
[컴퓨터 구조] 다중 프로세서 시스템 #2 (0) | 2022.01.21 |
---|---|
[컴퓨터 구조] 다중 프로세서 시스템 #1 (0) | 2022.01.21 |
[컴퓨터 구조] 캐시 메모리 (0) | 2022.01.06 |
[컴퓨터 구조] 기억장치 모듈 설계 (0) | 2022.01.05 |
[컴퓨터 구조] RAM & ROM (0) | 2021.12.30 |