컴퓨터의 원리 2강. 스위치 몇 개로 덧셈을 하다
컴퓨터 안에는 계산하는 기계가 없습니다. 켜지고 꺼지는 스위치가 있고, 그 배열이 우연히 덧셈처럼 보일 뿐입니다.
풀고 시작
불이 남긴 대수, 섀넌이 찾은 용도
조지 불(George Boole)이 1854년에 『사고의 법칙 연구』를 냈을 때, 그의 목표는 기계가 아니라 인간의 사유였습니다. 그는 참과 거짓이라는 두 값만 갖는 대수를 만들어 논리 추론을 계산처럼 다뤘습니다. 이 작업은 80년 넘게 순수 논리학의 영역에 머물렀죠. 그러다 1937년, 스물한 살의 대학원생 클로드 섀넌이 석사 논문에서 폭탄을 던집니다. 전화 교환기의 계전기 스위치가 켜짐과 꺼짐이라는 두 상태를 가지므로, 불 대수의 참·거짓과 완벽히 대응한다는 관찰이었습니다. 이 한 줄로 논리학은 배선도가 되었습니다. 그때부터 회로를 설계한다는 것은 원하는 진리표를 만족하는 논리식을 세우고, 그 식을 게이트로 옮기는 작업이 됩니다. 조건문과 대우, 논리곱과 논리합이라는 도구는 수학 서가 논리와 증명에서 다룬 것과 같은 물건이고, 이 회로들은 그 규칙을 전압으로 구현한 것입니다.
트랜지스터는 그냥 스위치입니다
논리 게이트를 만들려면 "다른 신호가 켜고 끄는 스위치"가 필요합니다. 그 역할을 하는 것이 트랜지스터입니다. 오늘날 칩에 쓰이는 MOS 트랜지스터는 게이트 단자에 전압을 걸면 반도체 내부에 전하가 지나갈 통로가 생기고, 전압을 빼면 그 통로가 사라지는 소자입니다. 손가락 대신 전압이 누르는 스위치인 셈이죠. 비유를 여기서 멈추지 않는 것이 중요합니다. 실제로 일어나는 일은 전기장이 채널의 전하 밀도를 바꿔 소스와 드레인 사이의 전도도를 제어하는 것이고, 그래서 이 스위치는 기계식과 달리 마모 없이 초당 수십억 번을 여닫을 수 있습니다. 순수한 스위치 수준에서 보면 두 개를 직렬로 이었을 때 둘 다 켜져야 전류가 흐르니 AND가 되고, 병렬로 이으면 하나만 켜져도 흐르니 OR이 됩니다. 다만 실제 CMOS 회로는 출력이 반드시 뒤집혀 나오는 구조라서, 직렬 배치에서 자연스럽게 얻어지는 것은 AND가 아니라 NAND이고 병렬 배치에서 얻어지는 것은 NOR입니다. AND를 쓰려면 NAND 뒤에 인버터를 한 단 더 붙여야 하죠. 그래서 실제 공정은 NAND와 NOR를 기본 블록으로 삼습니다. 여기에 한 가지 성질이 겹칩니다. NAND만 반복해 조합하면 AND와 OR과 NOT을 전부 만들 수 있습니다. 이것을 기능적 완전성이라고 부릅니다.
반가산기에서 전가산기로
이제 덧셈을 조립해 봅시다. 한 자리 이진 덧셈의 진리표는 네 줄뿐입니다. 0+0은 합 0에 자리올림 0, 0+1과 1+0은 합 1에 자리올림 0, 1+1은 합 0에 자리올림 1입니다. 합 자리만 떼어 보면 두 입력이 다를 때만 1이니 XOR이고, 자리올림만 떼어 보면 둘 다 1일 때만 1이니 AND입니다. XOR 하나와 AND 하나, 이것이 반가산기(half adder)의 전부입니다. 덧셈이라는 산술이 논리 게이트 두 개로 무너지는 순간이죠. 다만 반가산기는 아랫자리에서 올라온 자리올림을 받지 못합니다. 그래서 반가산기 두 개와 OR 게이트 하나를 엮어 입력 세 개를 처리하는 전가산기(full adder)를 만듭니다. 전가산기를 자릿수만큼 옆으로 늘어놓고 자리올림 선을 다음 칸에 물리면 64비트 덧셈기가 완성됩니다. 곱셈은 덧셈과 자리 이동의 반복이고, 뺄셈은 보수를 취한 덧셈입니다. 결국 산술 연산 전체가 이 조립의 확장입니다.
기억하는 회로: 되먹임과 플립플롭
지금까지의 회로는 입력이 사라지면 출력도 사라집니다. 이런 회로를 조합 회로라고 부르는데, 이것만으로는 컴퓨터를 만들 수 없습니다. 어제 계산한 값을 오늘 쓰려면 기억이 필요하니까요. 해법은 뜻밖에 단순합니다. 게이트의 출력을 자기 입력 쪽으로 되돌려 묶는 것입니다. NOR 게이트 두 개를 서로의 입력에 교차로 연결하면, 한번 정해진 상태가 스스로를 계속 확인하며 유지됩니다. 이것이 SR 래치이고, 여기에 언제 값을 받아들일지 통제하는 회로를 붙인 것이 플립플롭(flip-flop)입니다. 플립플롭 하나가 1비트를 붙잡고, 이것을 여러 개 묶으면 레지스터가 되며, 그 위에 캐시와 주기억장치가 올라갑니다. 회로에 되먹임이 들어오는 순간 시간이 개입하고, 이런 회로를 순차 회로라고 부릅니다.
클록: 모두가 같은 박자에 움직이는 이유
되먹임이 생기면 새로운 문제가 따라옵니다. 신호가 게이트를 통과하는 데는 시간이 걸립니다. 이것을 전파 지연이라고 하는데, 경로마다 지연이 달라서 덧셈기 출력은 계산이 끝나기 전 잠시 엉뚱한 값으로 요동칩니다. 그 요동치는 값을 플립플롭이 덜컥 저장하면 계산은 망가집니다. 그래서 회로 전체에 일정한 박자를 뿌리는 신호를 넣습니다. 이것이 클록(clock)입니다. 플립플롭은 클록의 가장자리가 올 때만 입력을 붙잡고, 그 사이 시간 동안 조합 회로가 마음껏 요동치도록 내버려 둡니다. 여기서 컴퓨터 성능의 근본 제약이 나옵니다. 클록 주기는 회로에서 가장 느린 경로가 안정되는 시간보다 길어야 합니다. 이 가장 느린 경로를 임계 경로라고 부르고, 설계자들이 파이프라인으로 단계를 잘게 쪼개는 이유가 바로 이 경로를 짧게 만들기 위해서입니다. 클록을 무한정 올리지 못하는 이유와 그 결과는 3강과 이어집니다.
인출 문제
생각해볼 질문 (정답 없음)
- 덧셈 회로는 덧셈의 의미를 전혀 모른 채 진리표만 만족시킵니다. 그렇다면 계산이 "옳다"는 판단은 회로 안에 있는 것일까요, 아니면 그 출력을 수로 읽기로 한 우리의 약속 안에 있는 것일까요.
이전: 컴퓨터의 원리 1강 · 다음: 컴퓨터의 원리 3강