이제 본론으로 들어가 첫번째로 컴퓨터 시스템의 추상화에 대해 다뤄 보겠습니다. 독자분들 중 몇몇은 ‘추상화’라는 주제로 설명을 시작하는 것이 다소 생소하게 느껴질 수도 있겠지만, 오늘날의 컴퓨터 시스템은 매우 복잡하기 때문에 앞으로의 글을 이해하는 데 있어서, 그리고 컴퓨터구조라는 과목이 무엇에 대해 다루는지 알기 위해서는 어느 정도의 추상화가 필요할 것입니다.
왜 추상화가 필요한가?
다음과 같이 같은 대상을 지칭하는 두 개의 표현을 예로 들어 보겠습니다:
- ‘전압이 220V인 교류를 두 개의 볼록한 단자로 입력받아 8.4 mm x 2.6 mm 크기의 끝이 둥근 단자로 전압이 5V인 직류를 최대 3A 출력할 수 있는 장치’
- ‘15W Type-C 충전기’
여기서 많은 경우 2.에서 필요한 정보를 충분히 얻을 수 있기 때문에 항상 1.과 같이 자세하게 묘사하는 것은 그다지 효율적이지 못합니다. 대상이 복잡해질수록 1.과 같이 설명하기는 힘들어질 것입니다. 특히나 오늘날의 컴퓨터는 칩 하나에 수십억개의 트랜지스터 수준으로 복잡하기 때문에 이를 다루기 위해 여러 단계의 추상화를 거치게 됩니다.
컴퓨터의 개념
표현에 있어 다소 차이가 있을 수는 있겠지만 컴퓨터가 어떠한 프로그램에 따라 주어진 데이터를 처리하는 기계라는 것에 대해서는 대부분이 동의할 것입니다. 이때 프로그램은 기계적으로 해석될 수 있도록 아마도 엄격한 형식으로 되어 있을 테지요.
프로그램 밑에서...
우리는 컴퓨터 상에서 실행되는 웹 브라우저, 워드 프로세서 등과 같은 응용 프로그램을 이용합니다. 이러한 응용 프로그램의 동작은 알고리즘으로 추상화할 수 있으며, 응용프로그램이 처리하는 데이터는 자료구조로 추상화할 수 있습니다. 응용 프로그램에서 사용하는 자료구조 및 알고리즘은 인간이 이해하기 쉬운 어떤 정형화된 형식인 프로그래밍 언어로 작성됩니다.
int add (int a, int b)
{
int sum = a + b;
return sum;
}
그런데 이 프로그래밍 언어로 작성된 코드를 보면 변수 및 함수 이름의 길이도 제각각이고, 숫자도 일종의 기호로 표현되므로 크기에 따라 자릿수가 다릅니다. 기계가 바로 해석할 수 있는 형태가 아니라는 것은 분명합니다. 그래서 기계가 해석할 수 있는 형식인 기계어(machine language)로의 변환이 필요하고, 이 과정을 ‘컴파일’이라고 합니다. 이를 위해 컴파일러라는 프로그램을 사용합니다. 이러한 변환 과정은 복잡하기 때문에 컴퓨터 성능이 좋지 못했던 예전에는 매우 느린 작업이었고, 따라서 기계어로 빠르게 변환할 수 있도록 기계어와 가까운 형태인 ‘어셈블리’를 주로 사용했습니다.
add(int, int):
add w0, w0, w1
ret
기계어에서 실행의 단위는 명령어(instruction)이며, 이러한 명령어들을 숫자로 표현하는 형식과 각 명령어의 동작을 규격화한 것을 아키텍처(architecture) 또는 ISA(Instruction Set Architecture)라고 합니다. 예를 들어 ARM64 ISA에서 각 명령어는 다음과 같이 32-bit 숫자로 표현됩니다: (편의상 8자리 16진수로 나타냈습니다.)
0b010000
d65f03c0
ISA에서 기계어의 동작을 표준화했기 때문에 하드웨어에 대한 적절한 추상화가 제공된다면 같은 ISA를 따르는 서로 다른 컴퓨터에서 주어진 기계어 코드가 동일하게 실행될 수 있을 것입니다. 그렇기 때문에 ISA를 소프트웨어와 하드웨어 사이의 ‘약속’이라고 표현하기도 하죠. 이러한 추상화는 보통 운영체제라는 특수한 시스템 소프트웨어에서 담당합니다.

주어진 ISA에 따라 명령어를 실행하는 실제 머신의 구조를 추상화한 것을 마이크로아키텍처라고 하며, 여기서부터는 하드웨어의 영역입니다. 마이크로아키텍처는 회로의 형태로 구현됩니다. 하나의 응용 프로그램이 여러 가지 다른 종류의 컴퓨터에서 실행될 수 있었던 것처럼 마이크로아키텍처 또한 여러 가지 회로 구현이 있을 수 있습니다. 마이크로아키텍처와 회로 설계는 ISA에 따른 프로그램의 기능에는 영향을 미치지 않지만 성능 및 전력 소모에 영향을 줄 수 있습니다. (이 부분에 대해서는 나중에 다루도록 하겠습니다.) 오늘날의 마이크로아키텍처는 상당히 복잡하기 때문에 알고리즘을 프로그래밍 언어로 기술하는 것처럼 마이크로아키텍처를 RTL 언어로 기술하는 경우가 많습니다.
컴퓨터구조 과목은 어디서부터 어디까지 다루는가?
컴퓨터구조 과목은 주로 아키텍처(ISA)와 마이크로아키텍처에 대해 다룹니다. 커리큘럼에 따라 약간의 운영체제 관련 내용 또는 하드웨어 설계 관련 내용을 다루는 경우도 있습니다. 이 연재에서는 2.xx에서 ISA에 대해 다루고 3.xx 및 그 이후 글에서는 마이크로아키텍처에 대해 다룰 예정입니다.
추상화의 한계
앞서 추상화의 장점에 대해 설명했지만 항상 추상화가 완벽하게 작동하는 것은 아닙니다. 추상화의 존재로 인해 실행 파일의 기계어는 머신에서 실행할 수 있는 최적의 코드가 아닌 프로그래밍 언어로부터 변환될 수 있는 코드로 구성되고 여기서 다소 성능상의 손해가 발생합니다.
그리고 추상화는 대개 몇 가지의 가정을 포함하는데, 많은 경우 이 가정이 성립하지만 이러한 가정이 성립하지 않는 경우 의도치 않은 동작이 발생할 수 있기 때문에 (예: buffer overflow, rogue data cache load 등의 보안 취약점) 프로그램의 정확한 동작을 이해하기 위해서는 컴퓨터구조 관련 지식이 필요합니다.
다음 글에서는 컴퓨터의 역사를 통해 컴퓨터의 대략적인 구조를 간단하게 살펴보도록 하겠습니다. 감사합니다.
참고자료 및 웹사이트
Slide #2 (Introduction to Computer Architecture) from 4190.308: Computer Architecture | Fall 2022 | Jin-Soo Kim. (retrieved from csl.snu.ac.kr)
Compiler Explorer (C++, ARM64 gcc 12.2.0, -Og for the code in this article)
Computer Organization and Design RISC-V Edition: The Hardware Software Interface, 2nd Edition. Chapter 1.3
'컴퓨터공학 > 컴퓨터구조' 카테고리의 다른 글
A 1.05: 둘러보기 & 위대한 발상들 (0) | 2023.07.20 |
---|---|
A 1.02: 컴퓨터의 역사 [2] (0) | 2023.07.04 |
A 1.01: 컴퓨터의 역사 [1] (0) | 2023.07.03 |
A 0.00: 들어가며 (0) | 2023.06.04 |