- 다양한 종류의 입출력장치
키보드, 모니터, USB 메모리, CD-ROM, SSD, 마우스 ,프린터, 스피커 등 무수히 많은 입출력장치들이 존재한다. 다양한 장치마다 속도, 데이터 전송 형식 등도 다를것이고 이는 정보를 주고받는 방식을 규격화하기 어렵게 한다.
- 입출력장치간의 상이한 전송률
전송률이란 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표로 CPU와 메모리처럼 전송률이 높은 장치는 1초에도 수많은 데이터를 주고받을 수 있지만, 키보드나 마우스 같이 상대적으로 전송률이 낮은 장치는 같은 시간 동안 조금씩만 주고받을 수 있다. 이러한 전송률의 차이는 입출력장치 간의 통신을 어렵게 한다.
입출력장치는 컴퓨터에 직접 연결되지 않고 장치 컨트롤러device controller라는 하드웨어를 통해 연결된다. 장티 컨트롤러는 입출력 제어기I/O controller, I/O module등 다양하게 불린다.
모든 입출력장치는 각자의 장치 컨트롤러를 통해 컴퓨터 내부와 정보를 주고받고, 장치 컨트롤러는 하나 이상의 입출력장치와 연결되어 있다.
입출력장치 종류가 많아 정보 규격화가 어려웠던 문제는 장치 컨트롤러가 번역가 역할을 함으로서 해결할 수 있다. 그 과정에서 연결된 입출력장치에 문제는 없는지 오류를 검출하기도 한다.
버퍼링이란 전송률이 상이한 장치 간에 주고받는 데이터를 버퍼라는 임시 공간에 저장하여 전송률을 비슷하게 맞추는 방법이다.
실제로는 이보다 복잡하지만, 데이터 레지스터data register, 상태 레지스터status register, 제어 레지스터control register이 세가지를 꼭 기억하자.
장치 컨트롤러의 동작을 감지하고 제어함으로써 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램이다. 장치 컨트롤러거 입출력장치를 연결하기 위한 하드웨어적인 통로라면, 장치 드라이버는 입출력장치를 연결하기 위한 소프트웨어적인 통로다.
프로그램 입출력program I/O은 기본적으로 프로그램 속 명령어로 입출력장치를 제어하는 방법이다. CPU가 프로그램 속 명령어를 실행하는 과정에서 입출력 명령어를 만나면 CPU는 입출력장치에 연결된 장치 컨트롤러와 상호작용하며 입출력 작업을 수행한다.
메모리에 저장된 정보를 하드 디스크에 백업하는 상황
1. CPU는 하드 디스크 컨트롤러의 저에 레지스터에 쓰기 명령을 보낸다.
2. 하드 디스크 컨트롤러는 하드 디스크 상태를 확인하고, 준비된 상태면 하드 디스크 컨트롤러는 상태 레지스터에 준비되었다고 표시한다.
3. 1)CPU는 상태 레지스터를 주기적으로 읽어보며 하드 디스크의 준비 여부를 확인한다. 2) 하드 디스크가 준비됐음을 CPU가 알게 되면 백업할 메모리의 정보를 데이터 레지스터에 쓴다. 아직 백업 작업(쓰기 작업)이 끝나지 않았다면 1)번부터 반복, 쓰기가 끝났다면 작업을 종료.
메모리 맵 입출력memory-mapped I/O은 메모리에 접근하기 위한 주소 공간과 입출력장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주하는 방법이다.
1,024개의 주소를 표현할 수 있는 컴퓨터가 있다고 가정했을 때, 512개는 메모리 주소를 512개는 장치 컨트롤러의 레지스터를 표현하기 위해 사용된다.
모두 똑같이 메모리 주소를 대하듯 하면 메모리에 접근하는 명령어와 입출력장치에 접근하는 명령어가 굳이 다를 필요 없이 CPU는 입출력장치의 상태를 알 수 있다.
고립형 입출력isolated I/O은 메모리를 위한 주소 공간과 입출력장치를 위한 주소 공간을 분리하는 방법이다.
메모리 맵 입출력 | 고립형 입출력 |
---|---|
메모리와 입출력장치는 같은 주소 공간 사용 | 메모리와 입출력장치는 분리된 주소 공간 |
메모리 주소 공간이 축소됨 | 메모리 주소 공간이 축소되지 않음 |
메모리와 입출력장치에 같은 명령어 사용 가능 | 입출력 전용 명령어 사용 |
인터럽트는 입출력장치가 아닌 장치 컨트롤러에 의해 발생한다. CPU는 장치 컨트롤러에 입출력을 명령하고, 장치 컨트롤러가 입출력장치를 제어하며 입출력을 수행하는 동안 CPU는 다른 일을 할 수 있다.
장치 컨트롤러가 입출력 작업을 끝낸 뒤 CPU에세 인터럽트 요청 신호를 보내면 CP
u는 하던 일을 잠시 백업하고 인터럽트 서비스 루틴을 실행한다.
이렇게 인터럽트를 기반으로 하는 입출력을 인터럽트 기반 입출력Interrupt-Driven I/O이라고 한다.
PIC는 여러 장치 컨트롤러에 연결되어 장치 컨트롤러에서 보낸 하드웨어 인터럽트 요청들의 우선순위를 판별한 뒤 CPU에 지금 처리해야 할 하드웨어 인터럽트가 무엇인지 알려주는 장치다.
PIC의 다중 인터럽트 처리 과정
1. PIC가 장치 컨트롤러들에서 인터럽트 요청 신호들을 받아들인다.
2. PIC는 인터럽트 우선순위를 판단한 뒤 CPU에 처리해야 할 인터럽트 요청 신호를 보낸다.
3. CPU는 PIC에 인터럽트 확인 신호를 보낸다.
4. PIC는 데이터 버스를 통해 CPU에 인터럽트 벡터를 보낸다.
5. CPU는 인터럽트 벡터를 통해 인터럽트 요청의 주체를 알게 되고, 해당 장치의 인터럽트 서비스 루틴을 실행한다
DMADirect Memory Access는 입출력장치와 메모리가 CPU를 거치지 않고도 상호작용할 수 있는 입출력 방식이다. DMA 입출력을 하기 위해서는 시스템 버스에 연결된 DMA 컨트롤러라는 하드웨어가 필요하다.