컴퓨터 하드웨어는 크게 중앙처리장치(CPU), 메인 메모리(기억 장치), 입출력 장치로 나뉘며 이들은 모두 버스(Bus)로 연결되어 있습니다. 이번 포스팅에서는 입출력 장치에 대해서 알아보겠습니다.
입출력 장치 (I/O Device)
포트(Port)는 컴퓨터와 외부의 다른 장비를 연결할 수 있게 하는 통로를 말합니다. 기본적으로 직렬 포트와 병렬 포트로 나눌 수 있습니다.
- 직렬 포트: 한 번에 하나의 신호를 전달할 수 있고, 보통 저속의 장치와 연결된다.
- 병렬 포트: 여러 비트의 신호를 동시에 전달할 수 있고, 직렬 포트에 비해서 고속 인터페이스를 제공한다.
- USB: 컴퓨터와 주변 기기를 연결하는데 쓰이는 입출력 표준 가운데 하나, 직렬/병렬 포트의 많은 부분을 대체한다.
입력 장치
입력 장치는 외부의 데이터를 컴퓨터의 CPU나 주기억 장치로 입력할 때 사용하는 장비입니다.
- 키보드
- CD / DVD 등의 광디스크
- 하드 디스크
- SSD
- USB 저장장치
- 마우스
- 카메라
출력 장치
출력 장치는 CPU나 주기억 장치의 데이터를 외부로 옮길 때 사용하는 장비입니다.
- 모니터
- 프린터
- 스피커
- 하드 디스크
- CD / DVD 등의 광디스크
- USB 저장장치
입출력 장치의 제어 방식
속도가 빠른 CPU가 느린 입출력 장치를 기다리는 것은 비효율적이기에 입출력 제어기(I/O Controller)를 통해 입출력 장치를 제어합니다.
CPU에 의한 입출력 제어
CPU에 의한 입출력 방식은 입출력의 전체적인 과정을 CPU가 수행하는 것입니다. 다음의 2가지 방식으로 CPU 입출력의 전체 과정을 통제합니다.
- 프로그램에 의한 방법: 현재 수행되는 프로그램이 I/O를 직접 수행하는 방식입니다. 입출력 장치의 모든 과정을 CPU가 담당하기에 CPU의 효율이 떨어질 수 있습니다.
- 인터럽트에 의한 방법: 프로그램 명령 중 입출력 명령이 있으면 CPU가 입출력 동작의 시작을 명령하고 다른 작업으로 전환합니다. 인터럽트가 발생하면 관련 인투럽트 처리 루틴을 수행하여 CPU는 입출력 과정을 종료합니다. 인터럽트에 관해서는 아래에서 조금 더 자세히 살펴보겠습니다.
DMA(Direct Memory Access) 방식
DMA는 별도의 I/O 컨트롤러가 입출력 장치와 메인 메모리 사이의 데이터 통신을 수행하는 방식으로, CPU의 효율성을 더욱 높일 수 있는 방법입니다. I/O 컨트롤러는 CPU로부터 입출력의 모든 사항을 위임 받아 수행하는데 상대적으로 속도가 빠른 장치와 대량의 데이터를 입출력할 때 사용되는 방식입니다. DMA 방식의 입출력 절차는 다음과 같습니다.
- 사용자 프로그램 또는 운영체제가 데이터의 전송을 요구한다.
- CPU는 DMA 제어기의 레지스터들에게 "I/O 장치의 주소", "데이터가 있는 주기억 장치의 시작 주소", "DMA 시작 명령", "입출력하고자 하는 데이터의 양" 등의 정보를 전송한다.
- DMA 제어기가 입출력 동작을 시작하며, 사이클 스틸 방식을 이용하여 데이터를 전송한다. 그때, CPU는 다른 작업들을 수행한다.
- 입출력 동작이 종료되면 DMA 제어기는 CPU를 인터럽트한다.
채널에 의한 I/O
I/O를 위한 특별한 명령어를 I/O 프로세서에 수행하도록 하여 CPU 관여 없이 입출력을 제어하는 전용 프로세서를 사용하는 방식입니다. DMA 방식과는 다르게 한 개의 인스트럭션에 의해 여러 개의 블록을 입출력할 수 있습니다.
기억 장치-사상 입출력
메모리 주소의 일정 범위를 지정하여 장치 레지스터에 매핑하여 메인 메모리의 읽기/쓰기와 동일한 인스트럭션을 사용해 보다 편리한 입출력 장치 접근을 제공하는 방식입니다. 고속의 응답 시간을 가지는 장치에 적합한 방식입니다.
인터럽트 (Interrupt)
인터럽트란 CPU가 특정 기능을 수행하는 도중에 급하게 다른 일을 처리하고자 할 때 사용할 수 있는 기능입니다. 단일 CPU로는 한 순간에 하나의 일 밖에 처리할 수 없기에 우선 순위를 따져 더 급한 일을 처리해야 할 떄 대처할 수 있는 방법입니다. 인터럽트의 처리 과정은 다음과 같습니다.
- 기존의 작업을 수행하던 중 인터럽트가 발생하면, 현재 컴퓨터가 수행하는 일을 중단하고 현재 컴퓨터의 상태를 보관한다.
- 해당하는 인터럽트를 처리하기 위한 인터럽트 서비스 루틴을 수행한다.
- 인터럽트 처리 후 저장되었던 이전 작업 상태를 복구하고 이전 작업 수행을 재개한다.
인터럽트는 다양한 종류가 있는데 일반적으로 사용되는 것들은 다음과 같습니다.
- 외부 인터럽트: 입출력 장치, 타이밍 장치, 전원 등의 외부적인 요인에 의해 발생하는 인터럽트
- 내부 인터럽트: 잘못된 명령이나 데이터를 사용할 때 발생하는 인터럽트
인터럽트 우선순위
하나의 CPU에 다수의 인터럽트가 발생하는 경우, 우선 순위를 정해 하나씩 처리해야 합니다. 이를 인터럽트 우선순위라고 합니다. 다음의 순서대로 중요한 인터럽트가 우선적으로 처리되어야 합니다.
- 전원 공급의 이상
- CPU의 기게적인 오류
- 외부 신호에 의한 인터럽트
- 입출력 전송 요청 및 전송 완료, 전송 오류
- 프로그램 검사 인터럽트
- 수퍼바이저 호출(SVC 인터럽트)
인터럽트 우선 순위를 결정하는 방법은 소프트웨어적인 방법과 하드웨어적인 방법으로 나뉩니다.
- 소프트웨어적인 방법(폴링(Polling)): CPU가 모든 제어기에 연결된 TEST I/O 선을 이용하여 인터럽트를 요청한 장치를 검사하는 방법입니다. INTR 선에 올린 요청 플래그를 차례대로 검사해 해당하는 인터럽트 서비스 루틴을 수행하는 소프트웨어적인 방식입니다.
- 하드웨어적인 방법(벡터 인터럽트(Vector Interrupt)): 인터럽트를 요청할 수 있는 장치에 버스를 직렬 또는 병렬로 연결하여 인터럽트 요청 장치의 번호를 CPU에게 알리는 방식입니다.