입출력

섬네일
입출력(入出力, )은 컴퓨터와 같은 정보 처리 시스템과 외부 세계(다른 컴퓨터 시스템, 주변 장치 또는 인간 운영자) 사이의 통신이다. 입력은 시스템이 수신하는 신호나 데이터이며, 출력은 시스템에서 전송되는 신호나 데이터이다. 이 용어는 동작의 일부로도 사용될 수 있는데, "I/O를 수행한다"는 것은 입력 또는 출력 작업을 수행하는 것을 의미한다.

는 인간(또는 다른 시스템)이 컴퓨터와 통신하기 위해 사용하는 하드웨어 부품이다. 예를 들어, 키보드나 마우스는 컴퓨터의 입력 장치이며, 모니터와 프린터는 출력 장치이다. 모뎀이나 네트워크 카드와 같이 컴퓨터 간의 통신을 위한 장치는 일반적으로 입력과 출력 작업을 모두 수행한다. 상호 작용자에 의한 시스템과의 모든 상호 작용은 입력이며, 시스템이 반응하는 것을 출력이라고 한다.

장치를 입력 또는 출력으로 지정하는 것은 관점에 따라 달라진다. 마우스와 키보드는 인간 사용자가 내보내는 물리적 움직임을 받아 컴퓨터가 이해할 수 있는 입력 신호로 변환하며, 이러한 장치의 출력은 컴퓨터의 입력이 된다. 마찬가지로 프린터와 모니터는 컴퓨터가 출력하는 신호를 입력으로 받아 인간 사용자가 이해할 수 있는 표현으로 변환한다. 인간 사용자의 관점에서 이러한 표현을 읽거나 보는 과정은 출력을 받는 것이다. 이러한 컴퓨터와 인간 사이의 상호 작용 유형은 인간-컴퓨터 상호 작용 분야에서 연구된다. 더 복잡한 점은 전통적으로 입력 장치로 간주되는 장치(예: 카드 판독기, 키보드)가 제어 명령(예: 스태커 선택, 키보드 표시등 켜기)을 받아들일 수 있는 반면, 전통적으로 출력 장치로 간주되는 장치가 상태 데이터(예: 토너 부족, 종이 없음, 종이 걸림)를 제공할 수 있다는 것이다.

컴퓨터 구조에서 CPU와 개별 명령어를 사용하여 CPU가 직접 읽거나 쓸 수 있는 주기억장치의 조합은 컴퓨터의 두뇌로 간주된다. 예를 들어 디스크 드라이브에서 데이터를 읽는 것과 같이 CPU/메모리 조합으로 정보를 전달하거나 그로부터 정보를 전달받는 모든 행위는 I/O로 간주된다. CPU와 그 지원 회로는 장치 드라이버 구현과 같은 저수준 컴퓨터 프로그래밍에서 사용되는 메모리 맵 입출력을 제공하거나 I/O 채널에 대한 접근을 제공할 수 있다. I/O 알고리즘은 디스크 드라이브와 같은 보조 기억 장치와 데이터를 교환할 때 지역성을 활용하고 효율적으로 수행되도록 설계된 알고리즘이다.

 인터페이스 
I/O 장치가 프로세서에 의해 구동될 때마다 I/O 인터페이스가 필요하다. 일반적으로 CPU는 버스를 통해 장치와 통신한다. 인터페이스는 프로세서가 생성한 장치 주소를 해석하는 데 필요한 논리 회로를 갖추어야 한다. 핸드셰이킹은 적절한 명령(BUSY, READY, WAIT 등)을 사용하여 인터페이스에 의해 구현되어야 하며, 프로세서는 인터페이스를 통해 I/O 장치와 통신할 수 있다. 서로 다른 데이터 형식이 교환되는 경우, 인터페이스는 직렬 데이터를 병렬 형태로 또는 그 반대로 변환할 수 있어야 한다. 프로세서가 입력 장치로부터 데이터를 기다리는 동안 유휴 상태로 있는 것은 낭비이므로, 필요한 경우 프로세서가 추가 처리를 할 수 있도록 인터럽트와 해당 유형 번호를 생성하기 위한 규정이 있어야 한다.

메모리 맵 입출력을 사용하는 컴퓨터는 컴퓨터가 일반적으로 메모리에 접근할 때 사용하는 것과 동일한 어셈블리어 명령어를 사용하여 특정 메모리 위치에 읽고 씀으로써 하드웨어에 접근한다. 대안적인 방법은 CPU가 I/O를 위한 특수한 명령어를 가져야 하는 포트 맵 입출력을 통한 방법이다. 입력 및 출력 장치는 모두 크게 다를 수 있는 데이터 처리 속도를 가진다. 매우 빠른 속도로 데이터를 교환할 수 있는 일부 장치의 경우 CPU의 지속적인 도움 없이 메모리에 직접 메모리 접근 (DMA)하는 것이 필요하다.

 고수준 구현 
고수준 운영체제 및 프로그래밍 기능은 별도의 더 추상적인 I/O 개념과 프리미티브를 사용한다. 예를 들어, 대부분의 운영체제는 응용 프로그램에 파일 개념을 제공한다. 대부분의 프로그래밍 언어는 언어의 문(statement)이나 표준 라이브러리의 함수로서 I/O 기능을 제공한다.

특수한 프리미티브 함수의 대안은 I/O 모나드인데, 이는 프로그램이 I/O를 기술만 하도록 허용하고 실제 동작은 프로그램 외부에서 수행되도록 한다. 이는  함수가 모든 프로그래밍 언어에 부작용을 일으킬 수 있지만, 이 방식을 통해 순수 함수형 프로그래밍을 실용적으로 만들 수 있다는 점에서 주목할 만하다.

운영체제에서 제공하는 I/O 기능은 레코드를 포함하는 파일이 있는 레코드 지향 파일 시스템일 수도 있고, 바이트 스트림을 포함하는 파일이 있는 스트림 지향일 수도 있다.

 입출력 채널 
입출력 채널은 I/O 작업을 수행하도록 특별히 설계된 명령어를 사용해야 한다. I/O 명령어는 채널 또는 채널과 장치를 지정하며, 채널은 다른 모든 필요한 주소 지정 및 제어 정보에 비동기적으로 접근한다. 이는 DMA와 유사하지만 더 유연하다.

 포트 맵 입출력 
포트 맵 입출력 또한 특수한 I/O 명령어의 사용을 필요로 한다. 일반적으로 하나 이상의 포트가 장치에 할당되며, 각 포트는 특별한 목적을 가진다. 포트 번호는 일반 명령어가 사용하는 것과는 별개의 주소 공간에 있다.

 직접 메모리 접근 
직접 메모리 접근 (DMA)은 장치가 CPU와 독립적으로 메모리와 대량의 데이터를 주고받을 수 있는 수단이다.

 같이 보기 
 입출력 포트
 제어 장치
 연산 장치
 기억 장치
 사용자 인터페이스
 입출력 인터페이스

 각주