과목 소개
1. 컴퓨터 구조는 어떤 과목인가?
컴퓨터란 무엇일까요? 컴퓨터라는 단어를 그대로 해석하면 계산하는 기계라는 뜻입니다. 하지만 일반적인 계산기와는 다른 컴퓨터의 가장 큰 특징은 바로 어떤 계산을 수행할지 지시할 수 있다는, 즉 프로그래밍이 가능하다는 것입니다.
21세기의 우리는 언제나 컴퓨터 곁에서 살아가지만, 컴퓨터를 사용하기만 해서는 그 내부 구조가 어떻게 설계되어 있는지 짐작하기 어렵습니다. 컴퓨터는 0과 1로만 연산을 수행한다고 하는데, 이를 이용해 어떻게 프로그래밍이 가능한 복잡한 기계를 만들 수 있었을까요?
0과 1로 이루어진 디지털 신호를 사용하는 회로를 논리 회로라고 합니다. 논리 회로는 아주 많은 일을 할 수 있지만, 복잡한 논리 회로를 한 번에 설계하는 것은 매우 어렵습니다. 복잡한 회로를 만들기 위해서는 먼저 간단한 일을 수행하는 작은 장치, 즉 부품들을 만든 뒤, 부품들을 조합해서 점차 복잡한 회로로 키워 나가야 합니다. 이렇게 하기 위해서는 먼저 복잡한 회로가 해야 하는 작업을 잘 분석해야 할 것입니다. 작업을 여러 단계로 쪼개고 분류해서 각 부품이 어떤 역할을 할지 정해야 합니다.
이러한 과정을 추상화(abstraction)라고 합니다. 추상화는 복잡한 과정으로부터 단순한 특징을 추출해 내는 과정을 말합니다. 추상화가 잘 되었다면 각각의 부품은 아주 단순한 일만 수행해도 됩니다. 뿐만 아니라, 각각의 부품의 내부 구조를 전혀 모르더라도 그 부품이 어떤 일을 수행하는지만 알면 이를 자유롭게 활용할 수 있습니다. 따라서 각각의 부품을 설계할 때는 그 부품이 하는 일에만 집중하면 됩니다. 추상화는 복잡한 장치를 설계하기 위해 꼭 필요한 도구이며, 컴퓨터과학에서 특히 중요한 개념입니다.
컴퓨터 구조라는 과목 이름만 들어서는 컴퓨터를 조립 하는 등 하드웨어를 다루는 과목일 것이라는 생각이 들 수 있는데요, 사실 이 과목에서는 우리가 컴퓨터라는 복잡한 기계를 설계할 수 있도록 만들어 준 여러 가지 추상화에 대해 배우게 됩니다. 컴퓨터 구조, 또는 컴퓨터 아키텍처(Computer Architecture)란 컴퓨터가 어떻게 구성되어 있는지, 구성 요소들이 어떻게 상호작용하는지를 나타낸 일종의 설계도를 의미합니다.
컴퓨터과학에서는 ‘어떻게 만들 것인가?’라는 문제 뒤에 항상 ‘어떻게 효율적으로 만들 것인가?’라는 문제가 따라옵니다. 이 과목에서는 컴퓨터의 성능을 높이기 위한 아이디어 또한 공부하게 됩니다. 컴퓨터공학자들이 조금이라도 더 효율적인 컴퓨터를 만들기 위해 얼마나 노력해 왔는지 느낄 수 있을 것입니다.
2. 폰 노이만 구조
먼저 컴퓨터를 구성하는 기본적인 부품에 대해 알아봅시다. 현대 컴퓨터의 구성 요소는 크게 중앙처리장치 또는 CPU (Central Processing Unit), 메모리(Memory), 입출력장치(Input/Output Device)로 구분할 수 있습니다. 이렇게 추상화한 구조를 폰 노이만 구조(Von Neumann architecture)라고 합니다. CPU는 명령(Instruction)을 처리하는 장치이며, 직접적인 계산이 여기에서 이루어집니다. 다음으로, 메모리는 CPU가 처리할 데이터를 저장하기 위한 장치입니다. 명령 또한 데이터이기 때문에, 단순한 데이터뿐만 아니라 CPU가 처리해야 하는 명령 자체도 메모리에 저장됩니다. 마지막으로 입출력장치는 CPU와 메모리가 외부와 데이터를 주고받을 수 있도록 하는 장치입니다. 사람과 컴퓨터가 직접 상호작용할 수 있도록 해 주는 키보드, 마우스, 모니터, 스피커뿐만 아니라 하드디스크, USB 등의 저장장치도 여기에 해당됩니다.
아래는 폰 노이만 구조를 간단히 나타낸 그림입니다. 그림을 따라 컴퓨터의 동작 과정을 간단히 살펴보겠습니다. 컴퓨터는 먼저 입출력장치로부터 처리해야 할 명령과 데이터를 메모리로 불러옵니다 (1). CPU는 메모리에서 명령을 순서대로 읽어옵니다. 명령들은 메모리의 어떤 값을 불러와야 하는지, 값을 어떻게 계산해야 하는지, 어떤 값을 메모리에 다시 저장해야 하는지 등 CPU가 해야 하는 모든 일을 명시해 줍니다 (2). 계산이 끝난 이후 메모리에 저장된 값은 (3) 다시 입출력 장치를 통해 출력됩니다 (4).
그림: 폰 노이만 구조
3. 중앙처리장치(CPU)
이제 CPU가 하는 일을 조금 더 들여다보겠습니다. 앞서 처리할 데이터를 저장하는 장치는 메모리라고 했는데, 사실은 CPU도 레지스터(Register)라고 불리는 몇 개의 작은 저장 장치를 가지고 있습니다. 레지스터는 CPU가 연산을 수행하기 위해 사용하는 임시 저장 장치입니다. CPU는 메모리의 특정 위치에 저장되어 있는 명령(Instruction)들을 순서대로 불러와 처리합니다. CPU가 처리하는 명령의 몇 가지 예시를 살펴봅시다.
- 두 레지스터에 저장된 값을 더해 다른 레지스터에 저장한다.
- 한 레지스터가 메모리 상의 주소를 가리키고 있을 때, 이 주소에 저장된 값을 다른 레지스터로 불러온다.
- 한 레지스터가 메모리 상의 주소를 가리키고 있을 때, 다른 레지스터에 저장된 값을 이 주소에 저장한다.
- 한 레지스터에 적힌 값이 1이라면 다음 차례에 바로 다음 명령을 실행하지 말고, 명시된 다른 명령을 실행한다.
CPU가 직접 처리하는 명령은 모두 이와 같이 단순한 형태로 나타낼 수 있습니다. CPU는 이러한 명령들을 0과 1로 이루어진 신호로 인식해 받아들입니다. 이러한 명령들의 모임을 ISA (Instruction Set Architecture)라고 합니다. 명령들은 0과 1로 이루어진 기계어이기 때문에, 이를 사람이 쉽게 읽을 수 있도록 일대일 대응시킨 프로그래밍 언어가 있습니다. 이를 어셈블리(Assembly)라고 부릅니다. 컴퓨터 구조 수업에서는 ISA와 어셈블리를 공부하며 CPU의 작동 과정을 이해하게 됩니다.
CPU의 효율성을 높이는 방법에는 어떤 것이 있을까요? 컴퓨터 구조에서는 가장 기본적이고 중요한 최적화 중 하나인 파이프라이닝(Pipelining)에 대해 배웁니다. 수업에서 사용하는 교재에서는 빨래를 하는 과정에 비유해 파이프라이닝에 대해 설명하고 있습니다. 빨래를 하기 위해서는 세탁기를 돌리고, 건조기를 돌리고, 빨래를 갠 뒤 옷장에 넣는 과정이 필요합니다. 그런데 빨래의 양이 너무 많아 세탁기를 한 번에 돌릴 수 없다고 합시다. 그렇다면 먼저 세탁기에 넣은 빨래가 모든 과정을 끝내고 옷장에 들어간 뒤 다음 빨래를 세탁기에 넣는 것보다는, 먼저 세탁기에 넣은 빨래가 세탁이 끝나고 건조기에 들어갔다면 바로 다음 빨래를 세탁기에 넣는 것이 더 효율적이겠죠. 파이프라이닝의 기본적인 아이디어는 이처럼 하나의 작업을 여러 단계로 분리한 뒤, 동시에 처리할 수 있는 일은 동시에 처리하자는 것입니다. 안타깝게도 우리의 ISA는 빨래를 하는 과정처럼 깔끔하게 분리되지 않기 때문에, 여러분은 파이프라이닝을 방해하는 많은 해저드(Hazard)와 씨름하게 될 것입니다.
4. 메모리
다음으로 메모리에 대해 살펴봅시다. 메모리가 하는 역할은 간단합니다. 메모리에는 주소(Address)가 있어, 각 주소마다 값을 저장하고 있습니다. CPU가 요청한 주소에 적힌 값을 CPU에게 알려 주거나, 반대로 CPU가 알려 준 주소에 새로운 값을 저장하는 역할을 수행합니다. 그런데 컴퓨터에서 실행하는 프로그램이 복잡해지고 많아지면 문제가 발생합니다. 여러 개의 프로그램이 동시에 실행되려면 이 프로그램들을 나타내는 명령과 프로그램이 사용하는 데이터가 모두 메모리의 서로 다른 위치에 저장되어 있어야 합니다. 그런데 이럴 경우 한 프로그램이 다른 프로그램이 사용하는 데이터를 읽거나 덮어씌워 버릴 수도 있습니다. 뿐만 아니라, 프로그래머가 프로그래밍을 할 때 다른 프로그램이 주는 영향도 고려해야 하는 번거로움이 생깁니다.
컴퓨터공학자들은 가상 메모리(Virtual Memory)라는 획기적인 아이디어를 도입해 이러한 문제를 모두 해결했습니다. 가상 메모리는 컴퓨터의 운영 체제(Operating System)의 가장 중요한 기능 중 하나입니다. 운영체제는 각 프로그램에게 가상 주소 공간(Virtual Address Space)라는 추상화된 공간을 제공합니다. 프로그램이 가상 주소 공간에 값을 읽고 쓰면, 운영체제는 가상 주소를 물리적 주소(Physical Address)로 변환합니다. 이 물리적 주소는 실제 메모리의 주소를 의미합니다. 서로 다른 프로그램에는 서로 다른 가상 주소 공간이 배정되고, 서로 다른 가상 주소 공간의 가상 주소들은 서로 다른 물리적 주소에 대응됩니다. 프로그램이 자신의 가상 주소 공간을 자유롭게 사용하더라도 다른 프로그램에 영향을 주지 않습니다. 따라서 실제로는 메모리 위에서 여러 프로그램이 동시에 실행되더라도, 각 프로그램은 혼자서 메모리를 사용하는 것처럼 보이게 됩니다.
메모리의 효율성에 대해서도 알아봅시다. 저장 장치를 물리적으로 구현하는 방법에는 여러 가지가 있습니다. 하지만 속도가 빠른 저장 장치일수록 비싸고, 크기가 크고, 또 에너지를 많이 소모합니다. 따라서 모든 저장 장치의 성능이 동시에 최대가 되도록 만들 수는 없습니다. 그래서 컴퓨터에는 성능이 높은 것부터 낮은 것까지 다양한 종류의 저장 장치가 사용되는데, 성능이 낮을수록 더 큰 용량을 가지게 됩니다. 이를 메모리 계층 구조(Memory Hierarchy)라고 합니다. 모든 정보는 CPU에서 처리되기 때문에, CPU와 가까울수록 저장 장치의 성능이 좋아지도록 설계합니다. 보통 가장 작고 빠른 저장 장치는 CPU의 레지스터이며, 메모리는 이보다 더 크고 느립니다. 하드 디스크 등 기타 저장 장치는 더욱더 용량이 크고 성능이 낮습니다.
하지만 메모리 계층 구조에서 오는 성능의 한계를 일부 극복할 수 있는 방법이 있습니다. CPU가 메모리에 저장된 데이터를 읽어올 때는 몇 가지 특징이 있습니다. 처음 보는 데이터보다는 이전에 읽어온 데이터를 다시 읽어올 가능성이 높고, 또 이미 읽어온 데이터과 근처에 있는 데이터를 읽어올 가능성이 높습니다. 이러한 메모리의 특징을 지역성(locality)라고 합니다. 지역성을 활용하면 CPU가 다음으로 읽어올 데이터를 미리 예측하고 빠른 속도로 불러올 수 있습니다. 컴퓨터에는 캐시 메모리(Cache Memory)라고 불리는 특수한 메모리가 있습니다. 메모리 계층 구조 위에서, 캐시 메모리는 메인 메모리보다 크기가 작지만 성능이 더 좋은 메모리입니다. CPU가 메인 메모리에서 데이터를 읽어 오면, 그 주변에 있는 데이터가 캐시 메모리에 임시로 저장됩니다. CPU가 다음 번에 데이터를 읽어 올 때, 만약 그 데이터가 캐시 메모리에 있다는 것이 확인되면 메인 메모리까지 갈 필요 없이 캐시 메모리에서 더 빠른 속도로 데이터를 불러올 수 있습니다. 이러한 간단한 아이디어는 어마어마한 성능 향상을 가져옵니다.
선배의 조언
전공필수 과목인 논리 설계에서 배우는 순차 논리 회로, 레지스터 등의 개념을 알고 있으면 이해하기 쉬운 내용이 많습니다. 따라서 논리 설계를 먼저 수강하기를 추천합니다. 반대로, 시스템 프로그래밍에서는 운영 체제가 컴퓨터를 어떻게 관리하는지 배우게 되는데, 여기에서 컴퓨터 구조의 내용이 기초 지식으로 활용되므로 이 과목은 나중에 듣는 것이 좋습니다. 이들 사이에 필수 선이수 관계는 없지만, 순서대로 듣는 것이 수업 내용을 잘 이해하는 데 도움이 됩니다.
컴퓨터 구조 과목에는 다소 테크니컬한 내용이 많아서 어렵고 지루하게 느껴질 수 있습니다. 이 과목에서 배우는 내용은 컴퓨터공학자들이 몇 십 년 동안 더 효율적인 컴퓨터를 만들기 위해 치열하게 고민한 결과입니다. 그래서 사소한 내용보다는 전체적인 아이디어와 중요한 키워드에 초점을 맞춰서 공부하면 더 재밌게 다가올 것이라 생각합니다. 수업을 듣고 나서 내용은 잊더라도, 수업에서 중요하게 다룬 아이디어와 키워드는 기억해 가면 좋을 것 같습니다.
컴퓨터 구조 과목에서는 리눅스 등 UNIX 기반 운영체제를 본격적으로 사용하게 될 가능성이 높습니다. 흔히 사용하는 운영체제는 아니라서 어렵게 느껴질 수도 있지만, 앞으로 컴퓨터를 계속 공부한다면 많이 쓰게 될 테니 이번 기회에 익숙해져 봅시다.
수업에서 사용하는 교재인 《Computer Organization and Design: The Hardware Software Interface》는 굉장히 두꺼운 책이라서 수업 때 모든 내용을 공부하지 않습니다. 이 수업뿐만 아니라 컴퓨터공학를 공부할 때 도움이 되는 내용들이 많으니, 교양을 쌓는다는 느낌으로 읽어보아도 좋습니다.
마무리
컴퓨터 구조에서 배우는 내용들은 컴퓨터를 공부하는 사람이라면 반드시 알아야 하는, 일종의 상식과도 같은 내용입니다. 여러분이 소프트웨어 개발자가 되어 하드웨어를 직접 다루지는 않게 되더라도, 컴퓨터가 어떻게 설계되어 있고 어떻게 동작하는지를 잘 이해하고 있어야 더 효율적인 프로그램을 만들 수 있습니다. 여러분이 컴퓨터 구조를 수강하게 된다면 앞으로 컴퓨터를 공부하는 데 있어 도움이 될 많은 아이디어와 시사점을 얻어 갔으면 좋겠습니다.
'전공백서 > 컴퓨터공학부' 카테고리의 다른 글
컴퓨터공학부: 양자 컴퓨팅 및 정보의 기초 (1) | 2023.12.22 |
---|---|
컴퓨터공학부: 딥러닝의 기초 (1) | 2023.08.28 |
컴퓨터공학부: 알고리즘 (0) | 2023.07.10 |
컴퓨터공학부: 취업이 하고 싶어요? 이 수업이면 해결완료...! (0) | 2022.12.24 |
컴퓨터공학부: 넥슨 본사에서 넥슨 게임을 켜다 (0) | 2022.08.24 |
댓글