1편 – 마이크로프로세서
이번 편에서는 컴퓨터의 중심인 중앙처리장지, CPU(Central Processing Unit)에서 ‘연산’을 맞고 있는 core에 대해 알아보려고 해.
CPU자체가 processing unit인데 왜 연산 core를 따로 다뤄야 하냐고?
<메인보드-CPU칩-CPU layout>
초기 CPU는 진짜 processing만 수행하는 연산장치였어. 하지만 컴퓨터의 속도가 점점 빨라짐에 CPU와 밀접하게 연산하는 주변 장치들이 CPU 안으로 들어오기 시작해, 이것을 system on chip(SOC)이라고 부르지, 예를 들어 요즘 인텔 CPU들 보면 안에 내장 그래픽카드가 다 있잖아? 이것 말고도 뭐 여러 가지 주변 장치들이 되게 많기 때문에, 이번 편에서는 CPU 자체만의 연산을 담당하는 core가 어떤 개념으로 동작하는지 볼 거야.
0.논리 블록
본격적으로 마이크로프로세서를 알아보기 전에 논리 블록을 잠깐 알아야 해, 논리 블록이 뭐냐면 전편에서 논리회로에 대해 배웠고 간단한 덧셈기를 소개했었지? 하지만 모든 연산기를 게이트 단위로 표현하면 설계도가 너무 복잡해지기 때문에 기존의 논리 회로도를 그냥 흰 네모칸으로 압축해버려, 연산기의 기능은 이름을 통해서 알려주고… 이 네모 칸들을 논리 블록이라고 부르고 이 블록들로 시스템을 설계하는 도면을 논리 블록도(logic block diagram)라고 불러 ㅎㅎ
<8-bit full adder 논리회로 -> 논리블록>
이로써 지금까지 반도체 레이아웃->트랜지스터 단위 회로도->논리 회로도->논리 블록도 이렇게 도식의 기본 요소들의 추상도를 높여 왔지? 이 것을 abstraction level(추상레벨?)이라고 하는데, 반도체, 회로 하는 사람들은 high level, low level이라는 말을 쓰는데, 이게 잘할수록 레벨업 이런 느낌이 아니고, 전공으로 하는 분야의 범위가 abstraction level에서 어디쯤 위치하는 지를 뜻해. 로우 레벨을 다룰수록 회로, 더 나아가 소자 쪽을 다루는 사람들이고 하이 레벨일수록 시스템 설계나 펌웨어 등을 설계하는 사람들을 뜻해
1.마이크로프로세서란?
자 서론이 길었는데 이제 본격적으로 마이크로프로세서가 무엇인지 알아볼게.
마이크로프로세서는 단순히 입력을 통해 연산하는 연산기를 뛰어넘어, 정해진 입력 패턴(명령어)에 따라 기본적인 동작들을 여러 가지 수행하는 할 수 있는 연산장치들을 뜻해. 이 기본적인 동작들은 크게 연산하는 동작과, 데이터를 저장/불러오는 동작으로 나뉘는 데 이 동작들을 응용해서 광범위한 기능들을 수행할 수 있지.
무슨 말인지 잘 이해가 안 되지?
예를 들어 설명해줄게, A와 B라는 학생이 각각 평균값을 구하는 연산기를 만들었어.
A는 1,2,3,4,5 라고만 넣어주면 바로 ‘평균값 3’이 딱 뜨는 평균값 계산기를 만들어 왔고,
B는 +,/ 라는 버튼이 있어서 1+2+3+4+5, /5를 눌러야 평균값 3이 뜨는 계산기를 만들어왔어.
그렇다면 A와 B가 만든 계산기는 어떤 특징들을 가지고 있을까?
먼저 A의 계산기는 숫자만 넣으면 바로 평균값이 나오니깐, 훨씬 다루기 쉽고, 빠르게 나오겠지?
하지만 B의 계산기는 조금 오래 걸리기는 하겠지만, +와 /를 이용해서 평균값뿐만 아니라 전체 합, 일반 나눗셈 등을 수행할 수 있지?
A는 B보다 성능면에서 더 우월하지만
B는 A보다 더 범용적인 연산기를 만든 거지.
위에서 설명한 논리연산기와 마이크로프로세서의 차이점이 이렇다고 생각하면 돼.
이 글에서는 B연산기의 +,/ 같은 마이크로프로세서의 기본 동작들을 뜻하는 ‘명령어’를 먼저 알아보고, 이 마이크로 프로세서의 내부구조, 연산방식을 다뤄 볼 거야.
2. 명령어(instruction)
명령어는 마이크로프로세서(이하 프로세서)가 동작하는 가장 작은 단위야. 이 명령어는 이진수라서 인간이 보기는 힘들기 때문에 인간이 보기 쉽도록 번역한 거를 어셈블리어라고 해. 우리가 흔히 코딩하고 이 코딩을 컴퓨터에서 돌리기 위해서 ‘컴파일’한다고 하는데, C언어 같은 프로그래밍 언어는 인간들이 프로그램을 쉽게 짜기 위한 언어이고, 컴파일은 이 언어를 컴퓨터가 알아듣는 어셈블리어(명령어)로 바꿔주는 작업이지.
예를 들어 볼게
C = A + B;
라는 코드를 컴퓨터에서 돌리려고 해. A,B,C는 각각 메모리 주소 0, 4, 8번지에 저장돼있다고 가정 해보자(이 것도 나중에 다룰 것임)
이 코드를 컴파일하면 아래와 같은 어셈블리어가 나와
1) Load R1 0x0000 – 0번지의 데이터를 R1으로 불러온다
2) Load R2 0x0004 – 4 번지의 데이터를 R2로 불러온다
3) ADD R3 R1 R2 – R1과 R2를 더한 후 R3으로 저장한다
4) Store R3 0x0008 – R3의 데이터를 8번지에 저장한다
(보기 좋게 써져 있지만 사실 명령어는 001000101010101010101… 이렇게 생김, R1,2,3는 프로세서가 연산할 때 임시로 쓰는 저장소인데 다음 챕터를 참고)
그럼 프로세서는 이 명령어들을 수행하면서 C = A + B라는 코드를 수행하는 거야.
마이크로프로세서는 크게 세가지 종류의 동작을 해, 명령어들의 종류가 세가지라고 보면 돼
1. 어떤 데이터들을 연산한다(사칙연산 같은 거)
2. 특정 주소에 데이터들을 저장하거나 불러온다
3. 프로그램 명령어들을 불러온다.
위 보드는 1번과 2번 종류의 명령어들이 쓰였어.
프로세서라는 것은 결국 데이터를 저장하고, 연산하는 게 전부이기 때문에 이 세가지만 동작할 수 있으면 프로그램이 돌아갈 수 있어.
예를 들어 계산기를 켜서 돌린다고 해봐
1) 계산기 프로그램 명령어들을 불러온다(3)
2) 키보드의 주소로 접근하여 입력된 데이터를 불러온다(2)
3) 데이터를 연산한다(1)
4) 연산 결과 데이터를 저장한다(2)
이런 식으로 움직이는 거지(실제론 훨씬 복잡하고 많은 명령어들이 수행돼, 하지만 프로세서는 한 명령어 수행하는데 보통 1나노초 이하로 걸리기 때문에 우리는 순식간에 수행된다고 느끼는 거지)
3. 내부구조
자 그럼 프로세서가 어떤 식으로 명령어를 수행해서 연산하는 지 한번 보여줄게,
앞으로 보여줄 블록도는 아주 단순한 프로세서의 내부 블록도라고 할 수 잇고, 아마 대학교에서 컴퓨터 구조를 배우는 학생들을 다 한번씩 보았을 블록도 일거야. 물론 현대 프로세서는 훨씬 복잡하고 크지만, 결국 뼈대는 비슷해 이 도식만 이해해도 CPU의 동작 원리의 기본은 다 이해했다고 보면 돼!
밑에 그림을 보면 생각보다 그림이 되게 단순하지? 프로그램을 막 수행하고 하려면 되게 복잡해야 될 것 같은데? 물론 밑에 그림이 디테일을 빼고 중요 부분만 표현한 거긴 하지만, 다른 말로 말하면 저게 가장 뼈대야 ㅎㅎ 밑에 있는 프로세서로도 사칙연산 하는 계산기 같은 거는 코드로 짜서 돌릴 수도 있는 프로세서지. 그럼 살펴보도록 하자!
<프로세서 동작 구조(5-stage pipeline)>
여기 그림을 보면 회색 막대로 크게 5개의 구역으로 나누어져 있는 것으로 볼 수 있지? 이 5개의 stage를 지나면서 연산을 완료해.
그리고 각 구역마다 큰 블록이 하나씩 있어
1: Instruction memory, 2: Register, 3: ALU, 4: Data memory, 5: Register(잘보면 선이 2stage에 있는 Register에 연결돼있음)
레지스터: 데이터를 임시적으로 저장하는 곳이다. 메모리에서 데이터를 가지고 오는데 오래 걸리기 때문에 CPU는 데이터를 임시로 저장할 곳을 가지고 있어. 이 레지스터는 한 클럭(프로세서가 움직이는 시간 단위) 안에 데이터를 꺼낼 수 있지. 그래서 프로세서는 메모리에서 데이터를 불러와서 레지스터에 저장해 놓고, 연산할 때에는 레지스터에서 데이터를 꺼내서 연산해. 레지스터는 프로세서들마다 다 다르지만 보통 3~40개 정도 가지고 있어
ALU(Arithmetic logic unit): 산술 연산과 논리 연산을 수행하는 연산기야. 이 예제 프로세서는 하나만 가지고 있지만 현대 프로세서는 정수연산기, 소수점연산기들을 여러 개씩 가지고 있어.
메모리: 데이터와 명령어들을 저장하고 있는 곳이야. 모든 데이터들은 메모리에 저장되어 있고 프로세서가 데이터를 얻기 위해서는 반드시 메모리에 접근해야 하지. 하지만 메모리에 접근해서 데이터를 가지고 오는 데에는 시간이 오래 걸려.
데이터: 프로세서가 다루게 되는 정보들을 얘기해, 이 정보는 크게 명령어(instruction)와 데이터(data)로 나뉘지, 프로세서는 자기가 무슨 연산을 해야 할지(instruction)와 연산을 할 것(data)들을 모두 memory에서 가지고 와. 하지만 이 둘을 가리키고 있는 주소가 각각 다르기 때문에 이 둘이 꼬일 일은 없어 ㅎㅎ
이 사진을 예로 들어볼게, ALU는 꼬마의 머리가 되고, 레지스터는 앞에 잇는 책상, 메모리는 뒤에 있는 책장, 데이터들은 책들이 되는 거야. 책들은 어떤 정보가 적혀있거나(data), 또는 행동 명령(instruction)이 들어 있다고 볼 수 있지.
행동 명령이 적혀 있는 책에는
1) 책상에 있는 책들을 가지고 (머리로) 계산을 해서 결과를 책상 위에 둬라
2) 책장의 xx번 주소에서 책을 가지고 와서 책상 위에 놔라, 또는 책상의 책을 다시 xx번 책장에 넣어라
3) 다른 행동 명령이 적혀 있는 책을 가지고 온 뒤 읽어라
이 세가지가 적혀 있는 거지. 1.명령어 챕터의 명령어의 세가지 종류를 다시 설명한 거니 이해하는데 도움되었기를 바라 ㅠ. 어쨋든 이렇게 되면 이 꼬마는 도서관 안의 모든 책들을 가지고 놀 수 있는 거지.
4. 연산방식
<프로세서 동작 구조>
위에서 프로세서는 5개의 stage를 통해서 연산한다고 했지? 그럼 이번 챕터에서는 이 스테이지들이 어떻게 동작해서 3가지 명령어들을 수행하는지 간단히 설명할까 하는데 먼저 예를 하나 들어서 보여줄게.
<데이터를 메모리에 저장하는 연산(꼬마가 책상의 책을 책장에 넣는 동작)>
1 stage: 메모리에서 명령어를 불러와, 명령어에는 ‘메모리 저장’이라는 명령 종류랑 저장할 데이터가 담긴 레지스터 번호, 데이터를 저장할 메모리 주소가 담긴 레지스터 번호, 세부 주소가 담겨 있음
2 stage: 레지스터에 접근해서 저장할 데이터와 메모리 주소(주소도 하나의 데이터임)를 불러와
3 stage: ALU에서 2stage에서 가져온 주소와 명령어에 담겨있던 세부 주소를 더함.
4 stage: 메모리에 데이터를 저장(동작 끝)
5 stage: 레지스터에 뭐 저장할 꺼 없으니 아무 것도 안함
이렇게 동작해. 대충 감이 오나….? 이 내용은 대학교 컴퓨터 구조 수업해서도 거의 1~2주에 걸쳐서 수업하는 내용이니만큼 조금 복잡할 수 있어.
밑에 표에 3가지 명령어 종류에서 각 stage에서 어떻게 동작하는지 적어놨어, 이걸 다 이해했다? 그럼 뭐 프로세서 동작원리는 다 알고 있다고 봐도 돼!
<명령어 종류별 stage 동작>
물론 현대 프로세서에는 위 그림보다 훨씬 복잡하게 생겼어. 몇 가지 모듈이 더 들어있거나, ALU 연산기가 훨씬 많이 들어가 있거나 하지, 그리고 stage수도 훨씬 많아. 하지만 위 표의 5개의 stage가 프로세서 동작의 뼈대이니만큼 저 stage만큼은 꼭 들어가. 단지 성능을 높이기 위해 추가 동작을 하거나, 기존 stage를 몇 단계로 나누는 정도이지.
<Intel skylake architecture>
이거는 실체 intel skylake 세대의 내부 프로세서 구조인데, 우리가 다루었던 기본 구조들이 모두 들어 있는 것을 확인할 수 있지? 다른 블록들은 성능을 높이기 위한 기술들을 위한 블록들이고 기본동작은 모두 더 4개의 블록을 통해서 수행돼.
자 이렇게 CPU의 core, 마이크로프로세서라는 존재를 살펴봤어. 사실 CPU뿐만 아니라 GPU, 휴대폰의 AP 등 우리가 알고 있는 스마트 전자 기기들의 중심칩의 코어는 전부! 저 구조가 적용돼 있다고 봐도 무방해.
이번 챕터는 솔직히 난이도가 좀 있는 편이야. 실제로 컴퓨터 공학과나 전기전자 공학과들이 2~3년에 배우게 되는 컴퓨터구조라는 수업 분량의 절반 정도에 해당해. 물론 훨씬 디테일하고 추가적인 내용도 많지. 난 진자 핵심만 보여주려고 했는데 쓰고보니 내용이 좀 어렵네 ㅠ
0개의 댓글