입출력장치
입출력장치는 컴퓨터와 외부 세계(사용자, 저장장치, 네트워크 등) 사이에서 데이터를 주고받는 장치이다. CPU와 속도·동작 방식이 크게 달라 이를 효율적으로 관리하기 위해 운영체제의 제어와 중재가 필요하다.
장치 컨트롤러
: 위와 같은 이유로 입출력장치는 장치 컨트롤러를 통해 컴퓨터와 연결된다.
→ 입출력 장치는 장치 컨트롤러를 통해 컴퓨터 내부와 정보를 주고받는다.
& 버퍼링
: 전송률이 높은 장치와 낮은 장치 사이에 주고받는 데이터를 버퍼라는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법
장치 컨트롤러의 역할


: 장치 컨트롤러의 동작을 감지하고 제어하는 프로그램
→ 장치 컨트롤러가 입출력장치를 연결하기 위한 하드웨어적인 통로라면, 장치 드라이버는 입출력장치를 연결하기 위한 소프트웨어적인 통로이다.
→ 운영체제가 연결된 장치 드라이버를 인식하고 실행할 수 있다면 컴퓨터 내부와 정보를 주고받을 수 있다.

입출력 방식 3가지
: 프로그램 속 명령어로 입출력장치를 제어하는 방법
→ 입출력 명령어로써 장치 컨트롤러와 상호작용한다
→ CPU가 장치 컨트롤러 레지스터 값을 읽고 씀으로써 이루어진다.
메모리에 접근하기 위한 주소 공간과 입출력장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주하는 방법
→ 특정 메모리 주소에 읽기·쓰기를 수행하면 실제로는 장치 컨트롤러의 레지스터가 접근되어 I/O 동작이 일어나는 구조이다.
→ 별도의 입출력 전용 명령어가 필요 없고, CPU가 메모리에 접근하듯 I/O를 처리할 수 있어 명령어 세트가 단순해지는 장점이 있다.

: 메모리를 위한 주소 공간과 입출력 장치를 위한 주소 공간을 분리하는 방법
-> 고립형 입출력은 입출력 장치를 위한 별도의 주소 공간(I/O 포트 주소) 을 두고,전용 I/O 명령어(IN, OUT 등) 를 사용하여 장치를 제어하는 방식이다.
→ 이 방식은 메모리 공간을 보존할 수 있지만, 전용 명령어가 필요해 명령어 세트가 복잡해질 수 있다는 특징이 있다.

인터럽트 기반 입출력은 I/O 작업이 완료되면 장치가 CPU에 인터럽트를 보내 알리고,CPU는 그때 필요한 처리만 수행하는 방식이다.
하드웨어 인터럽트는 장치 컨트롤러에 의해 발생한다.

동시다발적인 인터럽트 : 입출력장치가 많을 때는 인터럽트를 어떻게 처리하는가


: CPU의 개입 없이 DMA 컨트롤러가 I/O 장치와 메모리 사이의 데이터 전송을 직접 처리하는 방식이다.
CPU는 단지 DMA에게 전송할 메모리 주소, 장치, 데이터 크기 등을 지시하고,실제 데이터 복사는 DMA 컨트롤러가 처리한다.
전송이 끝나면 DMA가 인터럽트로 완료 사실을 CPU에 알린다. 이 방식은 대량의 데이터를 빠르게 전송할 수 있고, CPU가 복사 작업에서 완전히 해방되므로 시스템 성능이 크게 향상된다는 장점이 있다

(1) CPU는 DMA 컨트롤러에 입출력 작업을 명령
(2) DMA 컨트롤러는 CPU 대신 장치 컨트롤러와 상호작용하며 입출력 작업을 수행
(3) 입출력 작업이 끝나면 DMA 컨트롤러는 인터럽트를 통해 CPU에 작업이 끝났음을 알림
주의)
DMA 과정에서 시스템버스를 이용하는데 , 시스템 버스는 공용 자원이기에 동시 사용이 불가능하다.
그래서 ,CPU가 시스템 버스를 사용할 때 DMA 컨트롤러는 시스템 버스를 사용할 수 없고, DMA 컨트롤러가 시스템 버스를 사용할 때는 CPU가 시스템 버스를 사용할 수 없다
그래서, DMA 컨트롤러는 CPU가 시스템 버스를 이용하지 않을 때마다 조금씩 시스템 버스를 이용한다.
CPU가 일시적으로 시스템 버스를 이용하지 않도록 허락을 구하고 시스템 버스를 이용한다.

→ 장치 컨트롤러는 입출력 전용인 입출력 버스를 이용한다.
→ 장치컨트롤러가 시스템 버스에 직접 연결되는 충돌을 줄이기 위함이다.
→ 장치 컨트롤러는 메모리 버스와 동작 특성이 다르고 속도도 느리기 때문에, 시스템 성능과 확장성을 위해 전용 I/O 버스를 사용하게 되었다.
정리
입출력장치는 컴퓨터와 외부 세계 사이에서 데이터를 주고받는 장치로, CPU와 동작 속도·방식이 크게 달라 운영체제의 관리가 필수적이다. 장치 간 규격이 모두 다르기 때문에 이를 추상화해 통일된 방식으로 사용할 수 있도록 장치 컨트롤러와 장치 드라이버가 중간에서 하드웨어·소프트웨어적으로 통신을 중개한다. 장치 컨트롤러는 데이터·상태·제어 레지스터와 버퍼링을 통해 CPU와 장치 간 전송을 담당하고, 드라이버는 이를 운영체제가 인식하도록 연결하는 프로그램적 통로 역할을 한다.
입출력 방식에는 크게 세 가지가 있다. 첫째, CPU가 직접 장치를 제어하는 프로그램 입출력 방식으로, 메모리 주소 공간을 공유하는 메모리 맵 방식과 별도 I/O 주소를 사용하는 고립형 방식이 있다. 둘째, 작업이 완료되면 장치가 CPU에 인터럽트를 보내는 인터럽트 기반 I/O가 있으며, 다수 장치를 관리하기 위해 PIC 같은 우선순위 관리 장치가 사용된다. 마지막으로 DMA 방식은 별도의 DMA 컨트롤러가 CPU 대신 메모리와 장치 간 데이터를 직접 전송해 고속·대용량 I/O 성능을 제공하며, CPU는 최소한의 개입만 하고 완료 시 인터럽트만 받기 때문에 시스템 효율이 크게 향상된다.