📢 본 글은 혼공학습단 미션과 함께 정리해보는 글 입니다.
보조기억장치도 입출력 장치에 포함됨
입출력 장치는 CPU, 메모리보다 더 다루기 까다롭다.
종류가 너무 많음
→ 정보를 주고받는 방식을 규격화하기 어려움
전송률 (transfer rate)
: 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표입출력 장치의 다루기 힘든 문제 때문에 컴퓨터와 입출력 장치는 장치 컨트롤러 (= 입출력 제어기, 입출력 모듈)
를 통해 연결됨
버퍼링 (buffering)
: 전송률이 높은 장치와 낮은 장치 사이에 주고받는 데이터를 버퍼 (buffer)
라는 임시 저장 공간
에 저장하여 전송률을 비슷하게 맞추는 방법시스템 버스
를 통해 CPU와 소통함데이터 레지스터
, 상태 레지스터
, 제어 레지스터
가 있음 (내부적으로는 더 복잡)프로그램
소프트웨어적인 통로
운영체제
입출력 방식에는 프로그램 입출력
, 인터럽트 기반 입출력
, DMA 입출력
이 있음
명령어
로 입출력 장치를 제어하는 방법메모리에 저장된 정보를 하드 디스크에 작업하는 과정
1. CPU가 하드 디스크 컨트롤러의 제어 레지스터에 쓰기 명령을 보냄
2. 하드 디스크 컨트롤러는 하드 디스크 상태를 확인한 후, 준비된 상태라면 상태 레지스터에 준비되었다고 표시함
3. CPU는 상태 레지스터를 주기적으로 읽어보며 하드 디스크의 준비 여부를 확인함
3-1. 준비됐음을 알게 되면 백업할 메모리의 정보를 데이터 레지스터에 씀
3-2. 준비되지 않았다면 1번부터 반복하고, 쓰기가 끝나면 작업을 종료함
이렇듯 프로그램 입출력은 CPU가 장치 컨트롤러의 레지스터 값을 읽고 씀으로써 이루어지게 됨
그런데 장치 컨트롤러는 그 종류가 너무나도 많은데 어떻게 CPU가 장치 컨트롤러의 레지스터들을 다 알 수 있을까? ⇒ 메모리 맵 입출력
과 고립형 입출력
을 활용
하나의 주소 공간으로 간주
하는 방법일반적인 메모리 주소처럼
다루면 됨 ⇒ 명령어 형식이 같음
주소 공간이 분리
되어 있기 때문에 메모리 맵 입출력 방식보다 더 넓은 주소 공간
을 가지지만, 메모리에 접근할 때와 입출력장치에 접근할 때의 명령어 구조가 바뀌게 됨
인터럽트
를 기반으로 하는 입출력을 뜻한다.장치 컨트롤러에 의해 발생
한다. CPU와 입출력장치가 직접적으로 연결되지 않고 장치 컨트롤러를 통해 연결되기 때문이다.CPU가 주기적으로 확인하는 작업
을 하였지만, 인터럽트 기반 입출력은 반대로 장치 컨트롤러가 CPU에게 인터럽트 신호를 보내는 방식이기 때문에 더 효율적이라고 할 수 있다. 프로그램 입출력에서 쓰인 방식을 폴링 (polling)
이라 한다.인터럽트 기반 입출력은 장치 컨트롤러에서 CPU로 인터럽트 요청이 가는 것이기 때문에 CPU에게 동시다발적으로 많은 인터럽트가 도달
할 수 있다. 이를 처리하기 위한 방법들은 다음과 같은 것들이 있다.
플래그 레지스터의 인터럽트 비트를 비활성화
하고 인터럽트를 처리하면 다른 입출력 장치에 의한 하드웨어 인터럽트를 받아들이지 않게 되고, 순차적으로 하드웨어 인터럽트를 처리할 수 있게 된다.더 빨리 처리해야 할 인터럽트
들이 생길 수 있기 때문이다. (NMI - Non Maskable Interrupt
등)우선순위가 높은 인터럽트부터 처리
함프로그래머블 인터럽트 컨트롤러 (PIC - Programmable Interrupt Controller)
를 사용해 구현지금 처리해야 할 하드웨어 인터럽트가 무엇인지 알려주는 역할
을 함 (NMI 간의 우선순위를 판별하진 않음 → 발생 시 바로 처리함)프로그램 입출력 방식과 인터럽트 기반 입출력 방식의 공통점은 입출력 장치와 메모리 간의 데이터 이동은 CPU가 주도하고, 이동하는 데이터 또한 CPU를 거친다는 점이다.
위 문제를 해결하기 위해 CPU를 거치지 않고 메모리와 입출력장치끼리 데이터를 직접 (Direct) 주고받을 수 있는 입출력방식이다. 이를 위해서는 DMA 컨트롤러가 별도로 필요하다.
1️⃣ CPU는 DMA 컨트롤러에 입출력 작업을 명령
2️⃣ DMA 컨트롤러는 CPU 대신 장치 컨트롤러와 상호작용하며 입출력 작업을 수행 (DMA 컨트롤러는 필요한 경우 메모리에 직접 접근)
3️⃣ 입출력 작업이 끝나면 DMA 컨트롤러는 인터럽트를 통해 CPU에 작업이 끝났음을 알림
CPU는 입출력 작업의 시작과 끝에만 관여
하기 때문에 더 효율적으로 될 수 있다.
시스템 버스는 공용 자원
이기 때문에 CPU가 시스템 버스를 사용할 때 DMA 컨트롤러가 시스템 버스를 사용할 수 없고, 그 반대도 불가능하다.
그래서 CPU가 쓰지 않을 때 조금씩 사용하는 방법 (사이클 스틸링 - cycle stealing
)과, CPU에게 허락을 구하는 방법
두 가지가 있다.
장치 컨트롤러가 시스템 버스와 직접적으로 연결
되면 DMA 컨트롤러는 불필요하게 시스템 버스를 두 번
쓰게 된다. 이는 CPU가 시스템 버스를 사용하는 데 방해 요소가 된다.
그래서 시스템 버스 말고 입출력 버스
를 사용한다. 대표적으로는 PCI 버스
, PCI Express (PCIe) 버스
가 있다.
부족하거나 보완할 점이 있다면 댓글 부탁드립니다 😃