본문 바로가기
전공백서/전기정보공학부

전기정보공학부: 컴퓨터조직론

by STEMSNU 2023. 8. 29.

 

1. 과목에서 배울 수 있는 내용

0) 과목의 전반적인 개요

컴퓨터조직론은 컴퓨터 하드웨어가 구조적/내부적으로 작동하는 기본적 원리와 이론을 배우는 과목입니다. 몇 가지 topic에 대해서는 논문을 읽어보게 되며, Verilog 언어를 활용한 랩 과제를 통해 배운 지식을 직접 구현하여 시뮬레이션해보게 됩니다. 다루는 내용의 주요 목차는 다음과 같습니다.

  • ISA(Instruction Set Architecture)
  • Performance Metric
  • CPU
    • Single-cycle CPU
    • Multi-cycle CPU
    • Pipelined CPU & hazard, exception
    • Modern CPU(Superscalar, OoO, multithreading, multi-core)
  • Memory
    • Cache
    • Virtual Memory
  • Cache coherency, Synchronization
  • Memory Devices(SRAM, DRAM, Flash, HDD)

랩 과제에서 구현하는 것은(분반별로, 년도별로 차이가 있을 수 있습니다) 다음과 같습니다. Pipelined CPU와 Cache의 구현 난이도가 높은 편입니다.

  • ALU
  • RF(Register File), simple FSM
  • less-simple FSM(vending machine)
  • Single-cycle CPU
  • Multi-cycle CPU
  • Pipelined CPU
  • Cache (adding cache to Pipelined CPU)
  • DMA (adding DMA controller to Pipelined CPU + Cache)

1) ISA

수업에서는 우선, ‘컴퓨터 아키텍처’가 어떤 분야인지에 대해 먼저 배우게 됩니다. Programmer가 접하게 되는 컴퓨터 시스템은 아래 그림 1과 같은 abstraction을 이루며 구성되어있다고 볼 수 있습니다. 컴퓨터 내부에서 실제로 일어나는 일은 모듈 간 신호의 전달, 더 본질적으로는 전자의 이동이지만, programmer가 코딩을 하는 데 있어서 이런 것들을 고려할 필요는 없죠. 컴퓨터 아키텍처는 사용자를 돕는 OS, 그리고 각 module에 대한 설계를 고민하는 Digital design 사이 단계의 abstraction을 제공하는 분야로, 쉽게 말해 programmer에게 ‘프로그래밍에서 사용할 수 있는 memory는 연속적인 주소를 갖는 공간이고, CPU에서 바로 접근하여 사용 가능한 정보를 임시적으로 담아둘 수 있는 register라는 저장공간이 몇 개 있고, 실행할 명령어가 저장되어있는 memory 주소를 담고 있는 특별한 register인 PC가 존재해’라고 말할 수 있는 바탕을 제공해주는 분야입니다.

그림 1. Computer System Abstractions. 출처: 강의자료

이때 ISA는 Instruction Set Architecture의 약자로, Programmer Visible State, 사용 가능한 instruction의 종류 (assmebly와 대응되는 이진수) 등, programmer가 보고 사용할 수 있는 abstraction인 ‘컴퓨터의 매뉴얼’입니다. 대표적인 ISA의 예시로는 많은 분들이 사용하고 계실 x86이 있으며, 컴퓨터조직론 수업에서는 x86에 비해 단순한 MIPS, 혹은 RISC-V ISA를 토대로 공부하게 됩니다. (어떤 ISA를 기반으로 공부하는지는 분반마다 다르지만, 제가 수강한 분반에서는 MIPS를 사용하였기에, 이하의 설명은 대부분 MIPS 기준으로 작성되었습니다.)

2) CPU

CPU는 Central Processing Unit, 즉 중앙처리장치로, 컴퓨터가 실행해야 하는 작업을 수행하는 역할을 하는 unit입니다. CPU에서 처리할 수 있는 instruction은(assembly와 대응되는 이진수 기계어), 수업 내용 기준 크게 다섯 단계에 걸쳐 처리됩니다. 이 다섯 단계는 IF(Instruction Fetch), ID(Instruction Decode), EX(Execution), MEM(Memory), WB(Writeback)입니다. 이름으로부터 대략 알 수 있듯, IF 단계에서는 실행할 instruction을 memory로부터 읽어오게 되고, ID 단계에서는 이 instruction이 어떤 종류의 operation을 요구하는지 파악하고, register에 접근하여 필요한 값을 꺼내옵니다. EX 단계에서는 ALU(Arithmetic Logic Unit, 논리설계 및 실험 과목에서 배웁니다)를 이용하여 덧셈 등의 연산이 실제로 실행되고, MEM 단계에서는 필요에 따라, memory에 접근하여 값을 읽거나 씁니다. 마지막 WB 단계에서는 계산한 값, 혹은 memory에서 읽어온 값을 register에 다시 적어주게 됩니다. 이러한 흐름은, 다음과 같은 CPU datapath(single-cycle CPU의 예시)에서 이루어집니다.

그림 2. Datapath of single-cycle CPU. 출처: 교과서 “Computer Organization and Design : The Hardware / Software Interface” (6/E) 그림을 일부 수정

위 그림의 single-cycle CPU는 한 cycle에 하나의 instruction을 처리하는 CPU입니다. 여기서 성능을 높이기 위해 하나의 instruction을 여러 cycle에 나누어 처리하는 것이 multi-cycle CPU, 더 성능을 높이기 위해 pipelining 방식을 적용한 CPU는 pipelined CPU입니다. 최근 사용되는 CPU들은 기본적으로 pipelined CPU를 기반으로 하며, 성능을 높이기 위해 SuperScalar, OoO(Out-of-Order), multithreading 등의 기법을 사용하게 됩니다. 각 CPU에 대한 구체적인 작동 방식과 장단점은 수강을 통해, 혹은 교과서 읽기를 통해 알아가시면 좋을 것 같습니다.

3) Memory

Programmer가 원하는, ‘이상적인’ memory는 어떠한 성질을 가질까요? 실행하고자 하는 프로그램마다 연속적인 주소의 큰 memory를 독립적으로 관리하고, 빠르게 접근할 수 있으면 좋겠죠. 이러한 성질들을 최대한 보장하기 위해, memory system은 크게 두 가지 방법을 사용합니다. ‘Memory hierarchy’를 통해 크고 빠른 접근이 가능한 memory를 제공하며, ‘virtual memory’를 활용하여 연속적이고 독립적인 memory를 제공합니다.

‘Memory hierarchy’는, memory system이 다음 그림과 같은 계층 구조로 구성되는 것을 말합니다. 피라미드의 위쪽으로 갈수록 CPU에서 빠르게 접근 가능한 작은 메모리이며, 아래쪽으로 갈수록 접근이 오래 걸리는 큰 메모리입니다. Hierarchy로 인해 크고 빠른 메모리가 보장되는 이유는 ‘locality’, ‘최근에 접근한 memory의 부근에 빠른 시간 내에 다시 접근하게 될 것이다’라는 성질 때문입니다. 비유하자면, 책상 정리를 할 때, 자주 사용하는 필기구는 책상 위에 두고, 다음으로 자주 사용하는 각종 물품은 서랍에, 어쩌다 한 번씩 보는 참고서적은 조금 멀리 떨어진 책꽂이에 두는 것인데요, 평소에는 책상 위의 물품을 위주로 사용하고, 간혹 보는 참고서적이 필요할 때만 책꽂이까지 접근하면 전반적인 접근이 빨라질 수 있다는 원리입니다.

그림 3. Memory hierarchy. 출처: “Computer Systems: A Programmer’s Perspective” 3E.

‘Virtual Memory(VM)’는 그대로 번역하면 ‘가상 메모리’인데요, programmer에게는 가상 메모리를 활용하여 프로그램마다 연속적이고 독립적인 memory space가 할당된 것처럼 보여주지만, 실제로 정보가 저장되는 공간인 ‘physical memory’는 연속적이지 않은 테크닉입니다. virtual memory와 physical memory 사이의 mapping 또한 memory 공간 어딘가에 저장되어있으며, 이것을 관리하는 것은 운영 체제(OS)의 역할입니다. 큰 크기의 mapping table을 관리하고, 빠르게 접근하기 위한 방법, 그리고 가상의 주소 사용에 의한 몇 가지 issue들도 있으니, 궁금하시다면 컴퓨터조직론을 수강하여 알아가시면 좋겠습니다.

4) Other Topics

Virtual Memory 이후의 내용은 교과서에서 다루지 않거나 가볍게만 다루며, 운영체제(OS) 수업의 내용과 겹치는 부분도 존재하고, 분반에 따라 다루지 않는 경우도 있기에, 아주 간략하게만 소개드립니다. Cache coherency는 multi-core system에서, 서로 다른 process가 하나의 physical address space를 가지고 있다는 상황에서 신경 써야 하는 부분입니다. Address space가 공유되므로, process 1에서 특정 주소에 쓰인 값을 바꾸었을 때, process 2가 이 주소에 대한 접근을 시도한다면, process 1에 의해 바뀐 값이 보여야 하는 것이지요. 그러나 process 1에서 memory에 write를 진행할 때, core마다 관리하는 private cache에만 값을 쓴다면, 이 값이 shared memory로 반영될 때까지 process 2는 바뀐 값을 볼 수 없습니다. 수업에서는 이러한 문제점을 제시하고, 이를 해결하기 위한 protocol 몇 가지를 배웁니다. Synchronization topic에서는 multithreading을 진행할 때 신경써주어야 하는 점들, 발생할 수 있는 문제와 그에 대한 해결책을 다루는데, 운영체제 수업에서 배우는 내용과 겹치는 것으로 알고 있습니다. 수업의 후반부에서 다루는 Memory device들인 SRAM, DRAM, Flash, HDD에 대해서는, 각각이 어떤 원리로 정보를 읽고 쓰는지 배우고, 각 device의 장단점을 고려했을 때 memory hierarchy의 어느 부분에 사용되고 있는지에 대해 배웁니다.

2. 선배의 조언

컴퓨터조직론을 듣기 전에, 전기정보공학부의 전공필수 과목인 ‘논리설계 및 실험’ 과목을 먼저 듣는 것을 추천합니다. 직접적으로 내용이 이어지는 것은 아니지만, 논리설계 및 실험 과목에서 배우는 논리연산이나 FSM, ALU 등 digital system의 기초, 그리고 프로젝트에서 사용되는 Verilog 언어는 컴퓨터조직론을 잘 이해하는 데 도움을 줄 것입니다. 또한, 개강 전 Verilog에 조금 더 익숙해지기 위해 HDLBits라는 사이트(https://hdlbits.01xz.net/wiki/Main_Page)에 나와 있는 연습문제들을 쭉 풀어보는 것을 강력히 추천합니다. 랩 과제를 수행하는 데 있어서의 걸림돌이 Verilog 자체가 되는 것을 방지해줄 것입니다.

수강 중 공부법은, 공과대학 전공과목에서 조금 낯선 조언일 수 있겠지만 모든 내용을 적고, 기억하고, 암기하려고 노력하는 것입니다. 물론, 이해 없는 암기를 하라는 뜻은 아닙니다! 하지만 암기 없는 이해만으로 교과서를 읽어보시거나 수업을 듣다 보면 모든 것을 이해했다는 착각이 들 수 있고, 시간이 지나 다시 들추어보면 전부 기억이 나지 않는 상황이 발생할 수 있습니다. 중고등학교에서 한 번도 다루지 않는 분야를 처음 배우는 수업이며, 방대한 분야에 대한 기초 과목인 만큼 본 수업에서 다루는 용어나 기본적인 구조 등은 전부 기억하는 것이 필요하다고 생각합니다. 저희가 두 자릿수 곱셈을 하기 위해 구구단을 언제나 쓸 수 있는 상태로 외우는 것처럼 말이죠 :) 추가적으로, 교과서 내용을 미리 읽고 수업을 들으면 교수님 설명이 조금 빠르더라도 상대적으로 따라가기 수월해질 수 있습니다.

Verilog 랩 과제의 경우, 기본적으로 구현해야 하는 module에 대한 이해를 먼저 해야 하고, 설계를 완전히 끝낸 뒤 코딩을 하시는 것을 강력히 추천합니다. 여기서 설계는 구체적일수록 좋습니다. Verilog 언어는 회로를 구현하는 언어로, 회로 상에서 도선을 잇는 등의 HW적인 요소를 그대로 언어로 옮겨온 방식입니다. 어떤 회로를 만들지에 대한 도면을 미리 그려두고 시작한다면, 그림을 코드로 옮겨주는 과정을 수행하기만 하면 되기에, 상대적으로 수월하게 끝내실 수 있습니다. 제가 그린 Multicycle CPU의 설계를 예시로 첨부합니다. Pipelined CPU의 경우 더 복잡하지만, 교재 및 강의자료의 그림을 참고하여 조금씩 구상하다 보면 충분히 그리실 수 있을 것입니다.

 그림 4. Design of Multi-cycle CPU. 출처: 직접 그림

3. 진로 선택에 도움되는 점

컴퓨터 아키텍처 분야에 관심이 있으신 분들께는 사실상 전공필수인 과목입니다. 컴퓨터조직론을 듣기 전에 아키텍처에 대한 지식이 없는 경우에도, 선택폭이 넓은 전기정보공학부의 특성상, 거부감이 있지 않으신 이상 들어보시면서 자신의 흥미 여부를 파악해보는 것을 추천합니다.

전기정보공학부에서 컴퓨터 아키텍처 분야를 연구하시는 교수님으로는 컴퓨터조직론 수업을 최근 몇 년간 진행해오신 김장우 교수님, 심재웅 교수님, 그리고 AI와 컴퓨터 아키텍처를 함께 연구하시는 이진호 교수님을 제가 알고 있습니다. 그 외에도, 시스템/하드웨어 분야를 연구하시는 교수님은 더 많으시고, 컴퓨터공학부에도 컴퓨터 아키텍처 분야를 연구하시는 교수님이 계신 것으로 알고 있어서, 관심을 갖게 되셨다면 더 찾아보시는 것을 추천합니다.

4. 맺음말

제가 이때까지 들은 전기정보공학부 전공 중 가장 많은 것을 배울 수 있었던 과목이라고 생각합니다. 컴퓨터 아키텍처에 입문해보고 싶으신 분들께 강력 추천합니다.

 

댓글