입출력 장치는 앞서 학습한 CPU 메모리보다 다루기가 까다롭다. 일단 입출력장치에는 종류가 너무도 많다. 장치가 다양하면 장치마다 속도, 데이터 전송 형식 등도 다양 해지며 정보를 주고 받는 방식을 규격화하기가 어렵다.
또 일반적으로 CPU와 메모리의 데이터 전송률은 높지만 입출력 장치의 데이터 전송률은 낮다.(전송률이란 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표) 이러한 이유로 입출력 장치는 장치 컨트롤러를 통해 컴퓨터와 연결된다. 이를 통해 컴퓨터 내부와 정보를 주고 받게 된다.
장치 컨트롤러의 역할
- CPU와 입출력장치 간의 통신 중개(일종의 번역가 역할 수행. 즉 통신의 규격화)
- 오류 검출
- 데이터 버퍼링( 버퍼링이란? : 전송률이 높은 장치와 낮은 장치 사이에 주고 받는 데이터를 버퍼라는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법)
장치 컨트롤러의 구조
장치 컨트롤러는 데이터 레지스터, 상태 레지스터, 제어 레지스터로 이루어져 있다. (단 상태 레지스터와 제어 레지스터는 하나의 레지스터(상태/제어 레지스터)로 사용되기도 함.)
데이터 레지스터 : CPU와 입출력장치 사이에 주고 받을 데이터가 담기는 레지스터 (버퍼라고 볼 수 있음). RAM을 사용하기도 함.
상태 레지스터 : 상태 정보 저장 (입출력 장치가 입출력 작업을 할 준비가 되었는지, 입출력 작업이 완료 되었는지, 입출력장치에 오류는 없는지 등의 상태 정보)
제어 레지스터 : 입출력장치가 수행할 내용에 대한 제어 정보
이러한 장치 컨트롤러의 동작을 감지하고 제어하는 프로그램을 장치 드라이버라고 한다. 장치 컨트롤러가 입출력장치를 연결하기 위한 하드웨어적인 통로라면, 장치 드라이버는 입출력장치를 연결하기 위한 소프트웨어적인 통로라고 할 수 있다. 장치 드라이버를 인식하고 실행할 수 있는 건 운영체제이다.
다양한 입출력 방법
세 가지 입출력 방식이 있는데 프로그램 입출력, 인터럽트 기반 입출력, DMA 입출력이 있다.
프로그램 입출력
프로그램 속 명령어로 입출력장치를 제어하는 방법. 입출력 명령어로써 장치 컨트롤러와 상호작용. 메모리에 저장된 정보를 하드 디스크에 백업하는데 CPU는 하드 디스크 컨트롤러의 제어 레지스터에 쓰기 명령을 내보낸 뒤 하드 디스크 컨트롤러는 하드 디스크 상태를 확인해 상태 레지스터에 준비 완료 표시를 한다. CPU는 상태 레지스터를 주기적으로 읽어보며 하드 디스크의 준비 여부를 확인하고 하드 디스크가 준비가 되었다면 백업할 메모리의 정보를 데이터 레지스터에 쓴다. 만약 아직 백업 작업(쓰기 작업)이 끝나지 않았다면 위 과정을 반복하고 쓰기가 끝났다면 작업이 종료된다.
프로그램 입출력 방식은 CPU가 장치 컨트롤러의 레지스터 값을 읽고 씀으로써 이루어지는데 이를 하기 위한 방법으로 메모리 맵 입출력, 고립형 입출력 두 가지 방법이 있다.
메모리 맵 입출력 : 메모리에 접근하기 위한 주소 공간과 입출력장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주하는 방법
고립형 입출력 : 메모리를 위한 주소 공간과 입출력 장치를 위한 주소 공간을 분리하는 방법. 주소 공간이 다르기 때문에 입출력 읽기/쓰기 선을 활성화 시키는 입출력 전용 명령어를 사용한다.
메모리 맵 입출력 | 고립형 입출력 |
메모리와 입출력장치는 같은 주소 공간 사용 | 메모리와 입출력장치는 분리된 주소 공간 사용 |
메모리 주소 공간이 축소됨 | 메모리 주소 공간이 축소되지 않음 |
메모리와 입출력장치에 같은 명령어 사용 가능 | 입출력 전용 명령어 사용 |
인터럽트 기반 입출력
하드웨어 인터럽트는 결국 장치 컨트롤러에 의해 발생한다. CPU에서 입출력 명령을 내렸을 때 CPU가 반복적으로 확인하는 것이 아니라 장치컨트롤러에서 해당 작업 완료시 인터럽트 요청을 해서 CPU에 알리는 방식이다. 동시다발적인 인터럽트가 발생했을 시 만약 플래그 레지스터 속 인터럽트 비트를 비활성화한 채 인터럽트를 처리하면 인터럽트 발생 순서대로 처리하게 된다.(인터럽트 전부는 아님) 하지만 인터럽트 중에서도 우선 순위가 높은 인터럽트가 있기 때문에 위 방식은 비현실적이다./ 우선 순위 반영 인터럽트를 NMI라고 한다.
DMA 입출력
위 두 가지 방법의 공통점은 입출력장치와 메모리 간의 데이터 이동은 CPU가 주도하고 이동하는 데이터도 반드시 CPU를 거친다는 것이다. 만약 하드 디스크 백업 같이 대용량 데이터를 이동한다면 CPU에 부담이 커진다. 그래서 DMA가 나오는데 CPU를 거치지 않고 입출력장치가 메모리에 직접적으로 접근하는 기능이다.
DMA 입출력 과정
1. CPU는 DMA 컨트롤러에 입출력 작업을 명령
2. DMA 컨트롤러는 CPU 대신 장치 컨트롤러와 상호작용하며 입출력 작업을 수행
3. 입출력 작업이 끝나면 DMA 컨트롤러는 인터럽트를 통해 CPU에 작업이 끝났음을 알림
이 때 DMA 컨트롤러는 필요한 겅우에 메모리에 직접 접근한다. 하지만 문제가 발생한다.
위 예시의 DMA 과정에서 시스템 버스를 이용하게 되는데 시스템 버스는 공용 자원이기에 동시 사용이 불가능하다. CPU가 시스템 버스를 사용할 때 DMA 컨트롤러는 시스템 버스를 사용할 수 없고 DMA 컨트롤러가 시스템 버스를 사용할 때는 CPU가 시스템 버스를 사용할 수 없다.
그래서 DMA 컨트롤러는 CPU가 시스템 버스를 이용하지 않을 때마다 조금씩 시스템 버스를 이용하거나 CPU가 일시적으로 시스템 버스를 이용하지 않도록 허락을 구하고 시스템 버스를 이용한다.
이 때 장치 컨트롤러가 시스템 버스에 직접 연결하면 DMA 과정에서 DMA 컨트롤러가 시스템 버스를 두 번 이용하게 되기 때문에 이 문제를 방지하기 위해 입출력버스에 따로 연결하게 된다.
'CS' 카테고리의 다른 글
[CS] 운영체제 (2) 프로세스 (1) | 2023.07.14 |
---|---|
[CS] 운영체제 (1) 운영체제란? (0) | 2023.07.13 |
[CS] 컴퓨터 구조 (7) 보조기억장치 (0) | 2023.07.06 |
[CS] 컴퓨터 구조 (6) 메모리와 캐시 메모리 (0) | 2023.07.05 |
[CS] 컴퓨터 구조 (5) CPU 설계 기법 (0) | 2023.06.28 |