1부 하드웨어
이 책을 앞에서부터 읽으면 컴퓨터 시스템을 bottom-up으로 설명한다. 그러나 각 장을 순서대로 읽지 않아도 된다.
컴퓨터 시스템을 구현할 때 가장 기본적인 원리는 '추상화, 모듈화'이다. 컴퓨터를 설계하는 사람은 ram 내부의 칩 하나하나에 있는 레지스터들이 '어떻게' 동작하는지 몰라도 된다. 그저 ram이라는 모듈이 '무엇을' 하는지 설명되어 있는 인터페이스를 보고 사용하면 된다. 사용해서 컴퓨터를 설계하면 된다. 하드웨어, 소프트웨어 개발자는 이 추상화-구현 패러다임을 통해 매우 크고 복잡한 컴퓨터 시스템을 모듈 단위로 잘 설계해서 구현과 오류 해결이 쉽고 복잡도가 낮은 시스템을 만들 수 있다.
고수준 프로그래밍 언어가 컴파일러에 의해 저수준 기계어로 번역되고, 기계어가 어셈블러에 의해 0과 1의 이진수로 변경되고, 이진수가 cpu에 전달되고, cpu 내부의 alu/ram에 전달된 후 논리 게이트를 거치면서 동작되는 전체의 과정을 생각해보자. (top-down) 고수준 모듈은 저수준의 추상화된 모듈들을 사용해서 만들어진다는 것을 알 수 있다.
1장. 불 논리
불 대수는 1/0, 예/아니오, on/off, true/false와 같은 불 2진 값을 다룬다. 컴퓨터는 2진수를 표현하고 처리하는 하드웨어이므로 불 함수는 하드웨어 아키텍처를 다룰 때 핵심적인 개념이다. 불 연산자(불 함수)에는 and, or, nor, nand, xor이 있다. 불 함수 여러 개를 연결해서 여러 개의 입력값을 받은 후 출력값을 도출하는 불 함수를 만들 수도 있다.
논리 게이트는 불 함수를 구현한 물리적인 장치이다. 각 불 함수에 해당하는 칩을 구리선으로 연결한 후 상자에 넣으면 논리 게이트가 완성된다. 이렇게 완성된 칩들은 나중에 cpu와 메모리 장치를 만들 때 쓰인다.
2장. 불 연산
논리 게이트를 이용해서 산술 논리 연산 장치(arithmetic logical unit, alu)를 만들어보자. alu는 cpu가 계산할 때 핵심적으로 사용되는 부품이다. n비트의 2진수 두 개를 더하는 가산기(adder) 칩은 alu 명세의 기본이 된다.
사용자가 10진수로 19에 해당하는 숫자를 컴퓨터에 저장하면, 메모리에는 10011이 저장된다. 컴퓨터에게 다시 그 숫자를 꺼내서 화면에 보이라고 명령하면 os는 10011을 가져와서 10진수로 다시 계산하고 화면에 렌더링한다. 이렇게 컴퓨터는 모든 수를 2진수로 계산하기 때문에 매번 2진수-10진수, 10진수-2진수로 변환하는 과정을 거쳐야 한다.
컴퓨터는 어떤 수를 표현할 때 '고정 단어 크기'를 사용해야 한다. 하드웨어가 숫자를 저장할 때 공간에 한계가 있기 때문이다. 컴퓨터가 연산을 할 때 기본적으로 사용되는 데이터의 단위를 'word'라고 한다. 보통 일정한 비트 수로 이루어지며, 컴퓨터의 모든 명령은 word 단위로 수행된다. 보통 word의 길이는 cpu에서 사용되는 범용 레지스터의 길이와 같으며, 컴퓨터에 따라 다르다. 16bit 컴퓨터, 32bit 컴퓨터라는 것은 word의 길이를 의미한다.
8bit 레지스터로 정수를 표현하면 2^8 = 256개의 서로 다른 숫자를 표현할 수 있다. 즉 n-bit 레지스터로는 부호 없는 정수 2^n개를 표현할 수 있다. (0 ~ (2^n)-1) 그러면 고정된 레지스터가 표현할 수 있는 것보다 큰 숫자를 어떻게 표현할 수 있을까? 모든 고수준 언어는 우리가 고정된 레지스터보다 더 큰 숫자를 표현할 수 있도록 n-bit 레지스터들을 묶는 추상화 기법을 제공한다. 표현하고 싶은 크기 만큼 레지스터를 묶어서 숫자를 표현하면 된다. 그러나 여러 레지스터를 이은 숫자끼리의 산술 및 논리 연산은 시간이 더 오래 걸리므로, 꼭 필요할 때만 사용하고 가능한 범위라면 word 단위로 연산하는 것이 효율적이다.
가산기의 종류는 세 가지가 있다.
반가산기(half-adder)는 1bit짜리 이진수 두 개를 더한 합과 올림수를 구하는 가산기이다. 두 비트를 더해서 sum, carry 두 비트를 결과로 출력한다. 아래 표를 보면 반가산기의 sum, carry의 출력이 단순히 불 함수 두 개를 구현한 것과 동일하다는 것을 알 수 있다. 반가산기의 목적은 올림수를 구하는 것이다.




전가산기(full-adder)는 뒷자리에서 생성된 올림수까지 1bit짜리 세 개를 더한 합과 올림수를 구하는 가산기이다. 세 비트를 더해서 sum, carry 두 비트를 결과로 출력한다. 전가산기는 반가산기 회로를 두 개 사용해서 구현한다.



가산기(adder)은 n-bit짜리 이진수 두 개를 더하는 가산기이다. 컴퓨터는 정수를 8, 16, 32, 64 등 고정 단어 크기로 표현하는데 이러한 n-bit짜리 이진수 두 개를 더해서 n-bit짜리 결과를 출력한다. 아래 그림은 멀티 비트 가산기이다. 두 n-bit를 더하려면 오른쪽에서 왼쪽으로 1bit씩 덧셈을 하고 올림수를 다음에 수행될 덧셈 연산에 전달한다. 이 과정을 최상위 비트들을 더할 때까지 반복한다. 이런 식으로 멀티 비트 가산기를 구현하면 자리 올림 비트가 n개의 비트 덧셈에 전달되는 시간이 걸려서 비효율적이다. 실제로는 자리올림수 예측(carry lookahead) 기법을 사용하여 논리 회로의 연산 속도를 올린다.

여기에 더해서 특수 목적용 가산기인 증분기(incremeter)라는 게 있는데 이 칩은 주어진 숫자에 1을 더하는 가산기이다.
가산기 하나는 칩이 되고 가산기 칩을 여러 개 연결해서 산술 논리 장치(alu)를 만든다.
'CS' 카테고리의 다른 글
| [디자인 패턴] 정적 팩토리 메서드 (Static Factory Method) (0) | 2025.01.08 |
|---|---|
| [네트워크] Server-Sent Event (0) | 2025.01.05 |
| [운영체제] 동시성 이슈 해결 방법 - Semaphore/Mutex (8) | 2024.12.31 |
| [운영체제] 동시성 이슈란 - Race Condition/Data Race (1) | 2024.12.23 |
| [운영체제] 프로세스 - 메모리 공간/상태(state)/문맥 교환(context-switching)/pcb/프로세스 vs 스레드 (0) | 2024.12.20 |