[컴퓨터구조] 입출력장치
‘혼자 공부하는 컴퓨터구조+운영체제 - 강민철’ 책을 참고하여 작성한 포스트입니다.
장치 컨트롤러
- 입출력 장치는 CPU, 메모리보다 다루기가 더 까다로운데, 그 이유는 크게 두 가지가 있다.
- 입출력장치에 종류가 너무 많다.
- 입출력데이터 장치의 데이터 전송률은 일반적으로 CPU와 메모리에 비해 낮다.
- 전송률(transfer rate)이란 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표이다.
- 그래서 입출력장치는 컴퓨터에 직접 연결되지 않고 장치 컨트롤러(device controller)라는 하드웨어를 통해 연결된다.
- 장치 컨트롤러는 입출력 제어기(I/O controller), 입출력 모듈(I/O module)등으로도 불린다.
- 장치 컨트롤러는 크게 다음 세가지 역할을 한다
- CPU와 입출력장치 간의 통신 중개
- 오류 검출
- 데이터 버퍼링
- 버퍼링(buffering)이란 전송률이 높은 장치와 낮은 장치 사이에 주고받는 데이터를 버퍼(buffer)라는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법이다.
- 장치 컨트롤러의 내부에서 중요한 세 가지는,
- 데이터 레지스터(data register)
- CPU와 입출력장치 사이에 주고받을 데이터가 담기는 레지스터이다.
- 버퍼 역할을 한다.
- 최근 주고받는 데이터가 많은 입출력장치에서는 레지스터 대신 RAM을 사용하기도 한다.
- 상태 레지스터(status register)
- 입출력장치가 입출력 작업을 할 준비가 되었는지, 작업이 완료되었는지, 입출력장치에 오류는 없는지 등의 상태 정보가 저장된다.
- 제어 레지스터(control register)
- 입출력장치가 수행할 내용에 대한 제어 정보와 명령을 저장한다.
- 데이터 레지스터(data register)
장치 드라이버
- 장치 드라이버(device driver)란 장치 컨트롤러의 동작을 감지하고 제어함으로써 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램이다.
- 프로그램이니까 실행 과정에서 메모리에 올라간다.
- 장치 컨트롤러가 입출력 장치를 연결하기 위한 하드웨어적 통로라면, 장치 드라이버는 소프트웨어적 통로다.
장치 컨트롤러가 CPU와 정보를 주고 받는 방법은 크게 세가지 프로그램 입출력, 인터럽트 기반 입출력, DMA 입출력 이 있다.
프로그램 입출력(programmed I/O)
- 프로그램 속 명령어로 입출력장치를 제어하는 방법이다,
- CPU는 입출력 명령어를 만나면 장치 컨트롤러와 상호작용하며 입출력 작업을 수행한다.
- 입출력 작업은 CPU가 장치 컨트롤러의 레지스터 값을 읽고 씀으로써 이루어진다.
- 입출력 명령어에 장치 컨트롤러를 표현하는 방법(?)은 크게 두 가지가 있다.
- 메모리 맵 입출력, 고립형 입출력 이 있다.
메모리 맵 입출력(memory-mapped I/O)
- 메모리에 접근하기 위한 주소 공간과 입출력장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주하는 방법이다.
- 메모리의 주소들이나 장치 컨트롤러의 레지스터들이나 모두 똑같이 메모리 주소를 대하듯 하면 되므로,
- 메모리에 접근하는 명령어나 입출력장치에 접근하는 명령어가 굳이 다를 필요가 없어진다.
고립형 맵 입출력(isolated I/O)
- 메모리에 접근하기 위한 주소 공간과 입출력장치에 접근하기 위한 주소 공간을 분리하는 방법이다.
- 그래서 메모리 주소 공간이 축소되지 않으며, 입출력 전용 명령어를 따로 사용한다.
인터럽트 기반 입출력
- 하드웨어 인터럽트는 장치 컨트롤러에 의해 발생한다.
- 인터럽트 기반 입출력(interrupt-driven I/O)는 말 그래도 인터럽트를 기반으로 하는 입출력이다.
- 인터럽트와 비교되는 개념은 폴링(polling)으로, 입출력장치를 주기적으로 확인하는 방식이다.
- CPU가 플래그 레지스터 속 인터럽트 비트를 비활성화하고 인터럽트를 처리하는 경우 다른 하드웨어 인터럽트를 받아들이지 않음으로써 순차적으로 하드웨어 인터럽트를 처리한다.
- 그러나 인터럽트 비트를 비활성화해도 무시할 수 없는 인터럽트인 NMI(non-maskable interrupt)가 발생한 경우 CPU는 이렇게 우선순위가 높은 인터럽트부터 처리한다.
- 많은 컴퓨터는 PIC(programmable interrupt controller)라는 하드웨어를 사용해 우선순위를 반영한 다중 인터럽트를 처리한다.
- PIC는 여러 장치 컨트롤러에 연결되어 있고, 하드웨어 인터럽트 요청들의 우선순위를 판별한 뒤 CPU에 처리할 하드웨어 인터럽트를 알려준다.
- 더 자세히 과정을 보자면,
- PIC가 장치 컨트롤러에서 인터럽트 요청 신호(들) 받아들임
- 우선순위를 판단한 뒤 CPU에 처리해야 할 인터럽트 요청 신호를 보냄
- CPU는 PIC에 인터럽트 확인 신호를 보냄
- PIC는 데이터 버스를 통해 CPU에 인터럽트 벡터를 보냄
- CPU는 인터럽트 벡터를 통해 인터럽트 요청의 주체를 파악하고, 해당 장치의 인터럽트 서비스 루틴을 실행함
- 장치가 많은 경우 PIC를 여러개 계층적으로 설치하여 많은 하드웨어 인터럽트를 관리한다.
- PIC는 NMI의 우선순위를 판별하지는 않는다! 최우선이니까! 막을 수 있는 하드웨어 인터럽트들의 우선순위만 판별함
DMA 입출력
- 프로그램 기반 입출력과 인터럽트 기반 입출력은 모두 데이터의 이동을 CPU가 주도하고, CPU를 거친다.
- CPU의 효율을 더 높이기 위해 CPU를 거치지 않고 상호작용이 가능한 입출력 방식인 DMA(direct memory access)가 있다.
- DMA 입출력을 하기 위해서는 시스템 버스에 연결된 DMA 컨트롤러 라는 하드웨어가 필요하다.
DMA 입출력 과정
- CPU는 DMA 컨트롤러에 입출력장치의 주소, 수행할 연산, 읽거나 쓸 메모리의 주소 등과 같은 정보로 입출력 작업을 명령한다
- DMA 컨트롤러는 CPU 대신 장치 컨트롤러와 상호작용하며 입출력 작업을 수행한다. 필요한 경우 메모리에 직접 접근에 정보를 읽거나 쓴다
- 입출력 작업이 끝나면 CPU에 인터럽트를 걸어 작업이 끝났음을 알린다.
- CPU는 DMA 컨트롤러에 입출력 작업 명령을 내리고, 인터럽트만 받으면 되므로 작업 부담이 훨씬 적다.
- DMA 컨트롤러가 메모리에 직접 접근할 때 시스템 버스를 이용하는데, 시스템 버스는 공용 자원이라, CPU랑 경쟁할 수 있다.
- 그래서 DMA 컨트롤러의 시스템 버스 이용을 사이클 스틸링(cycle stealing)이라고도 부른다.
입출력 버스
- DMA는 메모리에 한 번 접근할 때마다 시스템 버스를 두 번 이용한다.
- 한 번은 메모리 혹은 장치 컨트롤러에서 DMA 컨트롤러로 데이터를 가져올 때, 이후 장치 컨트롤러에서 장치 컨트롤러 혹은 메모리로 데이터를 보낼 때
- DMA 컨트롤러와 장치 컨트롤러들을 입출력 버스(input/output bus)라는 별도의 버스에 연결하여 해결한다.
- 입출력 버스에는 PCI(peripheral component interconnect) 버스, PIC Express(PCIe) 버스 등 여러 종류가 있다.
정리
- 입출력장치는 장치 컨트롤러를 통해 컴퓨터 내부와 정보를 주고받는다.
- 장치 드라이버는 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램이다.
- 프로그램 입출력은 프로그램 속 명령어로 입출력 작업을 하는 방식
- 메모리 맵 입출력은 메모리에 접근하기 위한 주소 공간과 입출력 장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주하는 입출력 방식
- 고립형 입출력은 메모리에 접근하기 위한 주소 공간과 입출력 장치에 접근하기 위한 주소 공간을 별도로 분리하는 입출력 방식
- 인터럽트 기반 입출력은 인터럽트로써 입출력을 수행하는 방법
- DMA 입출력은 CPU를 거치지 않고 메모리와 입출력장치 간의 데이터를 주고받는 입출력 방식
- 입출력 버스는 입출력장치와 컴퓨터 내부를 연결 짓는 통로로, 입출력 작업 과정에서 시스템 버스 사용 횟수를 줄여준다.
Leave a comment