Chapter 15

입출력과 버스

CPU와 메모리만으로는 아무 쓸모가 없다. 키보드로 명령을 받고, SSD에서 파일을 읽고, 화면에 그림을 보내고, 네트워크로 대화해야 비로소 컴퓨터가 된다. 이 장에서는 CPU가 수많은 바깥 장치와 어떻게 말을 주고받는지, 그리고 그 대화가 왜 컴퓨터 속도를 좌우하는지 살펴본다. 주방으로 치면 주문 창구, 식자재 반입구, 서빙 창구의 이야기다.

장치마다 작은 관리인이 있다

CPU가 SSD의 플래시 셀이나 Wi-Fi 칩의 전파를 직접 조종하지는 않는다. 각 장치에는 그 장치를 전문으로 다루는 작은 칩, 즉 장치 컨트롤러(device controller)가 붙어 있다. 컨트롤러 안에는 CPU가 읽고 쓸 수 있는 몇 개의 칸(장치 레지스터)이 있다. “명령” 칸, “상태” 칸, “데이터” 칸 같은 것이다. CPU는 이 칸에 “블록 812번을 읽어라”라고 적고, 상태 칸을 보고 일이 끝났는지 확인한다.

장치마다 칸의 의미와 사용법이 다르기 때문에, 운영체제는 장치별 사용 설명서를 프로그램으로 만들어 둔다. 이것이 8장에서 본 드라이버다. 앱은 “파일을 읽어 줘”라고만 말하고, 드라이버가 그 장치의 언어로 번역해 컨트롤러에게 전한다.

CPU드라이버가 실행됨 메모리RAM 공용 통로 (버스 · PCIe) SSD 컨트롤러명령·상태·데이터 GPU프레임 버퍼 USB 컨트롤러키보드·마우스 네트워크 칩Wi-Fi·이더넷 오디오 칩스피커·마이크 플래시 칩모니터USB 기기안테나·케이블스피커 CPU는 각 컨트롤러의 레지스터에 명령을 적고, 컨트롤러가 실제 장치를 다룬다.
그림 15-1. 입출력 장치의 구조. 장치마다 컨트롤러라는 작은 관리인이 있고, CPU와 메모리, 컨트롤러들은 공용 통로(버스)로 이어져 있다.
주방의 창구들

요리사(CPU)가 직접 시장에 가거나 손님 테이블까지 음식을 나르지는 않는다. 식자재 반입 담당(SSD 컨트롤러), 서빙 담당(GPU), 주문 접수 담당(USB 컨트롤러)이 따로 있고, 요리사는 이들에게 쪽지(레지스터)로 지시한다. 담당자마다 일하는 방식이 달라서, 주방장(운영체제)은 담당자별 업무 매뉴얼(드라이버)을 갖고 있다.

끝났는지 어떻게 알까: 폴링, 인터럽트, DMA

CPU가 SSD에게 “블록을 읽어라”라고 시켰다. SSD는 CPU보다 수만 배 느리다. 그동안 CPU는 무엇을 해야 할까? 세 가지 방법이 있다.

SIMULATOR

파일 하나를 읽는 동안 CPU는 무엇을 하나

방식
 
CPU가 다른 일을 한 비율—
인터럽트 횟수—
CPU가 직접 옮긴 블록—
위쪽 띠는 CPU, 아래쪽 띠는 SSD다. 빨강 = 상태 확인하며 기다림, 파랑 = CPU가 데이터를 메모리로 옮김, 주황 = 설정, 초록 = 다른 프로그램을 위한 일. 해볼 것: 세 방식에서 초록색이 얼마나 되는지 비교해 보자. 실제 비율 차이는 훨씬 극단적이다. SSD 블록 하나를 기다리는 동안 CPU는 수십만 박자를 보낸다.

그래서 요즘 컴퓨터에서 대량의 데이터를 옮기는 장치, 즉 SSD, GPU, 네트워크 칩, 오디오 칩은 거의 모두 DMA를 쓴다. 4K 영상을 녹화하거나 큰 게임을 설치하는 동안에도 CPU가 다른 일을 여유 있게 할 수 있는 이유다. 반면 키보드처럼 가끔 아주 적은 데이터를 보내는 장치는 인터럽트만으로 충분하다.

예측해 보기

DMA 없이 초당 수백 MB의 4K 영상을 녹화하면 무슨 일이 생길까?

위 시뮬레이터의 “인터럽트” 방식에서 블록 수를 최대로 늘려 보자. 실제 영상은 초당 수만 블록이다.

블록이 올 때마다 CPU가 인터럽트를 받고 직접 옮겨야 하므로 CPU 시간의 상당 부분이 단순 운반에 쓰인다. 처리가 밀리면 데이터를 제때 비우지 못해 영상 프레임이 빠진다. DMA는 운반을 전담 장치에 맡겨 이 문제를 없앤다.

연결 통로의 폭: USB, PCIe, SATA

장치와 컴퓨터를 잇는 통로는 종류마다 폭(대역폭, 10장)이 크게 다르다. 같은 SSD라도 어떤 통로에 꽂느냐에 따라 속도가 수십 배 차이 난다. 요즘 고속 통로들은 공통점이 있다. 여러 가닥의 전선에 0과 1을 동시에 싣는 대신, 몇 가닥에 아주 빠르게 차례로 싣고(직렬), 필요하면 이런 가닥 묶음(레인)을 여러 개 나란히 쓴다. PCIe x4는 레인 4개, x16은 16개다.

CALCULATOR

이 파일을 옮기는 데 얼마나 걸릴까

옮길 것
실제로 체감되는 대략적인 속도(MB/s)를 기준으로 했다. 표시 이름의 Gbps(비트) 값과 MB/s(바이트)는 8배 차이가 나고, 실제 속도는 규격 최대치보다 낮다. 가장 느린 구간이 전체 속도를 정한다는 점도 기억하자. 빠른 SSD를 USB 2.0 포트에 꽂으면 USB 2.0 속도밖에 나오지 않는다.

화면은 어떻게 그려지나: 프레임 버퍼와 주사율

GPU는 완성된 화면 한 장을 메모리의 특별한 영역에 그려 둔다. 이 영역을 프레임 버퍼(frame buffer)라 한다. 4K 화면이면 약 830만 픽셀 × 4바이트 ≈ 33 MB다. 모니터는 이 버퍼를 1초에 60번(60 Hz), 또는 120번, 144번씩 위에서 아래로 한 줄씩 읽어 가며 화면을 다시 칠한다. 1초에 화면을 몇 번 다시 칠하는지가 주사율(refresh rate)이다.

문제는 GPU가 그림을 완성하는 속도(초당 프레임 수, fps)와 모니터가 읽는 속도가 맞지 않을 때 생긴다. 모니터가 화면의 절반쯤 읽었을 때 GPU가 새 그림으로 바꿔 버리면, 화면의 위쪽은 옛 그림, 아래쪽은 새 그림이 된다. 움직이는 물체가 가로로 어긋나 보이는 이 현상이 화면 찢김(tearing)이다.

SIMULATOR

화면 찢김과 V-Sync (슬로 모션)

모니터 주사율60 Hz
이번 화면의 찢긴 곳—
실제로 보이는 장면 수—
흰 막대가 오른쪽으로 움직이는 게임 화면이다. 모니터가 위에서 아래로 읽어 내려가는 동안(주황 선) GPU가 그림을 바꾸면 막대가 어긋난다. 해볼 것: 90 fps에서 V-Sync를 켜면 찢김이 사라지지만 장면 수가 60으로 묶인다. 40 fps에서 V-Sync를 켜면? 같은 그림이 두 번씩 보이는 순간이 생겨 뚝뚝 끊긴다. 요즘 모니터의 가변 주사율(G-Sync, FreeSync)은 모니터가 GPU의 속도에 맞춰 기다려 주는 방식으로 두 문제를 함께 푼다.

키 하나가 글자가 되기까지

지금까지 본 조각들을 모아, 키보드의 A 키를 눌러 메모장에 ‘a’가 나타나기까지를 따라가 보자. 14장의 큰 여행 중 첫 몇 걸음을 확대한 것이다.

① 키보드 칩스위치 눌림 감지스캔 코드 0x04 ② USB 컨트롤러1 ms마다 상태 수신→ 인터럽트 ③ 드라이버0x04 = ‘A 키’키 사건 만들기 ④ 운영체제자판 배열·한영 적용→ 앞에 있는 창 ⑤ 메모장 앱글자 ‘a’ 추가메모리에 0x61 ⑥ GPU글꼴을 픽셀로프레임 버퍼에 그림 ⑦ 모니터다음 주사 때‘a’가 보인다 키보드는 ‘A’라는 글자를 모른다.“네 번째 키가 눌렸다”만 알린다.대문자·한글·배열은 운영체제가 정한다.
그림 15-2. 키 입력의 여행. 전체는 대개 10~30 ms 걸리는데, 그중 대부분은 USB가 상태를 읽는 간격과 모니터의 다음 주사를 기다리는 시간이다.

핵심 정리

  1. 장치마다 컨트롤러가 있고, CPU는 컨트롤러의 레지스터에 명령을 적어 장치를 다룬다. 장치별 사용법은 드라이버가 안다.
  2. 폴링은 계속 확인하며 기다리고, 인터럽트는 장치가 알려 주며, DMA는 대량 운반을 전담 장치에 맡겨 CPU를 해방한다.
  3. 연결 통로(USB, PCIe, SATA)는 대역폭이 크게 다르다. 가장 느린 구간이 전체 속도를 정한다.
  4. GPU는 프레임 버퍼에 그림을 그리고, 모니터는 주사율만큼 위에서 아래로 읽는다. 둘이 어긋나면 화면 찢김, V-Sync로 맞추면 끊김이 생길 수 있다.
  5. 키보드는 “몇 번 키”만 알리고, 글자의 의미는 드라이버와 운영체제가 정한다.

확인 퀴즈

CPU가 장치에 명령을 내리는 일반적인 방법은?

컨트롤러가 실제 장치를 다루고, CPU는 정해진 칸에 명령을 적고 상태를 읽는다. 그 절차를 담은 프로그램이 드라이버다.

대용량 파일을 읽을 때 CPU 부담이 가장 적은 방식은?

DMA는 전체 운반을 맡아서 하고 끝날 때 한 번만 알린다. CPU는 처음 설정과 마지막 확인만 하면 된다.

NVMe SSD를 USB 2.0 포트에 연결한 외장 케이스에 넣었다. 속도는?

데이터는 가장 좁은 통로를 지나야 한다. USB 2.0은 실제로 초당 수십 MB 정도다.

게임이 90 fps로 돌고 모니터는 60 Hz다. V-Sync를 끄면 생기기 쉬운 현상은?

모니터가 화면을 읽는 도중에 GPU가 버퍼를 바꾸면 위쪽은 옛 장면, 아래쪽은 새 장면이 된다.

키보드가 컴퓨터에 보내는 것은?

키보드는 키의 위치 번호(스캔 코드)만 보낸다. 같은 키가 영어 자판에서는 a, 한글 자판에서는 ㅁ이 되는 것은 운영체제가 해석하기 때문이다.