[컴퓨터 구조 5] 입출력 방식
8장 내용을 이해하려 구글링을 해보니 자세한 내용을 파고들려면 한도 끝도 없어 보인다. 이거 조금 배웠다고 안주하지 말고 계속 더 깊이 깊이 파볼 것!
장치 컨트롤러와 장치 드라이버
입출력 장치는 마이크, 스피커, 프린터, 마우스, 키보드 등 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환하는 장치를 의미한다. 앞서 배운 보조기억장치들도 이와 동작이 유사한데, 그래서 이 둘을 묶어 주변장치(peripheral device)고 통칭하기도 한다.
쨌든 이 입출력 장치들을 사용하기에는 그 종류가 너무 많고, CPU/메모리에 비해 전송률(transfer rate: 전송 속도)이 낮아 그냥 사용하기는 힘들다.
그래서 입출력 장치를 제어하는 HW와 SW가 탄생하게 되었는데 각각 장치 컨트롤러(device controller; 입출력 제어기(I/O controller), 입출력 모듈(I/O module)로도 불림)와 장치 드라이버(device driver)다.
마음에 드는 도식이 없어서 직접 만들었다…
장치 컨트롤러는 다음과 같은 역할을 한다
장치 컨트롤러의 역할
- CPU와 입출력 장치 간의 통신 중개
- 오류 검출
- 데이터 버퍼링
구체적으로, 장치 컨트롤러 내부의 데이터 레지스터(data register)는 CPU와 입출력 장치 간의 데이터 전송률 차이를 버퍼(buffer)를 통해 완급조절을 한다.
CPU의 속도가 더 빠르므로 CPU의 데이터는 한 번에 많이 받아 조금씩 IO 장치로 넘기고, IO 장치의 데이터는 조금씩 모았다가 한꺼번에 CPU에게 전달하는 방식. 이를 버퍼링(buffering)이라 부른다.
상태 레지스터(status register)엔 IO 장치가 준비가 되었는지, 작업이 완료되었는지, 오류는 없는지 등의 상태 정보를 저장하고, 제어 레지스터(control register)엔 IO 장치가 수행할 내용에 대한 제어 정보와 명령을 저장한다.
장치 드라이버는 이 장치 컨트롤러의 동작을 감지하고 제어함으로써 장치 컨트롤러와 컴퓨터 내부를 연결해주는 역할이다. 따라서 장치 드라이버가 운영체제에서 제공되지 않는다면, 해당 장치는 사용이 불가해진다.
다양한 입출력 방법
프로그램 입출력(Programmed I/O)
프로그램 속 명령어로 입출력 장치를 제어하는 가장 기초적인 입출력으로, 요즘은 잘 안쓰인다고 한다. 이는 CPU가 직접 프로그램 속 명령어를 실행하여 장치 컨트롤러와 상호작용하기 때문인데, CPU의 업무가 과중한 상태에서 입출력까지 담당하니 자연스레 CPU의 속도가 느려질 수밖에 없다.
이때 메모리를 위한 주소 공간과 입출력 장치를 위한 주소 공간을 하나로 간주하는 방법을 메모리 맵 입출력(memory-mapped I/O), 메모리를 위한 주소 공간과 입출력 장치를 위한 주소 공간을 분리하는 방법을 고립형 입출력(isolated I/O)이라고 부른다.
전자는 같은 주소 공간이 사용돼 메모리 주소 공간이 축소되지만, 메모리와 IO에 같은 명령어를 사용 가능해 간편하다.
후자는 분리된 공간을 사용하기에 메모리 주소 공간이 축소되지 않지만, 입출력 전용 명령어와 전용 IO 선이 필요해진다.
이때 CPU가 입출력 장치에서 들어오는 신호를 파악할 수 있어야 하는데, 이를 위해 CPU는 주기적으로 장치 컨트롤러의 상태 레지스터를 확인하게 된다. 이를 폴링(polling)이라고 한다.
인터럽트 기반 입출력(Interrupt-Driven I/O)
여기서 폴링의 문제점이 발생하는데, 주기적으로 IO 장치를 신경쓰느라 CPU는 자신이 하던 일을 잠시 멈추고 맡은 일에 온전히 집중할 수 없게 된다. 이 때문에 차라리 CPU는 이를 신경쓰지 말고 자신이 할 일만 하되, 인터럽트가 발생하면 그때그때 인터럽트를 처리하고 다시 할 일로 복귀하는 방식을 고안해내었다.
이것이 인터럽트 기반 입출력이다. 인터럽트는 우선순위가 있기에 PIC(Programmable Interrupt Controller)라는 HW를 사용해 여러 요청 중 우선순위를 판별하여 CPU가 처리하게 된다. 단 막을 수 없는 NMI(Non-Maskable Interrupt)는 PIC도 건너뛰고 즉각 우선 처리된다. 가장 우선순위가 높아 판별 자체가 불요하기 때문
DMA 입출력(Direct Memory Access I/O)
그런데 이마저도 CPU가 주도하게 되니 여전히 CPU는 시간을 빼앗기게 된다. 이를 막기 위해 IO 장치와 메모리가 CPU를 거치지 않고도 상호작용할 수 있는 DMA(Direct Memory Access)를 발전시켰다. DMA는 DMA 컨트롤러라는 HW로 작동한다.
DMA 입출력 과정
- CPU는 DMA 컨트롤러에 입출력장치의 주소, 수행할 연산(R/W), 읽거나 쓸 메모리의 주소 등의 정보로 입출력 작업을 명령한다
- DMA 컨트롤러는 CPU 대신 장치 컨트롤러와의 상호작용을 전담하여 입출력 작업 및 메모리 접근을 수행한다
- 입출력 작업이 끝나면 CPU에 인터럽트를 걸어 작업의 종료를 알린다
자 그런데 이마저도 문제점이 있으니, DMA 컨트롤러가 메모리를 참조하는 과정에서 CPU가 사용할 시스템 버스를 일시적으로 점유하게 된다는 것이다.
CPU 입장에선 자신이 시스템 버스를 사용할 주기를 뺏기는 셈이 되는데, 이를 사이클 스틸링(cycle stealing)이라 일컫는다.
아니 어디까지 문제점을 고치시려고?
채널 입출력(Channel I/O)
자, 앞에서 나온 문제점은 입출력 버스(input/output bus)라는 별도의 버스에 데이터를 태우면 해결된다. 심지어 입출력 버스에 직접 명령어를 fetch.decode.execute까지 하는 IO 전용 CPU도 등장했는데, 이를 IOP(Input/Output Process; 입출력 프로세서) 혹은 입출력 채널(IO Channel)이라 부른다.
그림과 같이 DMA는 시스템 버스와도, 입출력 버스와도 연결된다. 메모리로부터 시스템 버스를 타고 DMA 컨트롤러로 온 데이터는, 다시 입출력 버스를 타고 IO 컨트롤러로 전달될 수 있는 것이다. 이런 입출력 버스에는 PCI(Peripheral Component Interconnect) 버스, PCIe(PCI Express) 버스 등이 있고, 이를 PCIe 슬롯을 통해 여러 IO 장치와 연결시켜준다. 끄읏
출처: [혼자 공부하는 컴퓨터구조+운영체제 Chapter 08]