Search
Duplicate

컴퓨터 구조 및 설계/ 컴퓨터 추상화 및 관련 기술

서론

1940년대 후반 전자식 컴퓨터가 등장한 이래 계속되는 기술 혁신 경쟁은 다른 분야에서는 전례 없는 빠른 진보를 이루어내고 있다. 만일 운수 산업이 컴퓨터 산업과 같은 속도로 발전했다면, 오늘날 뉴욕에서 런던까지 여행하는데 1초 밖에 걸리지 않을 것이며 그 요금은 겨우 몇 센트에 불과할 것이다.

컴퓨터 구조 분야의 8가지 위대한 아이디어

1.
Moore의 법칙을 고려한 설계
2.
설계를 단순화하는 추상화
3.
자주 생기는 일을 빠르게
4.
병렬성을 통한 성능 개선
5.
파이프라이닝을 통한 성능 개선
6.
예측을 통한 성능 개선
7.
메모리 계층구조
8.
여유분을 이용한 신용도 개선

프로그램 밑의 세계

소프트웨어들은 계층적으로 구성된다. 응용 프로그램이 가장 바깥쪽에 위치하며 여러 가지 시스템 소프트웨어(systems of software)가 하드웨어와 응용 소프트웨어 사이에 존재한다.
시스템 소프트웨어에는 여러 가지가 있으나 오늘날 모든 컴퓨터 시스템에서 핵심이 되는 두 가지는 운영체제와 컴파일러이다.

케이스를 열고

컴퓨터의 고전적 구성 요소 5가지는 입력, 출력, 메모리, 데이터패스(datapath), 제어(control) 유닛이다. 이 중 마지막 두 개는 합쳐서 프로세서(processor)라고 부르기도 한다.
각 화상은 화소(pixel)의 행렬로 구서오디며, 이것은 비트맵(bit map)이라 부르는 비트들의 행렬로 표현된다.
그래픽을 지원하는 하드웨어의 중심이 되는 것은 비트맵을 기억하는 프레임 버퍼(frame buffer 또는 raster refresh buffer)라고 하는 부분이다.
그래픽 하드웨어는 스크린에 표시될 화상을 프레임 버퍼에 저장하였다가 기억된 각 화소의 비트 패턴을 재생 속도에 맞추어 그래픽 디스플레이로 보낸다.
프로세서는 프로그램의 지시대로 일을 하는 부분으로 보드 내에서 가장 역동적인 부분이다.
숫자를 더하고 검사하고 입출력장치에 신호를 보내 작동을 지시하는 것 등이 프로세서가 하는 일이다. 프로세서를 CPU(central processor unit)이라는 더 관료적 느낌의 용어로 부르기도 한다.
프로세서는 논리적으로 데이터패스와 제어 유닛의 두 부분으로 구성된다. 각각은 프로세서의 근육과 두뇌에 해당한다.
데이터패스(datapath)는 연산을 수행하고 제어 유닛(control)은 명령어가 뜻하는 바에 따라 데이터패스, 메모리, 입출력 장치가 할 일을 지시한다.
메모리(memory)는 실행 중인 프로그램과 프로그램이 필요로 하는 데이터를 기억한다.
DRAM(dynamic random access memory)은 여러 개를 한데 묶어서 프로그램의 명령어와 데이터를 기억하는데 사용한다.
프로세서 내부에는 또 다른 종류의 메모리가 있는데 이것을 캐시 메모리(cache memory)라 한다.
캐시 메모리는 DRAM의 버퍼 역할을 하는 작고 빠른 메모리다.
캐시는 SRAM(static random access memory)이라는 다른 메모리 기술을 이용한다. SRAM은 DRAM 보다 빠르지만 집적도가 낮아서 가격이 비싸다.
SRAM과 DRAM은 메모리 계층구조의 두 계층을 구성한다.
추상화는 설계를 개선하는 위대한 아이디어의 하나이다. 제일 중요한 추상화 중 하나는 하드웨어와 최하위 소프트웨어 간의 인터페이스이다.
이것은 매우 중요한 것이므로 컴퓨터의 명령어 집합 구조(instruction set architecture) 또는 단순히 구조(architecture)라는 별도의 이름이 붙어 있다.
명령어 집합 구조에는 제대로 작동하는 이진 기계어 프로그램 작성을 위해 프로그래머가 알아야 하는 것이 모두 포함된다.
입출력 작업, 메모리 할당 및 기타 저수준 기능의 세부사항은 운영체제가 감추어서 응용 프로그래머가 이러한 세세한 부분을 걱정하지 않아도 되도록 해주는 것이 일반적이다.
응용 프로그래머에게 제공되는 기본 명령어 집합과 운영체제 인터페이스를 합쳐서 ABI(application binary interface)라 한다.
명령어 집합 구조는 컴퓨터 설계자로 하여금 실행 하드웨어와 독립적으로 컴퓨터의 기능을 생각할 수 있게 해준다.
네트워크 중에 가장 널리 알려진 것은 이더넷(Ethernet)일 것이다. 이더넷으로 연결할 수 있는 거리는 대략 1km정도이고 초당 40기가비트를 전송할 수 있다.
이런 정도의 길이와 속도는 한 건물의 같은 층에 있는 컴퓨터들을 연결하는데 유용하다. 그러므로 이더넷은 근거리 네트워크(LAN: local area network)의 일종이다.
라우팅 서비스와 보안을 제공하는 스위치를 사용하면 LAN들을 서로 연결할 수 있다.
원거리 네트워크(WAN: wide area network)는 여러 대륙들을 연결하여 웹(World Wide Web)을 지원하는 인터넷(Internet)의 근간을 이룬다.
이런 네트워크는 보통 광섬유(optical fiber)로 구성하며 통신회사에서 임대해준다.

프로세서와 메모리 생산 기술

트랜지스터(transistor)는 한 마디로 전기로 제어되는 온/오프 스위치이다. 집적회로는 수십, 수백 개의 트랜지스터를 칩 하나에 집적시킨 것이다.
Gordon Moore가 자원의 수가 계속 두 배가 될 것이라 예측했을 때, 그가 의미한 바는 칩 안에 집적되는 트랜지스터의 수가 그렇게 될 것이라고 예상한 것이었다.
집적회로 칩의 생산은 모래의 구성 성분인 실리콘에서 출발한다. 실리콘(silicon)은 전기가 통하기는 하는데 썩 잘 통하는 편은 아니어서 반도체(semiconductor)라고 한다.
특수한 화학적 처리를 거쳐 불순물을 첨가하면 실리콘의 작은 부분을 다음 세 가지 중 하나로 바꿀 수 있다.
전기의 양도체(초소형 구리나 알루미늄 전선)
전기 절연체(플라스틱 피복이나 유리 같은)
조건에 따라 도체가 되기도 하고 절연체가 되기도 하는 물질(스위치)
트랜지스터는 마지막 종류에 속한다. VLSI 회로(초대규모집적회로, very large scale integrated circuit)는 수십억 개의 도체, 절연체, 스위치를 작은 패키지 하나에 만들어 넣은 것이다.
집적회로 제조 공정은 칩 가격에 심각한 영향을 미치기 때문에 컴퓨터 설계자에게도 중요한 문제이다. 아래 그림 1.12는 집적회로 제조 과정을 보여준다.
공정은 큰 소시지 같이 생긴 실리콘 결정 괴(silicon crystal ingot)에서 시작된다. 오늘날 주로 사용되는 실리콘 괴의 직경은 8-12인치, 길이는 12-24인치 정도이다.
이 덩어리를 0.1인치 이하의 두께로 얇게 잘라 웨이퍼(wafer)를 만든다.
이렇게 잘라진 웨이퍼는 화학 물질을 첨가하여 부분 부분을 트랜지스터, 도체, 절연체로 바꾸는 일련의 공정을 거치게 된다.
오늘날의 집적회로에서 트랜지스터는 한 층으로 배치되지만, 금속 도체는 2-8개의 계층을 구성할 수 있다. 각 계층의 도체는 절연체 층으로 분리된다.
웨이퍼 자체에 미세한 흠집이 있었거나 여러 공정 중에 어느 한 부분에서라도 흠집이 생기면 웨이퍼의 그 부분은 못 쓰게 된다. 이러한 결함(defect) 때문에 완벽한 웨이퍼를 만든다는 것은 거의 불가능하다.
불완전성에 대처하기 위해 여러 가지 방법이 사용되지만, 그중 가장 간단한 방법은 한 웨이퍼에 독립적인 컴포넌트를 여러 개 만드는 것이다. 그런 다음 웨이퍼를 컴포넌트별로 자르는데 이것을 다이(die) 또는 칩이라 한다.
이렇게 여러 조각으로 나누면 웨이퍼에 결함이 생겼을 떄 웨이퍼 전체를 버리는 대신 해당 다이만 버리면 된다. 이 개념은 수율(yield)로 계량화 할 수 있다. 수율은 웨이퍼 상의 전체 다이 중 정상 다이의 비율로 정의된다.
다이 크기가 커지만 웨이퍼에 넣을 수 있는 다이가 적어지고, 수율이 떨어지므로 집적회로 가격이 급속히 증가한다.
원가 절감을 위해 차세대 프로세스를 이용해서 큰 다이를 축소시키기도 한다. 이것은 트랜지스터와 연결선의 크기를 줄임으로써 가능해진다. 이렇게 하면 수율과 웨이퍼당 다이 개수가 개선된다.
2012년에는 32nm 공정이 일반적이었는데, 이것은 다이에서 구현할 수 있는 최소 배선폭이 32nm라는 것을 의미한다.
결함이 없는 다이는 패키지의 입출력 핀과 연결하는데 이 과정을 본딩(bonding)이라 한다. 패키징 과정에서 잘못되는 경우도 있으므로 패키지가 끝난 것들에 대해 최종 검사를 시행해서 통과된 것들만 고객에게 납품된다.
집적 회로의 가격은 다음 3가지 간단한 식으로 표현할 수 있다.
다이 원가 = 워이퍼당 가격 / (웨이퍼당 다이 수율 x 수율)
웨이퍼당 다이의 수 ≈ 웨이퍼의 면적 / 다이의 면적
수율 = 1(1+12×(면적당 결함의 수×다이 면적))2{1 \over (1 + {1 \over 2} \times (\text{면적당 결함의 수} \times \text{다이 면적}))^{2}}

성능

성능의 정의

어떤 컴퓨터가 다른 컴퓨터보다 성능이 좋다는 것은 단순한 문제인 것처럼 보일지 모르지만, 생각보다 미묘한 문제이다. 여객기를 비유하면 항속, 비행거리, 탑승 인원 등의 요인이 있는데, 하나의 기준으로 성능을 따지기는 쉽지 않다.
두 데스크톱 컴퓨터에서 같은 프로그램을 실행시키는 경우에 먼저 끝나는 쪽이 더 빠른 컴퓨터라고 할 수 있을 것이다. 그러나 여러 대의 서버를 가지고 여러 사용자의 작업을 처리하는 데이터센터를 운영할 때는 하루 동안 더 많은 작업을 처리하는 컴퓨터가 더 빠른 컴퓨터일 것이다.
컴퓨터 사용자 개인의 입장에서는 응답시간(response time), 즉 실행시간(execution time)이 중요할 것이지만 데이터 센터 관리자에게는 처리량(throughput) 혹은 대역폭(bandwidth)이 더 중요하다.
그러므로 응답시간이 더 중요한 개인 휴대용 기기와 처리량이 더 중욯나 서버의 성능을 평가할 때는 대부분 다른 응용 프로그램과 다른 성능 척도를 사용한다.

성능의 측정

시간은 컴퓨터 성능의 가장 기본적인 척도이다. 여기서 프로그램 실행시간은 프로그램을 처리하는데 걸린 시간을 초 단위로 표시한 것이다. 그러나 시간은 우리가 재는 방법에 따라 여러 가지로 정의할 수 있다.
제일 쉽게 생각할 수 있는 것은 벽시계 시간(wall-clock time), 응답시간, 또는 경과시간(elapsed time)이라 부르는 것이다. 이것은 한 작업을 끝내는데 필요한 전체 시간을 뜻하는 것으로 디스크 접근, 메모리 접근, 입출력 작업, 운영체제 오버헤드 등 모든 시간을 다 더한 것이다.
그러나 컴퓨터를 공유하는 경우 프로세서 하나가 여러 프로그램을 동시에 실행하는 경우가 많이 있다. 이런 환경에서는 특정 프로그램의 경과시간을 최소화하는 것보다는 처리량을 최적화하는 것이 중요할 수 있다.
그러므로 경과시간과 구분해서 프로세서가 순수하게 이 프로그램을 실행하기 위해 소비한 시간을 계산할 필요가 있다. 이 시간을 CPU 실행시간(CPU execution time) 또는 단순히 CPU 시간(CPU time)이라고 하는데, 입출력에 걸린 시간이나 다른 프로그램을 실행하는데 걸린 시간은 여기 포함되지 않는다.
CPU 시간은 실제로 사용자 프로그램 실행에 사용된 사용자 CPU 시간(user CPU time)과 운영체제가 이 프로그램을 위한 작업을 수행하기 위해 소비한 시스템 CPU 시간(system CPU time)으로 다시 나눌 수 있다.
그러나 운영체제의 각 작업이 어떤 프로그램을 위해서 수행되고 있는가를 명확히 가려내는 것이 어렵고 운영체제 간의 기능 차이도 있기 때문에 시스템 CPU 시간과 사용자 CPU 시간을 정확히 구하는 것은 쉽지 않다.
논의의 일관성을 위해 경과시간을 기준으로 한 성능과 CPU 시간을 기준으로 한 성능을 구분하는 것이 좋겠다. 다른 부하가 없는 시스템에서의 경과시간으로 계산한 것을 시스템 성능, 사용자 CPU 시간으로 계산한 것을 CPU 성능이라고 부르기로 한다. 이 장에서는 CPU 성능에 초점을 맞춘다.
컴퓨터의 세세한 부분을 평가할 때는 다른 성능 척도를 사용하는 것이 편리할 때가 있다. 특히 컴퓨터 설계자는 하드웨어가 기본 함수를 얼마나 빨리 처리할 수 있는지와 관련된 성능 척도를 필요로 한다.
거의 모든 컴퓨터는 하드웨어 이벤트가 발생하는 지점을 결정하는 클럭을 이용하여 만들어진다. 이 클럭의 시간 간격을 클럭 사이클(clock cycle) –또는 틱, 클럭 틱, 클럭 주기, 클럭, 사이클 이라 한다– 클럭 주기(clock period)는 한 클럭 사이클에 걸리는 시간(예컨대 250 picoseconds, 250ps)이나 클럭 속도(예컨대 4GHz)로 표시한다. 클럭 속도는 클럭 주기의 역수이다.

CPU 성능과 성능 인자

가장 기본적인 척도인 클럭 사이클 수와 클럭 사이클 시간으로 CPU 시간을 표시하면 다음과 같다.
프로그램의 CPU 실행시간 = 프로그램의 CPU 클럭 사이클 수 x 클럭 사이클 시간
클럭 속도와 클럭 사이클 시간은 역수 관계이므로
프로그램의 CPU 실행시간 = 프로그램의 CPU 클럭 사이클 수 / 클럭 속도
이 공식을 보면 클럭 사이클의 길이를 줄이거나 프로그램 실행에 필요한 클럭 사이클 수를 줄이면 성능을 개선할 수 있음을 알 수 있다.

명령어 성능

앞의 수식에는 프로그램 수행에 필요한 명렁어 개수에 간한 사항이 포함되어 있지 않다. 그러나 컴파일러가 실행할 명령어를 생성하고 컴퓨터는 이 명령어를 실행해야 하기 때문에 실행시간은 프로그램의 명령어 수와 관련이 있다.
이런 관점으로 실행시간을 실행 명령어 수에 명령어의 평균 실행시간을 곱한 값으로 계산할 수도 있다. 그러므로 프로그램 실행에 필요한 클럭 사이클 수는 다음과 같다.
CPU 클럭 사이클 수 = 명령어 수 x 명령어당 평균 클럭 사이클 수
명령어당 클럭 사이클 수(clock cycles per instruction)은 줄여서 CPI로 줄여 쓰기도 한다.
명령어마다 실행시간이 다르므로 CPI는 플그램이 실행한 모든 명령어에 대해 평균한 값을 사용한다. 명령어 집합 구조가 같으면 프로그램에 필요한 명령어 수가 같으므로 CPI는 서로 다른 구현을 비교하는 한 가지 기준이 될 수 있다.

고전적인 CPU 성능식

이제 성능식을 명령어 개수(instruction count) CPI, 클럭 사이클 시간으로 표현하자
CPU 시간 = 명령어 개수 x CPI x 클럭 사이클 시간
클럭 속도는 클럭 사이클 시간의 역수이므로
CPU 시간 = (명령어 개수 x CPI) / 클럭 속도
가 된다. 이 식은 CPU 시간을 성능에 영향을 미치는 세 가지 핵심 인자로 표현하였기 때문에 매우 유용하다.
성능식의 세 인자 값은 어떻게 구할까?
클럭 사이클 시간은 보통 컴퓨터의 하드웨어 메뉴얼에 기록되어 있다.
명령어 개수는 실행 과정을 추적하는 소프트웨어 도구나 컴퓨터 구조의 시뮬레이터를 이용해서 측정할 수 있다.
그러나 CPI는 프로그램 실행에 사용되는 명령어 배합(instruction mix) 뿐 아니라 메모리 시스템과 프로세서 구조를 포함하는 여러 컴퓨터 세부 설계에 따라 달라진다. 따라서 CPI는 명령어 집합이 같더라도 구현 방식에 따라 달라질 뿐 아니라 응용 프로그램에 따라서도 달라진다.
명령어 개수와 CPI는 구하기 어렵지만 클럭 속도와 CPU 실행시간을 알 때, 명령어 개수나 CPI 중 하나를 알면 다른 하나는 계산으로 구할 수 있다.

전력 장벽

집적회로의 주된 기술인 CMOS(complementary metal oxide semiconductor)가 에너지를 소비하는 주원인은 동적 에너지(dynamic energy)이다. 동적 에너지란 트랜지스터가 0에서 1로 혹은 그 반대로 스위칭하는 동안에 소비되는 에너지를 말한다. 동적 에너지는 각 트랜지스터의 용량성 부하와 인가되는 전압에 의해 결정된다.
에너지용량성 부하×전압2\text{에너지} \propto \text{용량성 부하} \times \text{전압}^{2}
이 식은 0 -> 1 -> 0 혹은 1 -> 0 -> 1으로 논리 값이 두 번 바뀔 때 소모하는 에너지다. 한 번 바뀔 때 소모되는 에너지는 다음과 같다.
에너지12×용량성 부하×전압2\text{에너지} \propto {1 \over 2} \times \text{용량성 부하} \times \text{전압}^{2}
트랜지스터 하나가 소비하는 전력은 한 번 바뀔 때 소모되는 에너지와 시간당 논리값이 바뀌는 빈도수의 곱이다.
에너지12×용량성 부하×전압2×스위칭 빈도\text{에너지} \propto {1 \over 2} \times \text{용량성 부하} \times \text{전압}^{2} \times \text{스위칭 빈도}
스위칭 빈도는 클럭 속도의 함수이다. 트랜지스터의 용량성 부하는 출력 단자에 연결된 트랜지스터의 개수(팬아웃(fanout)이라고도 한다) 공정기술의 함수이다. 공정기술은 도선과 트랜지스터의 용량(capacitance)를 결정한다.
전력이 고작 30배 증가하는 동안 클럭 속도가 1000배 빨라질 수 있었던 이유는 새로운 공정기술이 나올 때마다 전압은 낮아졌고, 전력은 전압의 제곱에 비례하기 때문에 소비전력이 낮아질 수 있었기 때문이다.
오늘날의 문제는 전압을 더 이상 낮추면 트랜지스터 누설 전류가 너무 커진다는 것인데, 이는 꽉 잠기지 않는 수도꼭지의 문제와 같다.
서버 칩에서 현재 이미 40%의 전력이 누설에 의해 소모되고 있다. 트랜지스터의 누설이 더 증가한다면 공정 전체가 통제하기 어려워질 것이다.
컴퓨터 설계자들이 전력 장벽에 부딪혔기 때문에 앞으로 나아가기 위해서는 새로운 방법이 필요하였다. 그래서 초창기 30년 동안 마이크로프로세서를 설계하였던 것과는 다른 방식을 선택하게 되었다.

현저와 변화: 단일 프로세서에서 멀티프로세서로의 변화

단일 프로레서에서 한 프로그램의 응답시간을 계숙 줄여가는 대신, 모든 데스크톱과 서버 회사는 2006년에 칩에 여러 개의 프로세서를 집적한 마이크로프로세서를 생산하였는데, 이는 응답시간보다는 처리량 개선에 더 효과가 있다.
프로세서와 마이크로프로세서 두 용어 사이의 혼란을 줄이기 위해 회사들은 프로세서를 ‘코어’라 부르고 그러한 마이크로 프로세서를 멀티코어 마이크로프로세서라고 불렀다.
그러므로 ‘쿼드코어’ 마이크로프로세서는 4개의 프로세서, 즉 4개의 코어를 포함한 칩이다.
과거 프로그래머는 코드 한줄 바꾸지 않고도 하드웨어와 컴퓨터 구조, 컴파일러의 혁신에만 의존하여도 18개월마다 2배씩 성능 개선을 누릴 수 있었다. 하지만 오늘날 응답시간을 현저히 개선하려면 다중 프로세서의 장점을 사릴도록 프로그램을 재작성해야 한다.

실례: Intel Core i7 벤치마킹

SPEC CPU 벤치마크

실행시키는 프로그램들의 집합이 바로 작업부하(workload)가 될 수 있다. 따라서 두 컴퓨터 시스템을 평가하려면 두 컴퓨터에서 같은 작업 부하의 실행시간만 비교하면 된다. 그러나 대부분의 사용자는 이런 상황에 있지 않다.
그래서 보통은 성능을 측정하기 위해 선택된 프로그램의 집합, 즉 벤치마크(benchmark)를 사용해서 성능을 평가한다.
벤치마크는 사용자의 실제 작업부하에 대한 성능을 잘 반영할 것으로 생각되는 프로그램들로 구성된 작업부하이다.
SPEC(System Performance Evaluation Cooperative)은 최신의 컴퓨터 시스템을 위한 표준 벤치마크를 만들기 위해 여러 컴퓨터 회사가 자금을 대고 지원한 결과 만들어졌다.
1989년 프로세서 성능에 초점을 맞춘 벤치마크(오늘날 SPEC89라 부른다)를 처음 만들었는데, 이것이 다섯 세대를 거치며 진화해 왔다.
가장 최근에 발표된 것은 SPEC CPU2006으로 정수형 벤치마크 12개(CINT2006)와 부동소수점 벤치마크 17개(CFP2006)으로 구성되어 있다.
정수형 벤치마크는 C 컴파일러 일부분에서부터 체스 프로그램이나 양자 컴퓨터 시뮬레이션에 이르기까지 다양하다.
부동소수점 벤치마크는 유한요소 모델링을 위한 정렬격자계(structured grid) 코드, 분자 역학을 위한 입자기법(particle method) 코드, 그리고 유체 역학을 위한 희소 선형 대수 코드 등을 포함한다.
컴퓨터 마케팅을 간단하기 위해 SPEC은 12개 정수형 벤치마크의 결과를 숫자 하나로 요약하였는데, 기준 프로세서의 실행 시간을 측정하려는 컴퓨터의 실행시간으로 나누어 실행시간을 정규화한다. 이렇게 정규화한 결과를 SPECratio라고 한다.
SPECratio가 클수록 성능이 좋은 컴퓨터다. 즉 SPECratio는 실행시간의 역수이다.
Πi=1nrin\sqrt[n]{\Pi_{i=1}^{n} r_{i}}
(rir_{i}은 책에는 실행시간의 비i라고 표현되는 값이다. latex에 한글을 쓸 수 없어서 대체 표기)

SPEC 전력 벤치마크

에너지와 전력의 중요성이 증대함에 따라 SPEC은 전력을 측정하기 위한 벤치마크를 추가하였다. CPU 벤치마크에서와 같이 컴퓨터 마케팅을 간단히 하기 위해 SPEC은 이 값을 ‘전체 ssj_ops/watt’ 라는 숫자 하나로 요약한다.
ssj_opswatt=(i=010ssj_opsi)(i=010poweri){\text{ssj\_ops} \over \text{watt}} = {(\sum_{i=0}^{10} \text{ssj\_ops}_{i}) \over (\sum_{i=0}^{10} \text{power}_{i})}
ssj_opsi\text{ssj\_ops}_{i}는 10%씩 증가될 때마다의 성능이고 poweri\text{power}_{i}는 각 성능 수준에서 소비되는 전력이다.

오류 및 함정

함정: 컴퓨터의 한 부분만 개선하고 그 개선된 양에 비례해서 전체 성능이 좋아지리라고 기대하는 것.
자주 생기는 일을 빠르게 하라는 위대한 아이디어에 필연적으로 따라오는 사실하나가 하드웨어 설계자와 소프트웨어 설계자 모두를 괴롭혀왔다. 성능을 개선하려는 노력이 얼마나 효과 있는지는 그 사건이 얼마나 많이 발생하는지와 관련 있다는 것이다.
일부분의 성능 개선으로 얻을 수 있는 전체 시스템 성능 증가는 개선된 부분이 얼마나 많이 사용되느냐에 달려 있다. 우리가 일상생활에서 수확체감의 법칙이라고 부르는 것도 이 개념에서 나온 것이다.
오류: 이용률이 낮은 컴퓨터는 전력 소모가 작다.
서버의 부하가 작을 때에도 최대 전력의 상당 부분을 사용한다.
오류: 성능에 초점을 둔 설계와 에너지 효율에 초점을 둔 설계는 서로 무관하다.
에너지는 전력을 시간에 대해 적분한 것이므로 어떤 하드웨어나 소프트웨어 최적화 기술이 에너지를 더 소비하더라도 실행시간을 줄여서 전체 에너지를 절약하기도 한다.
프로그램이 수행되는 동안 최적화와 관련 없는 다른 부분이 에너지를 소모하기 떄문에 실행시간이 짧아지면 시스템의 전체 에너지가 절약된다.
함정: 성능식의 일부분을 성능의 척도로 사용하는 것.
제한된 상황에서는 세 인자 중 두 개를 사용하는 것이 타당한 경우도 있지만, 이 방법은 오용 가능성이 너무 크다.

결론

하드웨어 설계자나 소프트웨어 설계자 모두 계층적으로 컴퓨터 시스템을 만들고 있다. 이 방법은 하위 계층의 세부 사항이 상위 계층에서는 보이지 않도록 한다. 이 추상화의 위대한 아이디어는 오늘날 컴퓨터 시스템을 이해하는데 필수적이다.
하지만 이것이 설계자는 한가지 계층만 알면 된다는 뜻은 아니다. 아마 가장 중요한 추상화의 예는 하드웨어와 하위 소프트웨어 간의 인터페이스일 것이다. 이것을 명령어 집합 구조라 부른다.
명령어 집합 구조를 고정시키면 동일한 소프트웨어를 실행시키면서도 가격과 성능이 서로 다른 여러 가지 구현이 가능하다. 반면 이 인터페이스의 변경이 필요한 신기술은 받아들이기 어렵게 만드는 역효과도 있다.
실행시간만이 흠잡을 데 없이 유효한 성능 척도이다. 다른 많은 척도들이 제안되었지만 모두 허점이 있었다.
현대의 프로세서 관련 핵심 하드웨어 기술은 실리콘이다. 집적회로 기술 자체에 대한 지식만큼이나 중요한 것이 Moore의 법칙으로 예견할 수 있는 기술의 발전 속도에 대한 이해이다.
실리콘 반도체가 급속한 하드웨어 발전의 원동력이 되는 한편, 컴퓨터 구조상의 새로운 아이디어는 가격 대 성능비를 개선하는 역할을 한다.
그 중 중요한 것 두 가지는 프로그램이 가지고 있는 병렬성을 이용하는 것과 메모리 계층구조에 대한 접근 지역성(locality)을 이용하는 것(예컨대 캐시 메모리)이다.