#1 Isolated I/O

  MMIO는 컴퓨터 구조에서 디바이스와 CPU 간의 통신 최적화 과정에서 개발되었다. MMIO를 이해하기 위해서는 MMIO 이전의 컴퓨터 구조를 살펴볼 필요가 있다. 이전의 컴퓨터 구조에서는 여러 디바이스가 같이 사용하는 공통 버스와 각각의 디바이스를 위한 제어 버스가 존재하였다. 공통 버스는 CPU와 디바이스 사이의 주소 공간을 전달하는 주소 버스와 데이터를 전달하는 데이터 버스로 이루어져 있고, 제어 버스는 각 디바이스에게 I/O 명령어를 보내기 위한 제어 라인 버스가 있다. 

그림 1. Isolated I/O Bus Overview

 

  하지만 이는 디바이스가 점점 많아지는 현대의 컴퓨터 구조에서는 아래와 같은 이유들로 비효율적이다. 

  • 각 디바이스 메모리를 주소 공간에 매핑하기 위한 별개의 주소 공간 -> 많은 디바이스 주소 공간들이 모두 메모리에 할당
  • 각 디바이스 메모리 주소 공간을 사용하기 위한 별개의 명령어들 -> 여러 개의 CPU 명령어, 구현하기에 복잡함, 느림
  • 버스의 수가 늘어나기 때문에 하드웨어 구조가 복잡해짐

#2 MMIO

  위의 단점들을 해결하는 방법으로 MMIO가 등장하였다. MMIO의 기본 원리는 디바이스 메모리를 메모리 주소 공간에 매핑하는 것이다. 이를 통해 CPU가 각 디바이스들의 주소 공간을 이용하기 위해 여러 개의 명령어를 사용하던 것과 달리 메모리 주소 공간만 사용할 수 있게 되었으며, 하나의 공통 제어 버스를 사용하여 여러 디바이스에 I/O 명령을 할 수 있게 되었다.

그림 2. MMIO Bus Overview

 

  이런 MMIO는 다음과 같은 장점들을 갖는다.

  • CPU가 디바이스에 메모리와 같은 속도로 접근할 수 있게 됨 -> 빨라짐
  • 메모리와 디바이스 주소 공간에 접근하는 명령어가 하나로 단순화 됨 -> 구현이 쉬워짐
  • 메모리 주소 공간 안에 여러 개의 디바이스 메모리 주소 공간을 매핑 -> 효율적인 메모리 사용

그림 3. Address space overview

하지만 MMIO가 갖고 있는 단점들도 있다.

  • 메모리 주소 공간에 여러 개의 디바이스 메모리 주소 공간을 매핑하기 때문에 디바이스를 위한 주소 공간이 제한됨
  • 디바이스의 처리 속도가 느리기 때문에 제어 버스에 병목점이 발생할 수 있음 -> 메모리 접근이 느려질 수 있음

#3 MMIO operation

        MMIO store는 단방향 소통으로 CPU가 메모리 주소 공간에 매핑된 디바이스 메모리의 주소를 통해 CPU 캐시의 데이터를 전송한다. 반면에 load는 양방향 소통으로 CPU가 디바이스 메모리 주소를 디바이스에 요청하면, 디바이스가 CPU 캐시에 데이터를 전송한다. 따라서 store는 호스트의 관점에서 명령을 전달하면 요청이 완료되지만, load는 데이터를 전달받기까지 데이터를 폴링하고 있어야 한다.

그림 4. MMIO operation

 

  위와 같은 상황에서 store 연산과 load 연산이 동시에 발생한다고 가정하면, 일관성과 동시성 문제에 있어서 순서를 보장하는 것이 매우 중요하다. 리눅스의 경우 커널 단위에서 아토믹 연산과 lock을 통해 순서 보장을 지원한다. 하지만 디바이스의 메모리는 이런 순서 보장에 취약하기 때문에 PCIe 상에 inflight 되는 요청은 하나만 가능하다. 따라서 store 연산은 연속된 요청이 들어와도 하나씩만 수행 가능하기 때문에 throughput이 매우 떨어지게 된다. 이를 해결하기 위해 커널에서는 Write-Combining Buffer(WC)를 이용하여 store 연산을 batching을 통해 throughput을 향상한다. MMIO는 일반적으로 작은 단위의 데이터 전달을 수행하기 때문에 WC의 사이즈는 64B cache-alined이며, 연산 간의 순서 및 버퍼 플러쉬를 보장하기 위해 sfence와 같은 알고리즘과 같이 동작한다.

 

 

 

그림 출처

- 그림 1: https://www.geeksforgeeks.org/memory-mapped-i-o-and-isolated-i-o/

- 그림 2:https://www.geeksforgeeks.org/memory-mapped-i-o-and-isolated-i-o/ 

- 그림 3: https://www.baeldung.com/cs/memory-mapped-vs-isolated-io

'컴퓨터 과학 > 컴퓨터 구조' 카테고리의 다른 글

NUMA (Non-Uniform Memory Access)  (0) 2024.05.16
메모리 구조 (Memory Architecture)  (0) 2024.05.14

+ Recent posts