Priv's Blog

7. 입출력장치 본문

Dev. Study Note/Computer Architecture

7. 입출력장치

Priv 2023. 3. 29. 16:32


 

 

1. 장치 컨트롤러, 장치 드라이버

새로 산 프린터기를 컴퓨터에 연결했을 때 '장치 드라이버 마법사' 등의 프로그램이 자동으로 실행되는 모습을 보았을 것이다.

장치 컨트롤러, 장치 드라이버는 컴퓨터와 다양한 입출력장치들의 상호작용을 위해 필수적인 프로그램이다.

입출력장치는 종류가 굉장히 다양하고, 그 종류마다 속도, 데이터 전송 방식 등이 모두 제각각이다.

또한 외부 입출력장치들은 CPU, 메모리의 속도와 비교했을 때 압도적으로 속도가 느리다.

이를 '데이터 전송률이 낮다'라고 표현한다.

 

1.1) 장치 컨트롤러

장치 컨트롤러는 아래와 같은 역할을 담당하여 위에서 언급한 다양한 문제들을 해결해 줄 수 있다.

  • CPU, 입출력장치 간의 통신 중계
  • 오류 검출
  • 데이터 버퍼링

장치 컨트롤러는 데이터 레지스터, 상태 레지스터, 제어 레지스터 등으로 구성되어 있다.

  • 데이터 레지스터: CPU, 입출력장치 사이의 데이터를 주고받을 때 사용되는 레지스터. 버퍼링을 수행할 때 버퍼의 역할을 담당한다. 데이터의 양이 많을 경우, RAM을 대신 사용하기도 한다.
  • 상태 레지스터: 입출력장치의 상태를 검사하는 레지스터. 입출력 작업이 가능한지, 현재 오류가 발생하지는 않았는지 등을 검사한다.
  • 제어 레지스터: 입출력장치가 수행할 내용에 대한 제어 정보, 명령이 저장되는 레지스터.

 

1.2) 장치 드라이버

장치 드라이버는 소프트웨어이다.

장치 컨트롤러의 동작을 감지, 제어하는 역할을 수행하며 입출력장치가 컴퓨터와 상호작용할 수 있도록 도와준다.

입출력장치의 종류에 따라서 장치 드라이버 또한 달라진다.

이 장치 드라이버를 인식하고 실행하는 주체는 OS(운영체제)이다.

 


 

2. 입출력 방법

입출력 작업을 수행하려면 CPU, 장치 컨트롤러가 데이터를 주고받아야 한다.

이 데이터를 주고받는 방법은 크게 3가지가 있다.

 

2.1) 프로그램 입출력

프로그램 명령어를 통해 입출력장치를 제어한다.

CPU가 명령어를 처리하던 도중 입출력 명령어를 만나면 장치 컨트롤러와 통신을 시작한다.

만약 'HDD에 데이터를 기록하라'라는 명령어를 만난다면, CPU와 장치 컨트롤러는 다음과 같은 방식으로 동작한다.

  • CPU가 장치 컨트롤러의 제어 레지스터에 쓰기 명령을 기록한다.
  • 장치 컨트롤러가 HDD의 상태를 확인하여 상태 레지스터에 준비 완료 상태 값을 기록한다.
  • CPU는 상태 레지스터의 준비 완료 상태 값을 읽은 뒤, HDD에 기록해야 할 데이터를 데이터 레지스터로 전달한다.

여기서 CPU는 장치 컨트롤러의 레지스터를 알고 있어야 데이터를 보내고 읽을 수 있을 것이다.

하지만 여러 장치 컨트롤러 속에 존재하는 수많은 레지스터들의 정보를 CPU가 모두 알고 있을 수는 없다.

이를 위해 메모리 맵 입출력, 고립형 입출력 방식이 존재한다.

 

- 메모리 맵 입출력

메모리에 접근하기 위한 주소 공간, 입출력장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주하는 방법이다.

만약 1024개의 주소 표현이 가능한 메모리가 있다면, 그중에서 512개는 메모리 주소를, 나머지 512개는 장치 컨트롤러 레지스터를 표현하는 데 사용한다.

만약 CPU가 517번지 주소에 있는 값을 읽으라는 명령어를 처리하게 되었다면, 별도의 작업 없이 그냥 연결된 장치 컨트롤러의 레지스터에서 값을 읽어오면 된다.

또한 CPU가 518번지 주소에 데이터를 쓰라는 명령어를 처리하게 되었다면, 이때도 별도의 작업 없이 그냥 연결된 장치 컨트롤러의 레지스터에 값을 쓰면 된다.

이 덕분에 메모리 맵 입출력 방식을 사용하면 메모리 접근 명령, 입출력장치 접근 명령은 별 차이가 없다.

 

- 고립형 입출력

고립형 입출력은 메모리를 위한 주소 공간, 입출력장치를 위한 주소 공간을 분리하는 방법이다.

이 경우에는 서로 다른 명령어를 사용해야 하며, 메모리 주소 공간이 축소되지 않는다.

 

2.2) 인터럽트 기반 입출력

인터럽트 기반 입출력은 인터럽트 명령을 통해서 입출력 장치와 상호작용하는 방식이다.

CPU가 입출력 명령을 장치 컨트롤러에게 전달하면, 장치 컨트롤러가 입출력 명령을 처리하기 시작할 것이다.

이 명령이 처리되는 동안, CPU는 다른 명령어들을 처리하면서 시간을 보낸다.

이때, 입출력 명령을 모두 처리한 장치 컨트롤러가 CPU에게 인터럽트 요청 신호를 보내 입출력 명령 처리가 완료되었다는 메시지를 보낸다.

그러면 CPU는 인터럽트 명령을 처리하는 절차에 따라 진행 중이던 명령들을 백업하고 인터럽트 서비스 루틴을 실행한다.

우리가 컴퓨터를 사용하는 경우를 보면 여러 입출력장치들이 동시에 작동하는 경우가 흔하다.

마우스, 키보드, 스피커, 모니터만 따져봐도 벌써 4가지나 된다.

이처럼 인터럽트 여러 개가 동시에 발생한다면, CPU는 어떻게 일을 처리할까?

가장 간단한 방식은 그냥 인터럽트 발생 순서대로 처리하는 것이다.

인터럽트 A를 처리하는 도중에 인터럽트 B가 발생하면 당장은 B를 무시하고 A가 끝난 뒤에 B를 실행하는 방식이다.

하지만 이 방식은 효율과 융통성이 떨어지는 방식이다.

우선순위를 통해 인터럽트의 처리 순서를 결정하면 이를 해결할 수 있다.

우선순위를 반영하여 처리하는 방식은 다양하지만, 프로그래머블 인터럽트 컨트롤러, PIC라는 하드웨어를 사용하는 방식을 흔히 사용한다.

PIC는 장치 컨트롤러에서 전달받은 인터럽트 요청들을 우선순위를 매겨서 CPU에게 처리해야 할 인터럽트를 골라 전달하는 역할을 한다.

PIC는 인터럽트 비트를 통해 막을 수 있는 인터럽트만 관리하며, 인터럽트 비트 값을 무시하는 최우선 인터럽트, NMI는 무시한다.

애초에 NMI는 어떠한 경우에도 가장 먼저 처리하라는 인터럽트이기 때문에 우선순위를 따지는 게 의미가 없다.

 

- 풀링

인터럽트와 자주 비교되는 개념이 바로 풀링이다.

인터럽트는 명령을 처리하는 주체(입출력장치)가 명령을 대기하는 상대(CPU)에게 명령 처리가 끝났음을 알려주는 방식이다.

풀링은 명령을 대기하는 주체(CPU)가 명령을 처리하는 상대(입출력장치)의 작업이 끝났는지 주기적으로 확인하는 방식이다.

당연히 풀링 방식이 인터럽트 방식보다 자원 소모가 크기 때문에 인터럽트 방식보다 불리하다.

 

2.3) DMA 입출력

프로그램 기반 입출력, 인터럽트 기반 입출력은 항상 CPU가 관여하는 방식이다.

이는 CPU의 일처리 효율을 떨어트릴 수 있다는 부담이 있다.

DMA 입출력 방식은 이 문제를 해결하기 위해 CPU를 거치지 않는다.

그 대신, DMA 컨트롤러라는 별도의 하드웨어를 사용한다.

DMA 컨트롤러는 시스템 버스와 연결되어 있어서 직접 메모리에 접근할 수 있다.

DMA 입출력 과정은 다음과 같다.

  • CPU가 DMA 컨트롤러에게 입출력 작업을 명령한다.
  • DMA 컨트롤러가 장치 컨트롤러와 상호작용을 통해 입출력 명령을 수행한다.
  • 입출력 명령 처리가 끝났음을 인터럽트를 통해 전달한다.

여기서 주의할 점은 DMA 컨트롤러가 다른 장치들과 상호작용할 때 쓰이는 시스템 버스는 공용 자원이라는 것이다.

즉, DMA 컨트롤러가 시스템 버스를 통해 데이터를 주고받고 있으면 CPU는 시스템 버스를 쓸 수 없다.

이 때문에 DMA 컨트롤러는 CPU가 시스템 버스를 쓰고 있는지를 알아야 하며, 필요할 경우 CPU가 사용 중인 시스템 버스를 강탈(사이클 스틸링) 하기도 한다.

 

- 입출력 버스

DMA 컨트롤러와 장치 컨트롤러는 입출력 버스를 통해 연결된다.

DMA 컨트롤러가 다른 장치들과 상호작용하기 위해 시스템 버스를 자주 사용하면 그만큼 CPU의 작업 효율이 떨어질 수 있다.

이를 방지하기 위해 DMA 컨트롤러, 장치 컨트롤러가 사용하는 별도의 버스(입출력 버스)가 존재한다.

PCI 버스, PCIe 버스가 대표적인 입출력 버스이다.

그래픽 카드를 연결할 때 PICe 슬롯에 연결하라는 말을 들어보았을 것이다.

 


 


수고하셨습니다!


'Dev. Study Note > Computer Architecture' 카테고리의 다른 글

6. 보조기억장치  (0) 2023.03.28
5. RAM  (0) 2023.03.26
4. CPU  (0) 2023.03.19
3. 명령어  (0) 2023.03.12
2. 데이터  (0) 2023.03.12
Comments