[혼공컴운] Ch08 입출력장치

Hyunjoon Choi·2023년 7월 23일
0

혼공컴운

목록 보기
8/15

📢 본 글은 혼공학습단 미션과 함께 정리해보는 글 입니다.

장치 컨트롤러와 장치 드라이버

보조기억장치도 입출력 장치에 포함됨

입출력 장치는 CPU, 메모리보다 더 다루기 까다롭다.

  • 입출력 장치에는 종류가 너무 많음 → 정보를 주고받는 방식을 규격화하기 어려움
  • CPU와 메모리의 데이터 전송률은 높지만 입출력 장치의 데이터 전송률은 낮음
    • 전송률 (transfer rate): 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표
    • 입출력 장치 중 CPU, 메모리보다 전송률이 더 빠른 장치들도 있으나 일반적으로는 더 낮음

장치 컨트롤러

입출력 장치의 다루기 힘든 문제 때문에 컴퓨터와 입출력 장치는 장치 컨트롤러 (= 입출력 제어기, 입출력 모듈)를 통해 연결됨

역할

  • CPU와 입출력 장치 간의 통신 중개
  • 오류 검출
  • 데이터 버퍼링
    • 버퍼링 (buffering): 전송률이 높은 장치와 낮은 장치 사이에 주고받는 데이터를 버퍼 (buffer)라는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법

구조 & 방식

  • 장치 컨트롤러는 시스템 버스를 통해 CPU와 소통함
  • 장치 컨트롤러의 대표 구조는 데이터 레지스터, 상태 레지스터, 제어 레지스터가 있음 (내부적으로는 더 복잡)
    • 데이터 레지스터: CPU와 입출력 장치 사이에 주고받을 데이터가 담기는 레지스터 (버퍼)
      • 최근에는 입출력 장치 자체도 주고받을 데이터가 너무 많기 때문에 레지스터 대신 RAM을 사용하기도 함
    • 상태 레지스터: 상태 정보를 저장
      • 입출력 장치가 입출력 작업을 할 준비가 되었는지
      • 입출력 작업이 완료되었는지
      • 입출력 장치에 오류는 없는지 등등
    • 제어 레지스터: 입출력 장치가 수행할 내용에 대한 제어 정보를 저장

장치 드라이버

  • 장치 컨트롤러의 동작을 감지하고 제어하는 프로그램
  • 즉, 장치 드라이버는 입출력 장치를 연결하기 위한 소프트웨어적인 통로
  • 장치 드라이버가 설치되어 있지 않으면 해당 입출력 장치를 사용할 수 없음
  • 장치 드라이버를 인식하고 실행하는 주체는 운영체제

다양한 입출력 방법

입출력 방식에는 프로그램 입출력, 인터럽트 기반 입출력, DMA 입출력이 있음

프로그램 입출력

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

메모리에 저장된 정보를 하드 디스크에 작업하는 과정
1. CPU가 하드 디스크 컨트롤러의 제어 레지스터에 쓰기 명령을 보냄
2. 하드 디스크 컨트롤러는 하드 디스크 상태를 확인한 후, 준비된 상태라면 상태 레지스터에 준비되었다고 표시함
3. CPU는 상태 레지스터를 주기적으로 읽어보며 하드 디스크의 준비 여부를 확인함
3-1. 준비됐음을 알게 되면 백업할 메모리의 정보를 데이터 레지스터에 씀
3-2. 준비되지 않았다면 1번부터 반복하고, 쓰기가 끝나면 작업을 종료함

이렇듯 프로그램 입출력은 CPU가 장치 컨트롤러의 레지스터 값을 읽고 씀으로써 이루어지게 됨

그런데 장치 컨트롤러는 그 종류가 너무나도 많은데 어떻게 CPU가 장치 컨트롤러의 레지스터들을 다 알 수 있을까? ⇒ 메모리 맵 입출력고립형 입출력을 활용

메모리 맵 입출력

  • 메모리에 접근하기 위한 주소 공간과 입출력장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주하는 방법
  • CPU는 메모리의 주소, 장치 컨트롤러의 레지스터들의 주소를 모두 똑같이 일반적인 메모리 주소처럼 다루면 됨 ⇒ 명령어 형식이 같음

고립형 입출력

  • 메모리 전용 주소 공간과 입출력장치 전용 주소 공간을 분리하는 방법
  • 주소 공간이 분리되어 있기 때문에 메모리 맵 입출력 방식보다 더 넓은 주소 공간을 가지지만, 메모리에 접근할 때와 입출력장치에 접근할 때의 명령어 구조가 바뀌게 됨

인터럽트 기반 입출력

  • 인터럽트를 기반으로 하는 입출력을 뜻한다.
  • 엄밀히 말하면 하드웨어 인터럽트는 입출력장치가 아니라 장치 컨트롤러에 의해 발생한다. CPU와 입출력장치가 직접적으로 연결되지 않고 장치 컨트롤러를 통해 연결되기 때문이다.
  • 프로그램 입출력은 CPU가 주기적으로 확인하는 작업을 하였지만, 인터럽트 기반 입출력은 반대로 장치 컨트롤러가 CPU에게 인터럽트 신호를 보내는 방식이기 때문에 더 효율적이라고 할 수 있다. 프로그램 입출력에서 쓰인 방식을 폴링 (polling)이라 한다.

인터럽트가 동시다발적으로 온다면?

인터럽트 기반 입출력은 장치 컨트롤러에서 CPU로 인터럽트 요청이 가는 것이기 때문에 CPU에게 동시다발적으로 많은 인터럽트가 도달할 수 있다. 이를 처리하기 위한 방법들은 다음과 같은 것들이 있다.

1️⃣ 순차적으로 처리

  • CPU가 플래그 레지스터의 인터럽트 비트를 비활성화 하고 인터럽트를 처리하면 다른 입출력 장치에 의한 하드웨어 인터럽트를 받아들이지 않게 되고, 순차적으로 하드웨어 인터럽트를 처리할 수 있게 된다.
  • 그러나 모든 인터럽트를 순차적으로 해결하기엔 제약이 있다. 더 빨리 처리해야 할 인터럽트들이 생길 수 있기 때문이다. (NMI - Non Maskable Interrupt 등)

2️⃣ 우선순위에 맞게 반영

  • 플래그 레지스터의 인터럽트 비트가 활성화되어 있거나 인터럽트 비트를 비활성화해도 NMI가 발생한 경우 등에는 우선순위가 높은 인터럽트부터 처리
  • 프로그래머블 인터럽트 컨트롤러 (PIC - Programmable Interrupt Controller)를 사용해 구현
    • 여러 장치 컨트롤러에 연결되어 장치 컨트롤러에서 보낸 하드웨어 인터럽트 요청들의 우선순위를 판별한 뒤 CPU에 지금 처리해야 할 하드웨어 인터럽트가 무엇인지 알려주는 역할을 함 (NMI 간의 우선순위를 판별하진 않음 → 발생 시 바로 처리함)

DMA 입출력

프로그램 입출력 방식과 인터럽트 기반 입출력 방식의 공통점은 입출력 장치와 메모리 간의 데이터 이동은 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) 버스가 있다.


부족하거나 보완할 점이 있다면 댓글 부탁드립니다 😃

profile
개발을 좋아하는 워커홀릭

0개의 댓글