입출력과 버스
CPU와 메모리만으로는 아무 쓸모가 없다. 키보드로 명령을 받고, SSD에서 파일을 읽고, 화면에 그림을 보내고, 네트워크로 대화해야 비로소 컴퓨터가 된다. 이 장에서는 CPU가 수많은 바깥 장치와 어떻게 말을 주고받는지, 그리고 그 대화가 왜 컴퓨터 속도를 좌우하는지 살펴본다. 주방으로 치면 주문 창구, 식자재 반입구, 서빙 창구의 이야기다.
- 장치 컨트롤러, 레지스터, 드라이버가 장치와의 대화를 나눠 맡는 구조를 설명한다.
- 폴링, 인터럽트, DMA의 차이를 시뮬레이터로 비교하고 CPU가 아끼는 시간을 확인한다.
- USB, PCIe, SATA 같은 연결 방식의 대역폭 차이를 전송 시간으로 느껴 본다.
- 프레임 버퍼와 주사율, 화면 찢김과 V-Sync의 원리를 이해한다.
- 키 하나를 눌렀을 때 글자가 화면에 나타나기까지의 경로를 따라간다.
장치마다 작은 관리인이 있다
CPU가 SSD의 플래시 셀이나 Wi-Fi 칩의 전파를 직접 조종하지는 않는다. 각 장치에는 그 장치를 전문으로 다루는 작은 칩, 즉 장치 컨트롤러(device controller)가 붙어 있다. 컨트롤러 안에는 CPU가 읽고 쓸 수 있는 몇 개의 칸(장치 레지스터)이 있다. “명령” 칸, “상태” 칸, “데이터” 칸 같은 것이다. CPU는 이 칸에 “블록 812번을 읽어라”라고 적고, 상태 칸을 보고 일이 끝났는지 확인한다.
장치마다 칸의 의미와 사용법이 다르기 때문에, 운영체제는 장치별 사용 설명서를 프로그램으로 만들어 둔다. 이것이 8장에서 본 드라이버다. 앱은 “파일을 읽어 줘”라고만 말하고, 드라이버가 그 장치의 언어로 번역해 컨트롤러에게 전한다.
요리사(CPU)가 직접 시장에 가거나 손님 테이블까지 음식을 나르지는 않는다. 식자재 반입 담당(SSD 컨트롤러), 서빙 담당(GPU), 주문 접수 담당(USB 컨트롤러)이 따로 있고, 요리사는 이들에게 쪽지(레지스터)로 지시한다. 담당자마다 일하는 방식이 달라서, 주방장(운영체제)은 담당자별 업무 매뉴얼(드라이버)을 갖고 있다.
끝났는지 어떻게 알까: 폴링, 인터럽트, DMA
CPU가 SSD에게 “블록을 읽어라”라고 시켰다. SSD는 CPU보다 수만 배 느리다. 그동안 CPU는 무엇을 해야 할까? 세 가지 방법이 있다.
- 폴링(polling): CPU가 “다 됐어?” 하고 상태 칸을 쉬지 않고 확인한다. 간단하지만 기다리는 내내 CPU가 묶인다. 배달 앱을 1초마다 새로고침하는 것과 같다.
- 인터럽트(8장): 장치가 일을 마치면 CPU에게 신호를 보낸다. CPU는 그동안 다른 일을 한다. 대신 데이터 조각이 올 때마다 CPU가 직접 메모리로 옮겨 담아야 한다.
- DMA(Direct Memory Access): CPU는 “이 파일 전체를 메모리 이 위치로 옮겨 놓고 다 되면 알려 줘”라고 한 번만 지시한다. DMA 장치가 메모리로 직접 옮기고, 모두 끝났을 때 인터럽트를 한 번 건다.
파일 하나를 읽는 동안 CPU는 무엇을 하나
그래서 요즘 컴퓨터에서 대량의 데이터를 옮기는 장치, 즉 SSD, GPU, 네트워크 칩, 오디오 칩은 거의 모두 DMA를 쓴다. 4K 영상을 녹화하거나 큰 게임을 설치하는 동안에도 CPU가 다른 일을 여유 있게 할 수 있는 이유다. 반면 키보드처럼 가끔 아주 적은 데이터를 보내는 장치는 인터럽트만으로 충분하다.
DMA 없이 초당 수백 MB의 4K 영상을 녹화하면 무슨 일이 생길까?
위 시뮬레이터의 “인터럽트” 방식에서 블록 수를 최대로 늘려 보자. 실제 영상은 초당 수만 블록이다.
연결 통로의 폭: USB, PCIe, SATA
장치와 컴퓨터를 잇는 통로는 종류마다 폭(대역폭, 10장)이 크게 다르다. 같은 SSD라도 어떤 통로에 꽂느냐에 따라 속도가 수십 배 차이 난다. 요즘 고속 통로들은 공통점이 있다. 여러 가닥의 전선에 0과 1을 동시에 싣는 대신, 몇 가닥에 아주 빠르게 차례로 싣고(직렬), 필요하면 이런 가닥 묶음(레인)을 여러 개 나란히 쓴다. PCIe x4는 레인 4개, x16은 16개다.
이 파일을 옮기는 데 얼마나 걸릴까
화면은 어떻게 그려지나: 프레임 버퍼와 주사율
GPU는 완성된 화면 한 장을 메모리의 특별한 영역에 그려 둔다. 이 영역을 프레임 버퍼(frame buffer)라 한다. 4K 화면이면 약 830만 픽셀 × 4바이트 ≈ 33 MB다. 모니터는 이 버퍼를 1초에 60번(60 Hz), 또는 120번, 144번씩 위에서 아래로 한 줄씩 읽어 가며 화면을 다시 칠한다. 1초에 화면을 몇 번 다시 칠하는지가 주사율(refresh rate)이다.
문제는 GPU가 그림을 완성하는 속도(초당 프레임 수, fps)와 모니터가 읽는 속도가 맞지 않을 때 생긴다. 모니터가 화면의 절반쯤 읽었을 때 GPU가 새 그림으로 바꿔 버리면, 화면의 위쪽은 옛 그림, 아래쪽은 새 그림이 된다. 움직이는 물체가 가로로 어긋나 보이는 이 현상이 화면 찢김(tearing)이다.
화면 찢김과 V-Sync (슬로 모션)
키 하나가 글자가 되기까지
지금까지 본 조각들을 모아, 키보드의 A 키를 눌러 메모장에 ‘a’가 나타나기까지를 따라가 보자. 14장의 큰 여행 중 첫 몇 걸음을 확대한 것이다.
핵심 정리
- 장치마다 컨트롤러가 있고, CPU는 컨트롤러의 레지스터에 명령을 적어 장치를 다룬다. 장치별 사용법은 드라이버가 안다.
- 폴링은 계속 확인하며 기다리고, 인터럽트는 장치가 알려 주며, DMA는 대량 운반을 전담 장치에 맡겨 CPU를 해방한다.
- 연결 통로(USB, PCIe, SATA)는 대역폭이 크게 다르다. 가장 느린 구간이 전체 속도를 정한다.
- GPU는 프레임 버퍼에 그림을 그리고, 모니터는 주사율만큼 위에서 아래로 읽는다. 둘이 어긋나면 화면 찢김, V-Sync로 맞추면 끊김이 생길 수 있다.
- 키보드는 “몇 번 키”만 알리고, 글자의 의미는 드라이버와 운영체제가 정한다.
확인 퀴즈
CPU가 장치에 명령을 내리는 일반적인 방법은?
대용량 파일을 읽을 때 CPU 부담이 가장 적은 방식은?
NVMe SSD를 USB 2.0 포트에 연결한 외장 케이스에 넣었다. 속도는?
게임이 90 fps로 돌고 모니터는 60 Hz다. V-Sync를 끄면 생기기 쉬운 현상은?
키보드가 컴퓨터에 보내는 것은?