Post

[CS] Chapter 08. 입출력장치

혼자 공부하는 컴퓨터 구조 + 운영체제 (한빛미디어 출판, 강민철 지음) 으로 공부한 내용을 정리합니다.
CS Study를 통해 함께 공부하고 있습니다. [github repository]

✅ 08 - 1. 장치 컨트롤러와 장치 드라이버

장치 컨트롤러와 장치 드라이버에 대해 알아보자.
핵심 키워드 : 장치 컨트롤러 장치 드라이버

✔️ 장치 컨트롤러

입출력장치는 CPU, 메모리보다 다루기가 더 어렵다. 크게 두 가지 이유가 있다.

  1. 입출력장치에는 종류가 너무나도 많다.
    • 장치가 다양함녀 자연스레 장치마다 속도, 데이터, 전송 형식 등도 다양하다.
    • 따라서 다양한 입출력장치와 정볼르 주고받는 방식을 규격화하기 어렵다.
  2. 일반적으로 CPU와 메모리의 데이터의 전송률은 높지만 입출력장치의 데이터 전송률은 낮다.
    • 전송률(transfer rate)이란 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표이다.
    • CPU나 메모리와의 전송률이 비슷하지 않기 때문에 통신의 어려움을 겪게된다.

이러한 이유로 입출력장치는 컴퓨터에 직접 연결되지 않고 장치 컨트롤러(device controller)라는 하드웨어를 통해 연결된다. 입출력 제어기(I/O controller), 입출력 모듈(I/O module) 등으로 다양하게 불리기도 한다.

🔎 장치 컨트롤러의 역할

  • CPU와 입출력장치 간의 통신 중개 (일종의 번역가 역할)
  • 오류 검출
  • 데이터 버퍼링
    • 버퍼링(buffering)이란 전송률이 높은 장치와 낮은 장치 사이에 주고받는 데이터를 버퍼(buffer)라는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법.
    • 버퍼에 데이터를 조금씩 모았다가 한꺼번에 내보내거나, 데이터를 한 번에 많이 받아 조금씩 내보내는 방법 image

🔎 장치 컨트롤러의 내부 구조

데이터 레지스터(data register), 상태 레지스터(status register), 제어 레지스터(control register) 세 가지 기억

image

❓ 데이터 레지스터
  • CPU와 입출력장치 사이에 주고받을 데이터가 담기는 레지스터.
  • 버퍼 역할을 한다.
  • 최근 주고받는 데이터가 많은 입출력장치에서는 레지스터 대신 RAM을 사용하기도 한다.
❓ 상태 레지스터
  • 입출력장치가 입출력 작업을 할 준비가 되었는지, 입출력 작업이 완료되었는지, 입출력장치에 오류는 없는지 등의 상태 정보가 저장된다.
❓ 제어 레지스터
  • 입출력장치가 수행할 내용에 대한 제어 정보와 명령을 저장한다.

✔️ 장치 드라이버(device driver)

  • 장치 컨트롤러의 동작을 감지하고 제어함으로써 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램이다.
  • 장치 컨트롤러가 입출력장치를 연결하기 위한 하드웨어적인 통로라면, 장치 드라이버는 소프트웨어적인 통로이다.

✅ 08 - 2. 다양한 입출력 방법

가장 보편적인 입출력 방법인 프로그램 입출력과 인터럽트 기반 입출력, DMA 입출력에 대해 알아보자.
핵심 키워드 : 프로그램 입출력 메모리 맵 입출력 고립형 입출력 인터럽트 기반 입출력 DMA 입출력 입출력 버스

✔️ 프로그램 입출력(programmed I/O)

  • 기본적으로 프로그램 속 명령어로 입출력장치를 제어하는 방법이다.
  • 입출력 명령어로써 장치 컨트롤러와 상호작용

메모리에 저장된 정보를 하드 디스크에 백업하는 상황 예시 (= 하드 디스크에 새로운 정보 쓰기)

  1. CPU는 하드 디스크 컨트롤러의 제어 레지스터쓰기 명령 내보내기 image

  2. 하드 디스크 컨트롤러는 하드 디스크 상태 확인 -> 상태 레지스터에 준비 완료 표시 image

  3. 3-1) CPU는 상태 레지스터를 주기적으로 읽어보며 하드 디스크의 준비 여부를 확인
    3-2) 하드 디스크가 준비되었다면 백업할 메모리의 정보를 데이터 레지스터에 쓰기 image

백업 작업이 끝나지 않았다면 1번부터 반복하고, 끝났다면 작업 종료

🔎 CPU가 장치 컨트롤러의 레지스터 값을 읽고 쓰는 방법

메모리 앱 입출력고립형 입출력이 있다.

🔎 메모리 맵 입출력(memory-mapped I/O)

  • 메모리에 접근하기 위한 주소 공간과 입출력장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주하는 방법 image

🔎 고립형 입출력(isolated I/O)

  • 메모리를 위한 주소 공간과 입출력장치를 위한 주소 공간을 분리하는 방법
  • 입출력 전용 명령어 사용 image image
메모리 맵 입출력고립형 입출력
메모리와 입출력장치는 같은 주소 공간 사용메모리 입출력장치는 분리된 주소 공간 사용
메모리 주소공간이 축소됨메모리 주소 공간이 축소되지 않음
메모리와 입출력장치에 같은 명령어 사용 가능입출력 전용 명령어 사용

✔️ 인터럽트 기반 입출력

CPU는 장치 컨트롤러에 입출력 작업을 명령하고, 장치 컨트롤러가 입출력장치를 제어하며 입출력을 수행하는 동안 CPU는 다른 일을 한다. 장치 컨트롤러가 입출력 작업을 끝낸 뒤 CPU에게 인터럽트 요청 신호를 보내면 CPU는 하던 일을 잠시 백업하고 인터럽트 서비스 루틴을 실행한다. image

❓ 폴링(polling)

  • 입출력 장치의 상태는 어떤지, 처리할 데이터가 있는지를 주기적으로 확인하는 방식
  • 폴링 방식은 인터럽트 방식보다 CPU의 부담이 더 크다.

🔎 여러 입출력장치에서 인터럽트가 동시에 발생한 경우에는?

  • 인터럽트가 발생한 순서대로 인터럽트를 처리하는 방법
    • 인터럽트 A를 처리하는 도중 발생한 또 다른 인터럽트 B의 요청을 받아들이지 않고, 인터럽트 A 서비스 루틴이 끝나면 그때 B 서비스 루틴을 실행
    • 현실적으로 전부 순차적으로만 해결할 수 없음
    • CPU는 인터럽트 간에 우선순위를 고려하여 우선순위가 높은 인터럽트 순으로 여러 인터럽트를 처리할 수 있다. image

🔎 프로그래머블 인터럽트 컨트롤러(PIC: Programmable Interrupt Controller)

우선순위를 반영하여 다중 인터럽트를 처리하는 방법 중 대중적으로 사용되는 방법

  1. 여러 장치 컨트롤러에 연결되어
  2. 장치 컨트롤러의 하드웨어 인터럽트의 우선순위를 판단한 뒤
  3. CPU에게 지금 처리해야 하는 인터럽트가 무엇인지 판단하는 하드웨어

PIC의 다중 인터럽트 처리 과정

  1. PIC가 장치 컨트롤러에서 인터럽트 요청 신호(들)를 받아들인다.
  2. PIC는 인터럽트 우선순위를 판단한 뒤 CPU에 처리해야 할 인터럽트 요청 신호를 보낸다.
  3. CPU는 PIC에 인터럽트 확인 신호를 보낸다.
  4. PIC는 데이터 버스를 통해 CPU에 인터럽트 벡터를 보낸다.
  5. CPU는 인터럽트 벡터를 통해 인터럽트 요청의 주체를 알게 되고, 해당 장치의 인터럽트 서비스 루틴을 실행한다.

PIC가 무시할 수 없는 인터럽트인 NMI(Non-Maskable Interrupt)까지 우선순위를 판단하지는 않는다. NMI는 우선순위가 가장 높아 우선순위 판별이 불필요하기 때문이다.

✔️ DMA(Direct Memory Access) 입출력

  • 입출력장치와 메모리가 CPU를 거치지 않고도 상호작용할 수 있는 입출력 방식이다.
  • DMA 입출력을 하기 위해서는 시스템 버스에 연결된 DMA 컨트롤러라는 하드웨어가 필요하다.

image

🔎 DMA 입출력 과정

  1. CPU는 DMA 컨트롤러에 입출력장치의 주소, 수행할 연산(읽기/쓰기), 읽거나 쓸 메모리의 주소 등과 같은 정보로 입출력 작업을 명령한다. image
  2. DMA 컨트롤러는 CPU 대신 장치 컨트롤러와 상호작용하며 입출력 작업을 수행한다. 이때 DMA 컨트롤러는 필요한 경우 메모리에 직접 접근하여 정보를 읽거나 쓴다. image
  3. 입출력 작업이 끝나면 DMA 컨트롤러는 CPU에 인터럽트를 걸어 작업이 끝났음을 알린다. image
  • 메모리 사이에 주고받을 데이터는 CPU를 거치지 않는다.
  • CPU는 DMA 컨트롤러에게 입출력 작업 명령을 내리고, 인터럽트만 받으면 되기 때문에 작업 부담을 훨씬 줄일 수 있다.
  • CPU는 오로지 입출력의 시작과 끝에만 관여

시스템 버스는 공용 자원이기 때문에 동시 사용이 불가능하다. 그래서 DMA 컨트롤러는

  1. CPU가 시스템 버스를 이용하지 않을 때마다 조금씩 시스템 버스 이용
  2. CPU가 일시적으로 시스템 버스를 이용하지 않도록 허락을 구하고 시스템 버스 이용

CPU 입장에서는 마치 버스에 접근하는 주기를 도둑 맞는 기분. 그래서 이러한 DMA의 시스템 버스 이용을 사이클 스틸링(cycle stealing)이라고 부른다.

🔎 입출력 버스

DMA를 위해 한 번 메모리에 접근할 때마다 시스템 버스를 두 번 사용하게 되는 부작용이 있다. 이 문제를 DMA 컨트롤러와 장치 컨트롤러들을 입출력 버스(input/output bus)라는 별도의 버스에 연결하여 해결할 수 있다.

입출력 버스에는 PCI(Peripheral Component Interconnect) 버스, PCI Express(PCIe) 버스 등 여러 종류가 있다.

This post is licensed under CC BY 4.0 by the author.

[CS] Chapter 07. 보조기억장치

-