Computer Architecture/컴퓨터구조[01]

[혼자 공부하는 컴퓨터구조] 08-2. 다양한 입출력 방법

leziwn.cs 2023. 12. 4. 19:47

입출력 작업을 수행하려면 CPU와 device controller가 정보를 주고받아야 한다. 

그렇다면 device controller는 CPU와 어떻게 정보를 주고받을까?

  • 프로그램 입출력 (polling)
    - 메모리 맵 입출력(memory mapped I/O)
    - 고립형 입출력(isolated I/O)
  • 인터럽트 기반 입출력
  • DMA 입출력

 

1. 프로그램 입출력 (polling)

: 프로그램 속 명령어로 I/O device를 제어하는 방법

  • CPU가 프로그램 속 명령어를 실행하는 과정에서 입출력 명령어를 만나면, CPU는 I/O device에 연결된 device controller와 상호작용하며 입출력 작업을 수행한다.

프로그램 입출력 (polling)

이렇듯, 프로그램 입출력 방식(polling)에서의 입출력 작업은 CPU가 device controller의 레지스터 값을 읽고 씀으로써 이루어진다.

 

Q. 그런데 CPU는 device controller의 레지스터들을 어떻게 아는 것일까?

A. CPU 내부에 있는 레지스터들과는 달리, CPU가 여러 device controller 속 레지스터들을 모두 알고 있기란 어렵다.

 

Q. 그렇다면 CPU는 어떻게 device controller들의 레지스터들과 소통하는 것일까?

A. 메모리 맵 입출력, 고립형 입출력

 

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

: 메모리에 접근하기 위한 주소 공간과 I/O device에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주하는 방법

  • CPU는 메모리 주소들이나 device controller의 레지스터들이나 모두 똑같이 메모리 주소를 대하듯 하면 된다. 따라서 메모리에 접근하는 명령어와 I/O device에 접근하는 명령어는 굳이 다를 필요가 없다!

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

 

2) 고립형 입출력

: 메모리를 위한 주소 공간과 I/O device를 위한 주소 공간을 분리하는 방법

  • CPU는 I/O device에 접근할 때, 메모리에 접근하는 명령어와는 다른 입출력 명령어를 사용한다.
    CPU가 메모리 읽기/쓰기 선이 활성화되는 명령어를 실행할 때는 메모리에 접근하고, I/O device 읽기/쓰기 선이 활성화되는 명령어를 실행할 때는 device controller에 접근한다. 

고립형 입출력

 

 

2. 인터럽트 기반 입출력

: I/O device에 의한 하드웨어 인터럽트는 device controller에 의해 발생한다. CPU는 device controller에게 입출력 작업을 명령하고, device controller가 I/O device를 제어하며 입출력을 수행하는 동안, 다른 일을 할 수 있다.

--> Polling보다 나은 방법!

인터럽트 기반 입출력

 

인터럽트가 많을 때는? (다중 인터럽트)

Q. 그렇다면 I/O device와 device controller가 좀 더 많을 때는 인터럽트들을 어떻게 처리할까?

A1. 인터럽트가 들어온 순서대로 처리한다.

A2. 인터럽트의 우선순위에 따라 처리한다.

  • NMI(Non-Maskable Interrupt): NMI가 발생한 경우, CPU는 우선순위가 높은 인터럽트부터 처리한다.
  • PIC(Programmable Interrupt Controller): 우선순위를 반영하여 다중 인터럽트를 처리하는 방법
    : 여러 device controller에 연결되어 device controller에서 보낸 하드웨어 인터럽트 요청들의 우선순위를 판별한 뒤, CPU에 지금 처리해야 할 하드웨어 인터럽트가 무엇인지 알려주는 장치

PIC(Programmable Interrupt Controller)

 

 

3. DMA 입출력
  • Problem: 프로그램 기반 입출력, 인터럽트 기반 입출력의 공통점은 I/O device와 메모리 간의 데이터 이동은 CPU가 주도하고, 이동하는 데이터도 반드시 CPU를 거친다는 점이다.

예) I/O device 데이터를 메모리에 저장하는 경우:

예) I/O device 데이터를 메모리에 저장하는 경우

  1. Device controller에서 I/O device 데이터를 하나씩 읽어 CPU의 레지스터에 적재한다.
  2. 적재한 데이터를 메모리에 저장한다.

 

예) 메모리 속 데이터를 I/O device로 내보내는 경우:

예) 메모리 속 데이터를 I/O device로 내보내는 경우

  1. 메모리에서 데이터를 읽어서 CPU의 레지스터에 적재한다.
  2. CPU의 레지스터에 적재한 데이터를 device controller로 보낸다.

 

즉, 메모리 -- CPU(register) -- device controller -- I/O device: CPU가 항상 개입된다!

 

  • Solution: DMA(Direct Memory Access)

▶ DMA(Direct Memory Access)

: 직접 메모리에 접근할 수 있는 입출력 기능 (CPU를 거치지 않는다!)

  • DMA controller: DMA 입출력을 하기 위해서는 시스템 버스에 연결된 DMA 컨트롤러라는 하드웨어가 필요하다.

DMA(Direct Memory Access)

 

DMA 입출력 과정
  1. CPU --> DMA controller: I/O device의 주소, 수행할 연산(읽기/쓰기), 읽거나 쓸 메모리의 주소 등과 같은 정보로 입출력 작업을 명령한다.
  2. DMA controller: CPU 대신 device controller와 상호작용하며 입출력 작업을 수행한다. 이때 DMA controller는 필요한 경우 메모리에 직접 접근하여 정보를 읽거나 쓴다.
  3. DMA controller --> CPU: 입출력 작업이 끝나면, DMA controller는 CPU에 인터럽트를 걸어, 작업이 끝났음을 알린다.

DMA(Direct Memory Access)

: DMA(Direct Memory Access) 방식을 이용하면, I/O device와 메모리 사이에 주고받을 데이터는 CPU를 거치지 않는다. CPU는 DMA controller에게 입출력 작업 명령을 내리고, 인터럽트만 받으면 되기 때문에 작업 부담을 훨씬 줄일 수 있다.

 

  • Problem: DMA controller는 시스템 버스로 메모리에 직접 접근이 가능하지만, 시스템 버스는 동시 사용이 불가능하다. (시스템 버스는 공용 자원이기 때문이다.) 따라서 CPU가 시스템 버스를 사용할 때 DMA controller는 시스템 버스를 사용할 수 없고, DMA controller가 시스템 버스를 사용할 때는 CPU가 시스템 버스를 사용할 수 없다.
  • Solution: DMA controller는 CPU가 시스템 버스를 사용하지 않을 때마다 조금씩 시스템 버스를 이용하거나, CPU가 일시적으로 시스템 버스를 사용하지 않도록 허락을 구하고 시스템 버스를 집중적으로 이용한다. (사이클 스틸링; cycle stealing)

 

입출력 버스

버스

  • 시스템 버스(processor-memory bus)
  • 입출력 버스(I/O bus)