[C.A] 입출력 방법

touhou09·2024년 11월 17일
0

컴퓨터 이론

목록 보기
15/47

CPU와 장치 컨트롤러가 정보를 주고 받는 방법은 3가지가 있다.

programmed I/O

기본적으로 프로그램 속 명령어로 IO장치를 제어하는 방법.
아래 순서로 작동한다.
1. CPU는 device controller의 control register에 쓰기 명령을 보낸다.
2. device controller는 상태를 확인하고 준비된 상태라면 status register에 준비되었다고 표시한다.
3. CPU는 status register를 주기적으로 읽어보며 준비 여부를 확인하고 device controller가 준비됐음을 CPU가 알게 된다면 memory 정보를 data register에 쓴다.
작업이 종료될때까지 1번부터 반복을하며 작업이 끝나면 작업을 종료한다.

위와 같은 register에 적힌 명령어들은 아래와 같은 방식으로 표현된다.

  • memory mapped IO
    memory에 접근하기 위한 주소 공간과 IO장치에 접근하기 위한 주소 공간을 하나로 간주하는 방법
    여기서 CPU는 memory의 주소들과 device controller의 register 모두 똑같은 memory의 주소와 같은 것으로 반단한다.
  • isolated I/O
    memory를 위한 주소 공간과 IO장치를 위한 주소 공간을 분리하는 방법
    control bus에 memory rw와 io장치 rw를 별도로 분리한다면 필요에 맞게 bus를 활성화시키면 된다.
    memory와 다른 IO 명령어를 사용하며 memory에 접근하는 명령어와 IO장치에 접근하는 명령어가 구분된다.

Interrupt 기반 IO

IO장치가 아닌 device controller에 의해 CPU가 device controller에 IO작업을 명령하고, device controller가 IO장치를 제어하며 IO작업을 수행하는 동안 CPU가 다른 일을 진행한다.

이후 device controller가 CPU에게 interrupt 요청 신호를 보내면 CPU는 하던 일을 잠시 백업하고 interrupt serivce routine을 실행한다.

이렇게 interrupt 기반으로 하는 IO 작업을 interrupt driven IO라고 한다.

여러 IO 장치가 interrupt를 발생시키면, 그리고 interrupt 중 다른 interrupt가 발생하는 경우는 CPU가 우선순위가 높은 interrupt부터 처리하도록 한다.

우선순위를 반영해 interrupt를 처리하는 방법은 여러가지 있지만 주로 PIC(Programmable Interrupt Controller) 하드웨어를 사용하는 방법이 있는데, PIC는 여러 device controller에 연결되어 device controller에서 보낸 hardware interrupt 요청들의 우선순위를 판별한 뒤 CPU에 지금 처리해야 할 hardware interrupt는 무엇인지 알려주는 장치이다.

PIC는 여러 pin이 있는 형태인데 각 pin에는 hardware interrupt를 보낼 수 있는 hardware들이 연결되어 있고 이를 통해 연결된 device controller들이 동시에 hardware interrupt 요청을 보내면 PIC는 이들의 우선 순위를 판단하여 CPU에 가장 먼저 처리할 interrupt를 알려준다.

PIC의 다중 interrupt 처리 과정은 아래와 같다.
1. PIC가 device controller에서 interrupt 요청 신호를 받아들인다.
2. PIC는 interrupt 우선순위를 판단한 뒤 CPU에 처리해야 할 interrupt 요청 신호를 보낸다.
3. CPU는 PIC에 interrupt 확인 신호를 보낸다.
4. PIC는 data bus를 통해 CPU에 interrupt vector를 보낸다.
5. CPU는 interrupt vector를 통해 interrupt 요청의 주체를 알게 되고, 해당 장치의 interrupt service routine을 실행한다.

참고로 PIC가 무시할 수 없는 interrupt인 NMI까지 우선순위를 판별하지는 않는다.
NMI는 가장 우선순위가 높기 때문에 판별이 불필요하기 때문이다.
PIC가 우선순위를 조정해주는 interrupt는 interrupt bit를 통해 막을 수 있는 hardware interrupt이다.

DMA 입출력

다른 방법들은 IO장치와 memory간의 데이터 이동을 CPU가 주도하고 이동하는 데이터도 CPU를 친다는 공통점이 있는데 이는 CPU가 IO장치를 위한 연산 때문에 시간을 뺏긴다는 문제점이 있다.
데이터 용량이 커질 수록 CPU 부담도 더욱 커지는데 이를 해결하기 위한 DMA(Direct Memory Access)가 등장했다.
DMA는 말 그대로 memory에 직접 접근할 수 있는 IO 기능이고 DMA 입출력을 위해서는 시스템 bus에 연결된 DMA Controller라는 hardware가 필요하다.

일반적으로 아래와 같은 과정으로 이루어진다.
1. CPU는 DMA Controller에 IO장치의 주소, 수행할 연산, 읽거나 쓸 memory 주소 등과 같은 정보로 IO 작업을 명령한다.
2. DMA Controller는 CPU 대신 device controller와 상호작용하며 IO작업을 수행한다. 이때 DMA Controller는 필요한 경우 memory에 직접 접근하여 정보를 읽거나 쓴다.
3. IO 작업이 끝나면 DMA Controller는 CPU에 interrupt를 걸어 작업이 끝났음을 알린다.

위 과정을 보면 CPU는 DMA Controller에게 IO 작업 명령을 내리기만 하고 Interrupt를 받기만 하면 되기 때문에 작업 부담을 줄일 수 있다. 즉, CPU는 IO의 시작과 끝에만 관여를 한다.

여기서 DMA Controller는 시스템 bus로 memory에 직접 접근이 가능하지만 시스템 bus는 공용자원이기 때문에 동시에 사용할 수 없다.
CPU가 시스템 bus를 사용하지 않을 때마다 조금씩 시스템 bus를 이용하거나 CPU가 일시적으로 시스템 bus를 이용하지 않도록 허락을 구하고 집중적으로 이용하도록 한다.

CPU 입장에서는 마치 bus에 접근하는 주기를 DMA가 훔치는 느낌으로 받아들여지기 때문에 DMA의 시스템 bus 이용율을 cycle stealing이라고 한다.

입출력 bus

DMA Controller와 device controller의 연결 방식과 입출력 bus에 대해서,

CPU, memory, DMA, device controller 모두 같은 bus를 공유하는 구성에서는 DMA를 위해서 한 번 memory에 접근할 때마다 시스템 bus를 2번 사용하게 되는 부작용이 있다.

DMA를 위해 시스템 bus를 너무 자주 사용하면 그만큼 CPU가 시스템 bus를 이용하지 못하므로 DMA controller와 device controller들을 I/O bus라는 별도의 bus에 연결해서 해결한다.

현대 대부분의 컴퓨터에는 IO bus가 있는데 이 IO bus는 PCI(Peripheral Component Interconnect) bus, PCI Express(PCIe) bus 등 여러 종류가 있고 이 PCIe bus 와 연결해주는 통로가 PCIe 슬롯이다.

profile
Engineer가 되기 위하여

0개의 댓글