Skip to main content

Command Palette

Search for a command to run...

How I/O Devices Connect to the System Bus

I/O장치의 접속, 인터럽트와 DMA를 이용한 I/O장치의 접속, 컴퓨터구조 13주

Updated
9 min read
How I/O Devices Connect to the System Bus

Contents

1️⃣ I/O 제어 (I/O Input/Output Control)
2️⃣ I/O 주소지정 (I/O Addressing)

3️⃣ 프로그램된 I/O (Programmed I/O)
4️⃣ 인터럽트 기반 I/O (Interrupt-driven I/O)
5️⃣ 직접 메모리 접근 (DMA, Direct Memory Access)


컴퓨터의 구성요소의 3가지 중하나인 CPU, Memory, I/O device에 대해서 공부할 예정인데 특히 컴퓨터 입장에서 주변장치인 I/O device에 어떻게 접속하는지 자세히 공부해보자.

📍 I/O 장치가 시스템 버스에 직접 접속되지 못하는 이유 (시스템버스-12주차강의 참조)

1️⃣ 너무 많은 종류의 I/O 장치의 종류
I/O 장치들은 많은 종류가 있다. 이에 따라 제어 방법이 서로 다른데, 그러한 제어 회로들을 CPU 내부에 모두 포함시키는 것이 불가능(비용, 복잡)하기 때문에 CPU가 그들을 직접 제어할 수가 없게끔 되어있다. 대신 중간에 도와주는 역할을 하는 '도우미'가 필요하다.

2️⃣ 전송속도의 차이
I/O 장치들(좀 느림)의 데이터 전송 속도가 CPU의 데이터 처리 속도(아주빠름)에 비하여 훨씬 더 느리고 속도가 서로 다르기 때문에, 고속의 시스템 버 스와 I/O 장치들 사이에 직접 데이터를 교환하는 것은 아주 비효율적이다.

3️⃣ 서로 다른 데이터 형식
I/O 장치들과 CPU가 사용하는 데이터 형식의 길이가 서로 다른 경우가 많다. 이로인해 직접 연결이 불가능하다.

➡️ 인터페이스 장치인 I/O 제어기(I/O controller)를 사용하여 시스템 버스에 접속한다.
➡️ I/O 제어기의 메커니즘으로는 I/O 제어와 I/O 주소지정 방식이 있다.


1️⃣ I/O 제어 (I/O Input/Output Control)

I/O 제어(Input/Output Control)는 컴퓨터 시스템에서 CPU와 I/O 장치 간의 데이터 교환을 효율적으로 관리하고 제어하는 과정을 의미한다. I/O 제어는 CPU와 메모리, 그리고 주변장치(I/O 장치) 간의 원활한 통신을 위해 필수적인 존재이다.

📍I/O 제어기의 주요 기능(Main feature of I/O Controller)

I/O 장치와 CPU 간의 통신을 관리하고 제어하는 역할을 한다. 주요 기능은 다음과 같다.

  • I/O 장치의 제어와 타이밍 조정: I/O 장치의 작동을 제어하고, 다양한 각 장치의 속도와 타이밍을 조정한다.

  • CPU와의 통신 담당: CPU가 I/O 장치에 명령을 내리고, I/O 장치로부터 상태 정보나 데이터 피드백을 받는 과정을 관리한다.

  • I/O 장치와의 통신 담당: 직접적인 통신을 통해 데이터 전송을 관리한다.

  • 데이터 버퍼링(data buffering) 기능 수행: 버퍼링을 통해 데이터 전송 과정에서 발생할 수 있는 병목 현상을 줄인다.

  • 오류 검출: 오류 검출 메커니즘을 통해 데이터 무결성을 유지하고, 오류 발생 시 적절한 대처를 할 수 있도록 한다.

📍I/O 제어기의 내부 구성도 (What's inside of I/O Controller)

각각의 구성 요소들은 프린터와 CPU 간의 데이터 전송 및 제어를 효율적으로 관리하는 데 중요한 역할을 한다. 각 구성 요소는 특정한 기능을 수행하며, 이를 통해 프린터가 정확하게 작동할 수 있도록 한다.

  • 프린터는 Output으로 데이터를 받기만한다. (화살표 모양 참조)

  • 프린터의 상태를 확인하는 상태신호는 Input/Output으로 나뉜다.

  • 프린터 이외의 다른 Output/Input 장치도 비슷한 형태로 이루어져있다.

데이터 레지스터 (Data Register) 프린터로 전송될 데이터를 임시로 저장하는 곳

상태/제어 레지스터(Status/Control Register) 내부적으로 두 개의 레지스터로 구성되지만 주소는 하나만 지정 되는 레지스터들이다. 즉 주소가 하나만 지정되어도 주어진 비트로

  • 상태 레지스터 (Status Register)

    • 프린터의 현재 상태와 오류 검사 결과 등을 나타내는 비트들로 구성된다. 보통 CPU에서 '읽기'를 할때 이 레지스터를 많이 사용한다.
  • 제어 레지스터 (Control Register)

    • CPU가 보낸 명령단어(I/O command word)를 저장한다. 보통 CPU에서 '쓰기'를 할때 이 레지스터를 많이 사용한다.

타이밍 및 제어 회로(Timing and Control Circuit) 데이터 전송과 프린터 동작의 타이밍을 관리하여 정확한 타이밍에 프린터로 전송되어 올바르게 작동할 수 있도록 한다.

프린터 제어 회로(Printer Control Circuit) 프린터 내부의 메커니즘을 제어하여 실제 인쇄 작업을 수행한다.

📍CPU가 프린터로 데이터를 출력하는 과정

1️⃣ CPU가 프린터 제어기에게 프린터의 상태를 검사하도록 요청

2️⃣ 제어기는 프린터의 상태를 검사하여 준비되었는지를 가리키는 "비트(RDY 비트)"를 세트 (예를 들어 0 ➡️ 1)

3️⃣ CPU는 RDY 비트를 반복 검사(Programmed I/O)하고 프린터가 다음 프린트를 시작 할 준비가 된 상태라면(레디비트가 1로 변경됬을 때) 제어기로 출력 명령과 데이터를 전송

4️⃣ 제어기는 프린트 동작을 제어하기 위한 신호들과 데이터를 프린터로 전송

  • 데이터 레지스터를 큰 용량의 반도체 기억장치로 이루어진 데이터 버퍼(data buffer)로 대체한다면, 데이터 블록 전체를 한꺼번에 전송 받아 프린트 가능

프로그램을 이용한 I/O (Programmed I/O) CPU가 반복적으로 I/O 장치의 상태를 검사하면서 주도적으로 I/O 동작을 처리하는 방식을 일컫는다.

  • 장점: 간단하며, 별도의 하드웨어가 필요하지 않다. 가격이 저렴해진다.

  • 단점: CPU가 I/O 동작에 직접 관여해야 하므로, 그 동안에 다른 일을 하지 못함


2️⃣ I/O 주소지정 (I/O Addressing)

CPU가 I/O 장치와 통신할 때 사용할 주소를 지정하는 방법을 말한다. I/O 장치마다각 I/O 장치 당 두 개씩(데이터 레지스터의 주소, 상태/제어 레지스터의 주소) 할당되며, 이를 통해 CPU는 특정 I/O 장치에 접근할 수 있다. I/O 주소 지정 방법에는 다음과 같은 방식이 있다.

I/O 주소지정 방법 2가지 소개 (I/O Addressing method)

📍기억장치-사상 I/O (Memory-Mapped I/O)

기억장치 주소 영역의 일부분을 I/O 제어기 내의 레지스터 들의 주소로 할당하는 방식이다. 즉 컴퓨터를 사용할 때 쓰는 메모리의 부분을 나누어서 일정 영역을 I/O 장치에 할당하는 것이다.

  • 위의 그림에서 보듯이 한 메모리로 2가지의 일을 할 수 있게 되는 셈이다. 이로 인해 프로그래밍에서 기억장치 관련 명령어들을 I/O 장치 제어 에도 사용 가능하다. [예] LOAD 명령어, STORE 명령어, 등 기억장치 읽기/쓰기 신호를 I/O 읽기/쓰기 신호로 사용하기에 별도의 I/O 제어 신호가 필요하지 않아 간단한 장점이 있다.

프로그래밍이 용이하고 사용 가능한 명령어들이 다양한 장점이 있지만, 기억장치 주소 공간이 절반으로 감소한다는 단점이 있다.

📍분리형 I/O (Isolated I/O)

위의 기억장치-사상 I/O의 단점을 극복하는 방법이다. I/O 장치 주소공간을 기억장치 주소 공간과는 별도로 할당 하는 방식이다. I/O 제어를 위해서 기억장치-사상과 반대로 별도의 I/O 명령어를 사용해야 한다. (예: IN, OUT 명령어) 위와같은 이유로 별도의 I/O 읽기/쓰기 신호가 필요하다.

I/O 주소공간으로 인하여 기억장치 주소 공간이 줄어들지 않는 장점이 있는 반면 I/O 제어를 위해 I/O 명령어들만 이용할 수 있고 따로 명령어를 만들어야하는 점 때문에 프로그래밍이 불편한 단점이 있다.


I/O 제어에서의 주요 기능들을 구현하기 위해 사용하는 방식들은 크게 3가지가 있다.

3️⃣ 프로그램된 I/O (Programmed I/O)

첫번째로는, CPU에서 프린터로 데이터를 보내는 과정에서 사용된 프로그램된 I/O (Programmed I/O)같은 경우 CPU가 반복적으로 I/O 장치의 상태를 검사하면서 주도적으로 I/O 동작을 처리하는 방식이라고 배웠다. 아래에서는 나머지 2가지 방법을 공부해본다.


4️⃣ 인터럽트 기반 I/O (Interrupt-driven I/O)

'인터럽트 메커니즘'을 이용함으로써, I/O 동작이 진행되는 동안에 CPU가 다른 작업을 처리할 수 있도록 하는 방식이다.

인터럽트 매커니즘(Interrupt Mechanism)이란?

실행 중인 프로그램을 잠시 중단하고 지금 당장 처리해야 하는 프로그램이 생겼을 경우 '인터럽트 신호'를 보내서 먼저 처리해야하는 프로그램을 처리하고 다시 예전 프로그램으로 돌아가는 것을 말한다. CPU는 한번에 하나의 작업만 할 수 있다. 여러가지 작업이 있다면 이를 작게 쪼개어 하나씩 빠르게 처리하는 방식이다. 하지만 이 와중에 갑작스럽게 문제가 생긴하면 그 문제되는 부분을 빠르게 해결해서 다른 프로그램에 지장이 가지 않게 해야하기 때문에 CPU가 다른 기존에 진행하던 작업을 멈추고 문제가 있는 프로그램 먼저 해결할 수 있도록 신호를 보내는 것이다. 대표적인 예로는 갑작스러운 정전, 컴퓨터 고장, 데이터를 처리할 수 있는 컴퓨터 자원의 부족 등이 있다. https://blog.naver.com/jurausim/223261008523

📍인터럽트 기반 I/O 접속 시 동작 순서(How Interrupt-driven I/O works)

1️⃣ CPU가 I/O 제어기에게 명령을 전송하고, CPU는 다른 작업 수행한다.
2️⃣ 제어기는 I/O 장치를 제어하여 I/O 명령을 수행
3️⃣ I/O 명령 수행이 완료되면, 제어기는 CPU로 인터럽트 신호를 전송 (끝났다는 신호)
4️⃣ CPU는 인터럽트 신호를 받는 즉시 원래의 프로그램으로 복귀하여 수행을 계속

📍인터럽트-구동 I/O 방식에서의 CPU가 프린터로 데이터를 출력하는 과정

📍인터럽트-구동 I/O의 구현 방법 3가지

1️⃣ 다중-인터럽트(multiple interrupt) 방식

인터럽트가 들어온 와중에 또 인터럽트가 들어온 상황에서 각 I/O 제어기와 CPU 사이에 별도의 인터럽트 요구 (interrupt request: INTR) 선과 인터럽트 확인(interrupt acknowledge: INTA) 선을 접속하는 방법이다.

  • 위의 그림처럼 주소(ADDR), 데이터버스(DATA)는 공통으로 있고 INTR1, INTA1, INTR2, INTA2 이런 식으로 request하고 ack신호를 주고 받는 형식이다. I/O제어기는 1,2,3,4 있지만 순서는 상관없다. 가장 간단한 방식이다.

  • 예) I/O제어기 #2가 인터럽트를 요구하는 경우 동작 순서 예시

    • I/O 제어기#2가 INTR2 request 신호를 세트한다. (세트한다는 말은 전기신호가 0으로 가다가 1로 변한다는 뜻) ➡️ CPU는 INTA2 ack 신호를 세트(1로 변함) 함으로써 그 제어기에게 인터럽트 요구를 인식하였음을 알리고, 인터럽트를 위한 서비스를 시작 ➡️ I/O 제어기2는 INTR2 request 신호를 해제(0으로 리셋) ➡️ CPU도 INTA2 신호를 해제함으로 다른 제어기가 인터럽트를 요구할수 있도록 함.

다중-인터럽트 방식의 장점으로는 CPU가 인터럽트를 요구한 장치를 쉽게 찾아낼 수 있지만 하드웨어가 복잡하다. 사진에서 보다싶이 선로수가 많다. 접속 가능한 I/O 장치들의 수가 CPU의 인터럽트 요구 입력 핀의 수(사진에서 보다 싶이 쌍으로 구성됨)에 의해 제한된다. 위의 예시로는 I/O제어기 4대가 최대이다.

2️⃣ 데이지-체인(daisy-chain) 방식

CPU로부터 발생되는 INTA ack 출력 선을 I/O 제어기들에의해 직렬로 접속하는 방식이다. 인터럽트를 요구한 I/O 장치는 'AIn' 입력을 받는 즉시 자신의 고유(ID) 번호, 즉 인터럽트 벡터(interrupt vector)를 데이터 버스를 통하여 CPU로 전송한다.

인터럽트 벡터(interrupt vector) 해당 I/O 장치를 위한 인터럽트 서비스 루틴의 시작 주소를 결정하는데 사용된다. 키보드, 마우스 등의 주소 정보가 담겨있다.

만약 'AIn' 입력을 받은 I/O 장치가 인터럽트를 요구하지 않은 상태라면, 그 입력을 다음 장치로 통과(pass)시킨다.

  • I/O제어기 4가 신호를 보냈을 경우 INTA ack 신호가 직렬로 연결되어 제어기 1,2,3을 통과 후에 신호를 받게 된다.

데이지 체인 방식의 장점으로는 첫번째와 비교했을 때 하드웨어가 간단(INTR 및 INTA 신호 선이 각각 한 개씩)하다. 단점으로는 우선순위가 낮은 장치들이 서비스를 받지 못하고 매우 오랫동안 기다려야 하는 경우가 발생(starvation, 기아 상)하게 된다. 위의 그림으로는 I/O제어기 4번이 이에 해당한다.


3️⃣ 소프트웨어 폴링(software polling) 방식 (
컴퓨터 구조론 12주에서 언급됨)

CPU가 모든 I/O 제어기들에 접속된 TEST I/O 선을 이용하여 인터럽트를 요구한 장치를 검사하는 방식이다. CPU가 주도적으로 Test I/O 신호를 이용하여 각 I/O 장치의 인터럽트 플래그가 세트되어 있는 지를 검사한다. (검사 순서에 따라 인터럽트의 우선순위가 결정된다.)

소프트웨어 폴링방식의 장점으로는 우선순위 변경이 용이하다는 점이다. CPU가 검사 순서를 바꾸기만 하면 우선순위 변경이 가능하다. 하나하나 검사해야하기 때문에 처리 시간이 오래 걸린다는 단점이 있다.


5️⃣직접 메모리 접근

(DMA, Direct Memory Access)

말그대로 CPU의 개입 없이 I/O 장치와 기억장치 사이에 데이터를 전송하는 방식을 뜻한다. "사이클 스틸링(cycle stealing)" 이라고도 한다.

📍 구현 방법 (How it works)

CPU가 주기억장치를 액세스하지 않는 시간(CPU가 내부적으로 명령어를 해독하거나 ALU 연산을 수행하는 시간)에, 시스템 버스를 사용하여 주기억장치와 I/O 장치 간에 데이터 전송이 이루어진다.

DMA 처리 순서

1️⃣ CPU가 DMA 제어기(DMA controller)로 아래 정보를 포함한 명령을 전송한다.

  • I/O 장치의 주소 (예: 디스크 드라이브 번호, 실린더 번호, 섹터 번호)

  • 연산(쓰기 혹은 읽기) 지정자 (Input / Output 중 어느 곳을 이용할 건지)

  • 데이터가 쓰여지거나 읽혀질 주기억장치 영역의 시작 주소

  • 전송될 데이터 단어들의 수

2️⃣ DMA 제어기는 CPU로 버스 요구(BUS REQ) 신호를 전송

3️⃣ CPU가 DMA 제어기로 버스 승인(BUS GRANT) 신호를 전송

4️⃣ DMA 제어기가 주기억장치로부터 데이터를 읽어서, 디스크 제어기로 전송

  • 각 데이터에 대하여 2,3,4번을 두 번 반복

  • (주기억장치 → DMA 제어기 & DMA 제어기 → 디스크 제어기 → 데이터 저장)

  • → 시스템 버스 두 번 사용

5️⃣ 저장할 데이터들이 남아있다면, 그 수만큼 2~4번 동작을 반복

6️⃣ 모든 데이터들의 저장이 완료되면, CPU로 INTR 신호를 전송

📍사용처(Where is DMA used)

주기억장치와 보조저장장치(HDD, SSD 등) 사이의 블록-단위 데이터 전송에 주로 사용한다.

📍DMA의 문제점과 해결책 - 1

각 데이터 전송 때마다 시스템 버스를 두 번씩 사용 ➔ 버스 사용량 증가로 인한 시스템 성능 저하가 생겼다. 이에 대한 해결책으로 I/O 장치들을 DMA 제어기로 접속하는 방법이 고안됬다. 즉 I/O장치들이 시스템버스를 통하지 않고 DMA제어기에서 바로 I/O장치로 가는 것이다. DMA 제어기가 주 기억장치를 액세스 할 때만 시스템 버스를 사용하게 된다.

  • 주기억장치 - 시스템버스 - I/O제어기 - I/O 장치 구조였던 위의 그림과 다르게 DMA 제어기가 추가된걸 볼수 있다.

  • 그래서 'I/O버스' 를 사용한다고 하기도 한다.

📍DMA의 문제점과 해결책 - 2

위와 같은 해결책 이후에 또다른 문제점이 생겨났다. I/O 장치들은 종류와 속도가 다양하고 제어 방법도 복잡하기 때문에, 간단한 구조를 가진 DMA 제어기로 지원하는 데는 한계가 생겼기 때문이다.

디스크 쓰기 혹은 읽기 동작의 경우에는 데이터 블록의 크기가 512 바이트 이상이기 때문에 그 데이터들을 버퍼링(임시 저장)하기 위한 내부 기억장치가 필요하게 되었다.

이에 대한 DMA의 업그레이드된 해결책으로 I/O 프로세서(I/O processor: IOP)를사용한다. I/O 채널(I/O channel)이라고도 부른다.

I/O 프로세서(I/O processor: IOP)에 포함되는 요소들 (CPU가 하는일과 비슷해지고 있다)

  • I/O 제어 프로그램(OS의 I/O device driver 프로그램)을 수행할 수 있는 프로세서

  • 데이터 블록을 임시 저장(버퍼링) 할 수 있는 용량의 지역 기억장치(local memory)

  • 시스템 버스 인터페이스 및 버스 마스터 회로

  • I/O 버스 중재 회로

  • DMA 제어기에서 I/O 프로세스로 업그레이드되었다.

  • 간단했던 DMA제어기의 단점을 극복한 IOP를 사용하면 다양한 I/O장치들을 지원하고 제어할 수 있다.


퀴즈 (Quiz)

  • 2번은 기억장치-사상 I/O (Memory-Mapped I/O)에 관한 내용이다.

학습정리(Summary)


Computer architecture

Part 2 of 11

Study note in relation to Computer architecture (컴퓨터구조) at The cyber university of Korea

Up next

Basics of System Bus and Bus Arbitration in Computer Architecture week12

시스템버스와 버스 중재, 컴퓨터 구조론 12주