전공 수업 소개

컴퓨터 구조,
내 컴퓨터를 속속들이 알아보자!

글. 컴퓨터공학부 3 심우진 편집. 전기정보공학부 3 김채원
"너 컴퓨터 좀 만진다며? 나 컴퓨터 견적 맞춰 주라!"
컴퓨터공학부 학생들이 농담으로 혹은 진지하게 종종 듣는 말입니다. 컴퓨터공학도를 목표로 하는 공상 독자님들도 들어 보셨을 말인지도 모르겠네요. 그런데 파이썬으로 코드를 짜거나, 웹 개발 프로젝트를 하는 것이 '컴퓨터 견적'을 검색하면 나오는, 속도가 몇 기가헤르츠니, 램이 몇 기가니 하는 알쏭달쏭한 단어들과 무슨 상관일까요? 나중에 네이버·카카오톡 같은 서비스나 ChatGPT 같은 AI를 개발하고 싶은데, 컴퓨터 칩에 코어가 몇 개인지 알아야 하는 걸까요? 오늘 소개할 전공 과목은 이 의문들을 해결해줄 수 있는, 그리고 컴퓨터공학자를 지망한다면 반드시 들어야 할 '컴퓨터 구조'입니다.
그림1 이진수로 표기해야 마음이 편한 프로그래머의 모습

내 코드는 어떻게 0과 1이 될까? - ISA

컴퓨터가 0과 1의 이진수로 정보를 저장하고 처리한다는 것은 이제 너무나 잘 알려진 사실입니다. [그림1]처럼 프로그래머가 0과 1로만 대화하는 인터넷 밈도 있죠. 하지만 고등학교 정보 과목이나 코딩 학원 수업에서 0과 1로만 무언가 해 본 독자님은 없을 것입니다. 알파벳과 기호로 C언어, 파이썬 등의 코드를 짜거나, 심지어 스크래치나 엔트리 같은 학습 툴에서는 코드도 없이 블록을 조립해 프로그래밍을 하죠. 이렇게 할 수 있는 건 인간이 알아보기 쉬운 '고급 언어'의 코드와, 이진수로 된 컴퓨터 내부 '저급 언어'를 서로 변환하는 시스템이 있기 때문입니다.1) 이를 명령어 집합체(Instruction Set Architecture), 줄여서 ISA라 부릅니다.

그림2 C언어(왼쪽)로 쓰인 코드가 중간 언어 어셈블리(중앙)을 거쳐 0과 1로 이루어진 바이너리 코드(오른쪽)로 번역되는 모습.

영어와 한국어를 서로 번역하는 상황을 생각해 봅시다. '나는 너를 본다'라는 문장을 번역하려면 영어의 문법에 맞게 '너'와 '보다'라는 단어의 순서를 서로 바꾸어야 합니다. 따라서 'I you see'가 아니라 'I see you'가 맞는 번역이겠죠. 만일 한쪽 언어에 있는 관용적 표현이 반대쪽 언어에 없다면, 같은 의미를 전달하기 위해 길게 풀어 설명해야 할지도 모릅니다. ISA의 필요성이 이런 점에서 나옵니다. 기계어의 각 명령어는 한 클럭2) 내에 하드웨어에서 실행되어야 하므로 단순합니다. 그래서 사람이 짠 코드에서는 한 줄인 내용이 컴퓨터의 기계어에서는 여러 개의 명령어로 변환될 수 있습니다. 그래서 상대적으로 추상화된 사람의 코드를, 사람이 알아볼 수는 있되 기계어로 거의 직역할 수 있는 중간 언어로 바꾸는 과정을 거칩니다. 이런 시스템을 통틀어 ISA라고 부릅니다. 컴퓨터 구조 수업에서는 직접 코드를 중간 언어 어셈블리로 변환해, 코드가 실행될 때 단계마다 어떤 일을 해야 하는지 컴퓨터처럼 생각하는 방식을 배울 수 있습니다.

분업으로 문제를 빠르게 해결하자! - 파이프라이닝

ISA가 제공하는 인터페이스를 잘 활용하여 코드를 기계어로 변환했다고 합시다. 이제 0과 1로 이루어진 기계어 명령어는 CPU(중앙처리장치)에서 클럭당 한 줄씩 실행됩니다. 한 줄의 명령어가 실행될 때 차례로 메모리에서 값 읽기, 값으로 계산하기, 메모리에 쓰기가 일어난다고 단순화해 봅시다. CPU에는 각각의 일을 담당해 처리하는 장치가 분리되어 있습니다. 그런데 CPU가 한 번에 한 명령어만 처리한다면 읽기 장치가 메모리에서 데이터를 불러올 때 계산과 쓰기 장치는 할 일이 없습니다. 계산 장치나 쓰기 장치가 일을 하고 있을 때도 마찬가지입니다. 공학자들은 이런 낭비를 줄이기 위해 파이프라이닝을 발명했습니다. CPU가 1번 명령어의 읽기 부분을 완료했다면, 읽기 장치가 쉬는 대신 2번 명령어의 읽기를 바로 시작하는 것이죠. 이렇게 CPU 하나에서 동시에 여러 명령어를 실행하여 같은 시간 안에 더 많은 일을 할 수 있습니다.

그림3 파이프라이닝으로 실행 시간이 줄어든 모습.

위 그림은 읽기, 계산, 쓰기가 각각 10초씩 걸리는 경우 파이프라이닝 적용 전후를 표현한 도표입니다. 파이프라이닝을 적용하지 않은 경우 각 명령어의 실행 결과가 30초마다 반영됩니다. 반면 파이프라이닝을 적용한 경우 첫 명령어의 실행이 끝나는 30초 시점부터 10초마다 다음 명령어의 실행이 완료됩니다. 현대 컴퓨터들이 클럭 속도를 수 기가헤르츠 단위까지 올릴 수 있는 것은 집적회로 제조 기술의 발전과 더불어 파이프라이닝 덕분입니다.

자주 쓰는 건 가까이 두자 - 메모리와 캐시

그림4 캐시와 메인 메모리 비교.

메모리는 CPU와 함께 컴퓨터의 필수 장치입니다. 프로그램에 필요한 데이터를 저장해 두었다가 CPU의 요구에 따라 넘겨주거나 고쳐 쓰죠. 앞서 파이프라이닝을 설명할 때에도 명령어마다 메모리 읽기와 쓰기가 일어나는 것으로 예시를 들었습니다. 파이프라이닝을 통해 CPU가 일하는 데 걸리는 시간을 획기적으로 줄일 수 있지만, 메모리와 CPU가 값을 주고받는 시간이 길다면 전체 시스템의 효율성을 높이기 어렵습니다. 그래서 캐시의 개념이 등장했습니다.

캐시는 메인 메모리에 저장된 데이터 중 최근에 쓰였거나 쓰일 가능성이 높은 내용을 저장해 놓는 보조 메모리입니다. 저장할 수 있는 데이터의 크기는 작지만 CPU와 데이터를 더 빨리 주고받을 수 있어 효율을 높여 줍니다.

거실의 책장에 책이 많이 꽂혀 있고, 방에서 책으로 공부하는 상황에 비유해 보겠습니다. 모든 책을 책장에 보관한다면 다른 책을 참고하고 싶을 때마다 거실을 오가야 합니다. 이때 책상에 자주 보는 책 두세 권을 꽂아 두면 방과 거실을 오가는 시간을 줄일 수 있겠죠. 대신 찾는 책이 있을 때 책상을 우선으로 확인하거나, 거실의 다른 사람이 내 책상에 있는 책을 찾으면 서로 소통하는 등 추가적으로 신경 써야 할 점들도 생길 것입니다. 컴퓨터 구조 수업에서는 이처럼 캐시를 사용하여 생기는 이점과 추가적 노력을 배웁니다.

한 가지 일에 특화된 하드웨어 - GPU와 ○PU

지금까지 컴퓨터의 필수 요소인 CPU와 메모리 및 이들의 효율적인 사용법을 알아보았는데요, 부가적인 장치들도 살펴볼까요? CPU는 컴퓨터가 해야 하는 연산을 모두 할 수 있지만, 해야 하는 일의 폭이 넓기에 구조가 복잡하고 최적화에 한계가 있습니다. 이를 보완하기 위해 한정된 일만 할 수 있지만 그 효율이 좋은 ○PU가 사용됩니다.

이들 중 흔히 볼 수 있는 것이 화면 표시에 필요한 단순 계산에 특화된 그래픽 카드, GPU입니다. 시스템을 제어하고 상황에 따라 다른 일을 하는 제어 기능은 축소하고, 단순한 연산 장치의 수를 늘려 계산 속도를 올렸죠. 최근에는 인공신경망 훈련 과정에서 빠른 행렬 연산의 필요성이 높아지며 이에 특화된 NPU가 연구되기도 하고 있습니다. 이런 특화 하드웨어의 사용이 보편화되면서 실행할 프로그램에 맞춰 하드웨어를 설계하거나, 특정 하드웨어에서 효율적으로 실행하기 위해 프로그램을 보완하는 등 상호작용이 일어나고 있습니다.

컴퓨터 구조, 왜 배워야 할까?

이번 기사에서는 컴퓨터공학부의 전공 필수 과목인 컴퓨터 구조 수업에 대해 알아보았습니다. 컴퓨터 구조 수업에서는 컴퓨터의 구성 요소를 배우고, 이들을 효율적으로 사용하는 방법을 배우고 실습합니다. 낯선 용어를 처음 배운 독자님들도, 이미 관심을 갖고 알던 사실을 다시 확인한 독자님들도 계실 것입니다.

사실 컴퓨터 하드웨어의 작동 방식을 배우는 일은 일상에서 코딩이라고 부르는 것들과 아주 가까이 있지는 않습니다. 컴퓨터 구조를 전혀 모르는 사람들도 곧잘 코드를 짜서 데이터를 분석하거나 멋진 그래픽 효과를 만들어 냅니다. 하지만 프로그램을 만들기만 하는 게 아니라 더 좋은 프로그램을 만들고 싶다면, 자신이 사용할 컴퓨터라는 도구를 잘 알아야 합니다. 컴퓨터 구조 수업의 마지막 과제도 메모리의 작동 방식을 이용하여 예시 코드와 완전히 같은 결과를 내놓되 훨씬 빠른 프로그램을 짜는 것입니다.

서울대학교에는 컴퓨터 구조와 아주 비슷한 내용을 가르치는 수업이 또 하나 있는데요, 바로 전기정보공학부의 컴퓨터 조직론입니다. 두 학과 모두 컴퓨터를 연구 대상으로 다루지만 컴퓨터공학부에서 중요하게 여기는 것은 주어진 하드웨어를 가장 잘 활용하는 소프트웨어의 제작이고, 전기정보공학부는 더 빠르고 효율적인 하드웨어를 어떻게 만들지에 더 관심이 많습니다. 그래서 컴퓨터 조직론 수업은 파이프라이닝과 같은 방법론을 하드웨어를 어떻게 구현할지에, 컴퓨터 구조 수업은 그렇게 구현된 하드웨어를 프로그램이 활용하는 것에 비중을 둡니다. 컴퓨터를 전공하고 싶은데 연관 있는 두 학과 사이에서 고민하는 독자님이라면 참고하시면 좋겠습니다.

컴퓨터 구조에서 배운 지식은 '컴퓨터가 이렇게 생겼는데 어떻게 써먹지?'라는 생각의 씨앗을 심고, 시스템 프로그래밍이나 운영체제 같은 이후 전공 과목에서 그 씨를 꽃피웁니다. 컴퓨터를 속속들이 알아보고 그 활용 방법을 고민하는 수업, 컴퓨터 구조였습니다!

주석
  • 1) '고급(High-level)'과 '저급(Low-level)'이라는 단어는 인간 언어와의 유사성을 표현하기 위해 사용하는 용어이며, 우열의 의미를 갖지 않는다.

  • 2) CPU에서 한 명령어가 실행되는 시간 단위. CPU 클럭 속도가 2.9GHz라면, 1초에 29억 개의 명령어를 실행한다.

참고 문헌
  • Computer systems: a programmer's perspective / Randal E. Bryant, Carnegie Mellon University, David R. O'Hallaron, Carnegie Mellon. University.-Bryant, Randal E.-Boston : Pearson-2016-ISSN/DOI/ISBN://9780134092669-

공대상상 이벤트 참여하기