[CS] 컴퓨터 구조 - 입출력 장치

이상혁·2023년 9월 16일
0

Computer science

목록 보기
8/15
혼자 공부하는 컴퓨터 구조 + 운영체제를 읽고 공부한 내용입니다.

장치 컨트롤러와 장치 드라이버

장치 컨트롤러

입출력 장치는 CPU나 메모리보다 다루기가 까다롭다.

입출력 장치에는 종류가 너무 많다.
다양하고 종류가 많기 때문에 이를 규격화하기가 어렵다.

CPU와 메모리의 데이터 전송률은 높지만 입출력장치의 데이터 전송률은 낮다.
전송률은 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표이다.
CPU와 메모리는 이 전송률이 높기 때문에 1초에도 많은 데이터를 주고 받을 수 있다.
하지만 입출력 장치는 전송률이 낮기 때문에 많은 데이터를 주고 받을 수 없고 이 전송률의 차이가 크다.
전송률의 차이가 크면 통신하기가 어렵다.

이러한 이유들로 입출력 장치는 컴퓨터의 직접 연결하지 않고 장치 컨트롤러라는 하드웨어를 통해서 연결이 된다.

장치 컨트롤러는 CPU와 입출력장치 간의 통신 중개, 오류 검출, 데이터 버퍼링을 해결한다.

버퍼링이란 전송률이 높은 장치와 낮은 장치 사이에 주고 받는 데이터를 버퍼라는 임시 저장 장치에 저장한 후 전송률을 비슷하게 맞추는 방법이다.
데이터를 조금씩 모았다가 한꺼번에 내보내거나 데이터를 한 번에 많이 받아서 조금씩 내보는 방법이다.
즉, 입출력이 높은 CPU나 메모리와 전송률이 낮은 입출력 장치의 전송률의 차이를 맞춰 주는 것을 데이터 버퍼링이라고 한다.

제어 컨트롤러의 구조를 살펴보면 데이터 레지스터, 상태 레지스터, 제어 레지스터 3가지이다.

데이터 레지스터는 CPU와 입출력장치 사이에서 주고 받을 데이터가 담기는 레지스터이다. 버퍼링에서 데이터를 저장하는 공간을 버퍼라고 했는데 이 버퍼의 역할을 하는 곳이다.

상태 레지스터는 입출력 장치가 입출력 작업을 할 준비가 되어 있는지, 입출력 작업을 완료되었는지, 입출력 장치의 오류는 없는지 등의 상태 정보가 저장이 되는 레지스터이다.

제어 레지스터는 입출력 장치가 수행할 내용에 대한 제어 정보와 명령를 저장하는 레지스터이다.

장치 드라이버

장치 드라이버란 장치 컨트롤러의 동작을 감지하고 제어함으로써 장치 컨트롤러가 컴퓨터 내부와 정보를 주고 받을 수 있게 하는 프로그램이다.
즉, 새로운 장치를 컴퓨터와 연결하려면 장치 드라이버를 설치해야 한다.

다양한 입출력 방법

CPU와 장치 컨트롤러가 데이터를 주고 받는 방법은 프로그램 입출력, 인터럽트 기반 입출력, DMA 입출력이다.

프로그램 입출력은 프로그램 속 명령어로 입출력장치를 제어하는 방법이다.
CPU가 프로그램을 실행하다가 입출력 명령어를 만나서 입출력 장치 컨트롤러와 상호작용해서 입출력장치를 수행하는 것이다.

과정을 살펴보면
1. 입출력 명령어를 만나면 제어 레지스터에 명령을 보내고
2. 입출력 장치의 상태를 확인한다.
3. 입출력 장치가 준비가 되면 CPU가 이를 확인하고 데이터를 데이터 레지스터에 보내고 명령어를 실행한다.
4. CPU는 상태 레지스터를 수시로 확인하면 끝났는 지 확인하고 끝났다면 작업을 종료한다.

이 때, CPU는 입출력 장치의 레지스터들 어떻게 알까?
그리고 메모리에 어떻게 저장이 될까?
즉, CPU가 장치 컨트롤러 레지스터 값을 알기 위한 방법으로서 2가지 방법이 있는데 메모리 맵 입출력고립형 입출력이 있다.

메모리 맵 입출력은 메모리에 접근하기 위한 주소 공간과 입출력 장치에 접근하기 위한 공간을 하나의 주소 공간으로 간주한다.
그래서 반은 메모리를 위한 공간, 반은 입출력 장치를 위한 공간으로 사용한다.
이 때, 메모리에 접근하는 명령어와 입출력 장치에 접근하는 명령어가 같다.

고립형 입출력 장치는 메모리를 위한 공간과 입출력 장치를 위한 공간을 분리하는 방법이다.
그래서 메모리 맵 입출력방법과 달리 메모리를 위한 공간에 쓰는 명령어와 입출력 장치를 위한 공간에 쓰는 명령어가 다르다.

인터럽트 기반 입출력은 인터럽트를 통해서 입출력을 수행한다.
CPU는 장치 컨트롤러에게 입출력 명령을 내리면
장치 컨트롤러는 그 명령어를 수행하고 CPU는 다른 일을 하고 있는다.
그리고 입출력 작업이 끝나면 장치 컨트롤러는 CPU에게 인터럽트 요청 신호를 보내고 CPU는 하던 일을 멈추고 인터럽트 서비스 루틴을 실행한다.

만약, 여러 개의 입출력 장치가 있고 입출력 장치들에서 동시 인터럽트 요청 신호를 보내면 어떻게 할까?

인터럽트가 발생한 순서대로 처리하는 방법도 있지만 인터럽트에도 우선적으로 해결해야하는 인터럽트가 있을 수 있다.
그래서 우선순위에 따라 인터럽트 순으로 처리한다.
인터럽트 우선순위를 판뱔한 뒤 CPU에 알려주는 장치가 프로그래머블 인터럽트 컨트롤러(PIC)이다.

과정을 살펴보면
1. PIC가 장치 컨트롤러들의 인터럽트 요청 신호를 받아들이고
2. PIC는 인터럽트의 우선순위를 판단한 뒤 CPU에게 인터럽트 요청 신호를 보낸다.
3. CPU는 PIC에 인터럽트 확인 신호를 보내고
4. PIC는 인터럽트 벡터를 보내고
5. CPU는 인터럽트 벡터를 참고 해서 인터럽트 서비스 루틴을 실행한다.

DMA 입출력은 프로그램 입출력과 인터럽트 기반 입출력과 다르게
입출력 장치와 메모리가 CPU를 거치지 않고 직접 서로 상호작용할 수 있도록 하는 방식이다.

이 방식이 효율적인 이유는 메모리와 입출력 장치가 서로 소통을 하면서 CPU를 거치게 되면 CPU의 시간을 빼앗기 때문이다.

이 방법을 사용하기 위해선 DMA 컨트롤러라는 하드웨어가 필요하다.

과정을 살펴보면
1. CPU가 DMA 컨트롤러에 입출력과 관련되 정보와 함께 명령을 내린다.
2. DMA에는 CPU를 대신해서 장치 컨트롤러와 상호작용하며 입출력 작업을 수행한다. 이 때, 필요하면 메모리에 직접 접근해서 정보를 읽거나 쓴다.
3. 작업이 끝나면 DMA는 CPU에 작업일 끝났음을 알린다.

이 때, 한 가지 고려해야 하는 경우가 있다.
DMA는 시스템 버스로 메모리에 접근을 하는데 시스템 버스는 동시 접근이 불가능하다.
CPU가 시스템 버스를 사용하고 있으면 이용할 수 없고
반대로 DMA가 사용을 하고 있다면 CPU가 시스템 버스를 이용할 수 없다.

그래서 DMA에는 CPU가 시스템 버스를 사용하지 않거나 CPU에게 허락을 구하고 시스템 버스를 이용한다.

DMA가 작업을 하다가 보면 메모리와 입출력 장치와 상호작용을 할 때, 시스템 보스를 2번을 이용해야 하는데 이용하는 만큼 CPU가 시스템 버스를 이용하지 못 한다.

이 문제를 해결하기 위해서 입출력 버스를 이용하는데 입출력 버스 입출력 장치들과 연결이 되어 있어서 시스템 버스의 이용 횟수를 줄여준다.

profile
개발 공부 하기 위해 만든 블로그

0개의 댓글