새소식

반응형
CS 지식

[CS 지식] 컴퓨터 공학 필수 지식 A부터 Z까지

2023.04.14
  • -
반응형

우리가 일반적으로 컴퓨터 공학 전공 필수 지식이라고 하면 프로그래밍 언어, 네트워크, 운영체제, 데이터베이스, .... 등등의 지식을 말하곤 하는데요. 각각의 과목들 모두 다 중요한 것들이지만 이번 포스팅에서는 컴퓨터의 여러 부품들 중 CPU가 어떻게 동작하는지를 알아보면서 컴퓨터 공학(Computer Science) 필수 지식까지 자연스럽게 이해해보는 시간을 가져보도록 하겠습니다.

 

이에 대해 자세히 알아가다 보면 위 과목들에 기본 지식이 되어 해당 지식을 습득할 때 더 잘 이해가 갈 수 있을 것이라 생각합니다.

 

컴퓨터는 low-level(기계수준)부터 high-level(인간수준)까지 인간의 관점에서 인간이 통제하는지 하지 않는지에 따라 광범위하게 이루어져 있는 기기입니다.

 

먼저 우리는 컴퓨터 부품 중 하나인 CPU가 도대체 어떤 원리로 동작하는지 알아보면서 hardware 관점인 low-level에서의 관점으로 먼저 이해해 보도록 하겠습니다.

 

※ low-level에는 어쩔 수 없이 전자회로 및 디지털 논리 등 하드웨어(hardware)와 관련된 이야기가 많이 나오니 이 점에 유의해 주시면 좋을 것 같습니다.

 

1. [전자회로] 트랜지스터

자 그럼 CPU는 무엇으로 구성되어 있을까요?

 

왼쪽: 트랜지스터 소자 / 오른쪽: 트랜지스터 구조

 

CPU는 '트랜지스터(Transistor)'라는 반도체로 만들어졌습니다. 여러분들께서는 흔히 반도체와 관련된 소자하면 저항과 트랜지스터를 떠올리곤 하는데요. 이 트랜지스터가 어떻게 작동하는지에 대해 먼저 알아보도록 하겠습니다.

 

왼쪽: 실리콘으로 이루어진 wafer / 오른쪽: 실리콘의 공유결합

주로 반도체는 실리콘(Silicon; 원자번호 14번)으로 만들어지는데요. 실리콘은 최외각 전자가 4개로 다른 실리콘 원자들과 전자를 공유하며 단단하게 결합하고 있습니다. 원자는 최외곽 전자가 8개일 때 가장 안정한 구조를 이루는데 위의 오른쪽 그림과 같이 단단하게 결합하여 최외곽 전자가 8개가 됐을 때, 전자는 꽉 묶여서 이동하지 못하기 때문에 전류가 흐르지 않게 됩니다. (전류 = 전자의 흐름)

 

 

실리콘에 다른 원소를 첨가한 경우

그렇기 때문에 순수한 실리콘은 원래 전류가 통하기 어려운데 실리콘보다 전자가 1개 더 많거나 1개 더 적은 원소를 첨가하여 전류를 통하게 만들어 줄 수 있습니다.

 

전자가 상대적으로 하나 부족한 원소를 넣으면 해당 구조에는 왼쪽 그림과 같이 빈 구멍이 생깁니다. 이 구멍을 채우기 위해 근처의 전자가 이동하게 되는데 상대적으로 구멍은 그 전자가 원래 있던 곳으로 이동하는 것처럼 보입니다. 이 때 전자가 만약 왼쪽에서 오른쪽으로 이동했다면 전류는 그 반대인 오른쪽에서 왼쪽 방향으로 흐르게 됩니다. (전류가 흐르는 방향 = 정공의 이동 방향 = 전자의 이동 방향의 반대)

 

그래서 이 구멍이 이동하는 방향이 전류가 흐르는 방향이고 또한 마치 양전하를 가진 입자처럼 행동하는데 양전하를 띤 구멍이라는 의미로 양공이라고 부릅니다.(정공이라고도 함)

 

반면, 실리콘의 전자가 상대적으로 1개 많은 원소를 첨가하면 위의 오른쪽 그림과 같이 남는 전자가 자유롭게 이동하면서 전류를 띠게 해 줍니다. 전자가 1개 적은 원소를 첨가한 반도체는 'positive'의 p를 따서 p형 반도체라고 부르고 전자가 1개 많은 원소를 첨가한 반도체는 'negative'의 n을 따서 n형 반도체라고 합니다. (전자는 -극을 띄기 때문에 전자 자체가 많을 수록 more negative인 것입니다.)

 

이 p형반도체와 n형 반도체를 서로 붙여보게 되면 재밌는 일이 벌어지는데요. p형 반도체는 앞서 봤듯 양전하를 띤 양공이 있고, n형 반도체에는 자유전자가 있는데, 이 두 반도체가 연결된 경계면을 보면 n형 반도체의 전자들이 극성에 따라 양공에 이끌려 결합하게 됩니다.

이를통해 중성상태에 있던 원자가 전자 하나를 받게 되면 음전하를 띠게 됩니다. 반대로 중성 상태에 있던 원자가 전자를 하나 뺏기게 되면 양전하를 띠게 되겠죠. (이렇게 중성상태였으나 전자를 얻거나 뻇긴 원자는 이온이라고 부릅니다.)

 

그렇게 되면 p형 반도체의 경계면 근처에서는 (전자로 인해) 증가한 음전하를 띠게 된 원자(음이온)들의 반발력으로 더 이상 p형 반도체쪽으로 전자들이 넘어가지 못하게 되고, 반대쪽 n형 반도체에서는 양전하를 띤 원자들(양이온)의 영향으로 해당 방향으로 양공이 이동하지 못하게 됩니다.

일정 시간이 지나면 더 이상 이동 가능한 전하들이 없어지게 되는데 이렇듯 전하를 띤 원자들이 만든 서로 지나가지 못하는 영역을 공핍영역(depletion region)이라고 합니다.

 

PN접합의 공핍영역

공핍영역 가장자리에는 서로다른 전하를 가진 면이 생기게 되고 + 에서 -쪽으로 전기장(electric field)이 생성됩니다.

 

Reverse Bias

만약 바로 위의 그림과 같이 전압을 가해주면 P형 반도체 쪽에 연결된 부분이 음극이 되는데 그렇게 되면 양전하를 띤 양공들이 -극인 연결면 부분으로 이끌려오게 되고 반대편의 전자들 역시 +극인 연결면 쪽으로 움직이게 되겠죠. 이렇게 되면 공핍영역이 더욱 확대가 되고 더 이상 전하의 이동이 없어지게 됩니다.(즉, 전류가 흐르지 않는다.)

Forward Bias

하지만 전압을 반대로 걸어준다면 양공은 같은 극에 대한 반발력으로 - 쪽(N형반도체 연결면)으로 붙게 되고 전자들은 +쪽(P형반도체 접착면)으로 붙게 됩니다. 즉, 이때 서로의 위치가 바뀌게 되는데 이동을 하다가 어쩔 수 없이 전하층의 공핍영역을 만나게 되지만 인공적으로 걸어주었던 전압이 너무 세다 보니 이 힘을 무시하고 넘어갈 수 있게 되는 것입니다.

이렇게 되면 전류가 흐르게 되겠죠.

 

 

 

이와 같이 전류를 흐르게 하려면 같은 전하를 가진 전압을 연결하면 되는데 전류가 흐르도록 연결한 것을 순방향(Forward)으로 연결했다고 하고 반대로 전류가 흐르지 못하게 하는 방향은 역방향(Reverse)으로 연결했다고 합니다.

 

그렇다면 이제 위에서 만든 반도체(pn 접합) 옆에 p형 반도체를 하나 더 붙여 보겠습니다. 그리고 가운데 N형 반도체를 아주 얇게 만들어보겠습니다. 왼쪽 두 개의 반도체에 순방향 전압을 걸어주고 오른쪽 두 개의 반도체에는 역방향의 전압을 걸어주겠습니다. 왼쪽 두 개의 반도체에는 순방향의 전압이 걸려있어서 양공이 B 노드 쪽으로 움직이면서 IB의 전류가 흐릅니다. 이 때 역방향은 전류가 흐르지 않겠죠?(앞서 설명한 원리)

 

순방향의 전압을 더 높여주면 n형 반도체를 거쳐 IB 방향으로, 즉 밑으로 흘러가는 양공들도 있지만 양전하의 반발력이 그만큼 커지게 되면서 n형 반도체를 뛰어넘어 오른쪽 p형 반도체로 넘어가는 양공들이 생겨버리게 됩니다.(특정 전압에서 그렇게 된다-> 문턱전압)

 

그런데 이 때 오른쪽 두 개의 반도체는 C 노드쪽이 음극을 띠고 있기 때문에 넘어온 양공들이 곧바로 C노드, 즉 음극 쪽으로 끌려갑니다. 방금 상황을 정리하자면 순방향의 전압이 세지면서 특정 시점에서 전류가 흐르게 되었다고 설명할 수 있겠습니다.

 

이렇게 N형 반도체를 뛰어 넘을 수 있을 만큼의 특정 전압을 걸어주면 전류를 흐르게 할 수도 있고 흐르지 않게도 할 수 있습니다. 이런 방식으로 스위치 작용을 해 주는 반도체를 바로 트랜지스터라고 합니다.

  • 역방향의 전압을 높여주면 흐르는 전류의 양도 많아지게 됩니다.

 

 

트랜지스터는 위와 같이 생겼는데 저 검정색 부분 안에 바로 pnp 또는 npn 형태의 반도체가 들어있습니다. 세 개의 다리처럼 보이는 도선 중 가운데 도선에 특정 전압을 걸어주면 전류가 흐르게 되는 것입니다.

 

트랜지스터 심볼

트랜지스터는 위와 같은 그림으로 표현하는데 가운데 전압을 걸어주면 전류가 흐르는 것을 추상화한 표현입니다.(화살표 방향에 따라, npn 혹은 pnp로 나뉘게 됩니다.)

 

2. [디지털 논리] 트랜지스터로 만드는 논리회로(Logic Circuit)

논리회로(AND, OR, NOT)

이런 트랜지스터를 이용하면 Logic Gate라고 불리는 논리회로를 만들 수 있는데,

 

하나의 예로, 트랜지스터 2개를 직렬로 연결하게 되면 A와 B 모두 전압이 걸려있을 때만 전류가 흐르게 됩니다. 하나라도 꺼져있으면 전류가 흐르지 않게 되는 것이죠.

 

컴퓨터는 1과0으로 이루어진 디지털 신호를 인식하는데 전류가 통하면 1, 전류가 통하지 않으면 0이 됩니다. 또한 이 1과 0은 참과 거짓으로 표현하기도 합니다.

 

이렇게 두 개의 트랜지스터가 모두 참일 때 결과 값도 참이 되는 논리 게이터를 AND Gate라고 하고 위와 같은 모양으로 추상화 해서 사용합니다. 

 

다음은 OR Gate로 트랜지스터를 위 아래로 연결했을 때 둘 중 하나에만 전압이 걸리거나 양쪽 모두 전압이 걸리는 경우, 이 경우의 논리 회로를 OR Gate라고 하고 오른쪽과 같이 추상화해서 사용합니다.

 

그 다음으로 NOT Gate에 대해 알아보겠습니다. NOT Gate는 입출력 값을 서로 바꿔주는 논리회로인데, 트랜지스터의 출력선을 앞으로 당겨보면 출력선으로 전류가 흘러가게 됩니다. 그럼 트랜지스터에 전압이 걸리면 전류는 그쪽으로 흘러서 출력선에는 전류가 흐르지 않게 됩니다. 반대로 전압이 걸리지 않으면 출력선에 전류가 흐르게 됩니다. 이것을 표로 나타내보면 입력 값과 출력 값이 서로 바뀌게 되는 논리회로를 만들 수 있습니다. 

NOT Gate를 추상화한 이미지는 오른쪽과 같이 됩니다.

 

위의 세 논리회로를 이용해서 XOR Gate를 만들 수 있습니다. XOR Gate는 OR Gate와 같지만 모든 입력이 참일 때 거짓이 되는 차이가 있습니다. 

 

먼저 OR Gate에 AND Gate를 연결하면, AND Gate는 입력 값이 모두 참일 때 참이 되기 때문에 출력이 참이 되게 하려면 입력 값도 모두 참이 되어야 합니다.

 

그 후 AND Gate에 NOT Gate를 연결하면 입출력 값이 바뀌게 되어 거짓이 됩니다. 

 

앞선 NOT과 OR Gate를 입력으로 하여 AND Gate를 연결한 모습(위 왼쪽 그림)을 보면, AND GATE는 입력 값이 모두 참일 때 참이 되니까 이 값은 거짓이 되게 됩니다.

 

2-1. 덧셈을 하는 논리회로

논리회로를 이용한 덧셈기

지금까지 트랜지스터를 이용해서 간단한 논리구조를 만들어봤는데요. 그럼 이러한 것들을 이용해서 덧셈을 할 수 있는 논리회로를 만들어보겠습니다.

 

15와 16을 더하면 어떻게 될까요? 먼저 일의자리를 더하면 5+6=11 이므로 결과의 일의자리에 1을 써주고 십의자리 1은 그 다음 십의자리 덧셈에 같이 더해져 1+1+1=3 이 되므로 답은 31이 됩니다.

 

사람은 이와 같이 계산할 수 있지만 1과 0으로만 이루어진 컴퓨터는 2진수로 계산을 해야 합니다.

 

0과 0을 더하면 0, 0과 1을 더하면 1이 됩니다. 그렇다면 1과 1을 더하면 어떻게 될까요? 컴퓨터는 2라는 숫자를 모르기 때문에 1과 1을 더하면 다시 0이 되고 하나의 자리가 올라간 것을 표현하기 위해 그 다음 자리에 1을 추가하여 더해주게 됩니다.(우리가 십진법으로 계산할 때 10을 넘어가면 다음 자리 숫자에 십의자리 수만큼 더해주는 것과 마찬가지의 원리) 그래서 숫자 2는 이진법으로 '10'과 같이 쓰게 됩니다.

 

이진법의 각 자리는 2의 제곱수로 나타냅니다. 우리가 10진법 자릿수를 나타낼 때 10의 제곱수로 나타내는 것처럼 말이죠. 그렇게 하여 각 자리에 해당하는 2의 제곱수와 해당 자리의 수(1 또는 0)를 곱하면 해당 자리의 수가 되고 그렇게 나온 모든 자리의 결과값을 모두 더한 것이 십진법의 숫자가 됩니다.

 

이진법이 더해지는 과정을 회로로 표현해 보면 출력되는 값은 더해지는 두 값의 합 뿐만 아니라 올림수가 나오는 경우도 존재합니다.(1과 1을 더하는 경우) 그래서 출력값은 합과 올림수 총 두 가지가 있는 것입니다.

 

먼저 입출력 값을 논리 표로 만들어보면 위와 같습니다. A와 B가 더해진 결과는 Sum과 같고 두 수를 더함으로써 생기는 올림수는 마지막에 한 번만 발생하므로 Carry와 같이 될 것입니다. 이렇게 만든 표를 회로로 구축한다면 1과 0을 더할 수 있는 더하기 게이트를 만들 수 있습니다.

 

출력에 따라 합과 올림수의 표를 나눠서 살펴보면 합에 해당하는 논리표는 OR gate에서 1, 1일 때 거짓이 되는 XOR 게이트이고 올림수에 해당하는 논리표는 1, 1일 때만 참이 되는 AND 게이트입니다.

 

입력되는 값을 XOR게이트에 연결하여 합의 값을 출력하고 올림수는 AND 게이트를 연결해 계산하면 됩니다. 이렇게 회로를 구축하면 간단한 덧셈을 할 수 있는 더하기게이트를 만들게 된 것입니다.

 

우리가 사용하는 숫자는 훨씬 더 복잡하기 때문에 모든 수에 적용되는 더하기게이트(덧셈기)는 이것보다 복잡하지만 이런식으로 트랜지스터를 이용해서 논리회로를 구축해 간다는 것을 표현해 볼 수 있었습니다.

 

2-2. 산술논리장치(Arithmetic Logic Unit)

산술논리장치(ALU) IC 칩 - 74181N

CPU에는 ALU라고 하는 산술논리장치(Arithmetic Logic Unit)가 있는데, '산술'이란 더하기 빼기 등 산수를 의미하는 것이고 '논리'는 AND나 OR 같은 논리를 연산하는 기능을 하는 것인데 이 두 가지 기능을 모두 포함한 것이 산술논리장치라고 할 수 있겠습니다. 이러한 산술논리장치 안에는 앞에서 배웠던 수많은 논리게이트들로 이루어져있습니다.

 

3. CPU를 구성하고 있는 트랜지스터? (feat. MOSFET)

트랜지스터는 현재 사람의 손가락 위에 올려놓고 봐야할 정도로 정말 작은데요. 이러한 작은 트랜지스터 수십억개가 CPU안에 들어있습니다. 하지만 이런 형태로는 이렇게 작은 CPU 안에 수십억개를 집어 넣을 수 없을 것 같은데요.

 

CPU에는 MOSFET이라고 불리는 트랜지스터가 들어있는데 그 크기가 미세먼지보다 훨씬 작습니다. (미세먼지 2.5nm, Mosfet 0.5nm)

mosfetdms 위 그림과 같이 생겼는데 밑의 몸체는 반도체이고 위에는 전류가 흐를 수 있는 금속이 있습니다. 몸체는 n형과 p형 반도체로 이루어져 있습니다.

 

n형반도체와 p형반도체가 만나는 지역은 똑같이 공핍영역이 생기게 됩니다. 위와같이 전압을 걸어주게 되면 오른쪽 N형 반도체 부분에는 +가 걸리기 때문에 역방향 전압으로 전류가 흐르지 않게 됩니다.

 

가운데 부분에 이렇게 전압을 걸어주면 전기장이 생성됩니다. 이 힘으로 양공들은 아래로 밀려가고(반발력) (+)전기장의 힘이 크게 작용하는 위쪽에는 전자들이 몰리게 됩니다.

 

위쪽은 전자들이 고농도로 밀집되어 전자가 이동할 수 있는 통로가 만들어집니다.

 

이상태에서 전압을 이렇게 걸어주면 +전기장에 이끌린 전자들이 이동하면서 전류가 흐르게 됩니다. 간단히 표현하자면 가운데 전압을 걸었을 때 ON이 되고, 그렇지 않은 경우 OFF가 된다고 할 수 있습니다.

 

Intel CPU

CPU는 모스펫들이 모여 많은 논리게이트를 이루고 연산을 수행하고 있습니다.

 

4. 컴퓨터는 어떻게 동작하는 걸까?

컴퓨터 메인보드에는 하드디스크(SSD)가 있고 RAM이 있고 CPU가 있습니다. 아시는 분들은 아시겠지만 하드에는 프로그램이 설치되어 있습니다. 하지만 CPU에 비해서 하드는 속도가 느려도 너무 느리기 때문에 CPU는 하드와 소통을 하지 않습니다. 대신에 CPU는 램과 소통하는데요.

 

왼쪽부터 SSD, RAM, CPU

우리가 어떤 프로그램을 설치하면 그 데이터는 우선 램으로 이동하고 CPU는 램에서 그 데이터를 가져옵니다.

 

하지만 RAM도 CPU에 비하면 많이 느리기 때문에 CPU 내부나 근처에 캐시(cache)메모리를 만들어 그곳에 데이터를 임시적을 저장합니다.

 

컴퓨터 저장장치 비교 피라미드

캐시메모리는 임시적으로 저장하는 공간이기 때문에 아무래도 램에비하면 용량이 많이 작습니다. 그렇기 때문에 중요하다고 판단되는 데이터만 저장해서 사용하는데요. 일반적으로 캐시메모리는 레벨1부터 레벨3까지 단계를 나누어 사용합니다.

Level1 Cache, 즉 L1 Cache는 CPU가 가장 먼저 접근하는 메모리로 속도가 가장 빠르지만 용량은 매우 작습니다. 반대로 L2 Cache는 용량이 큰 대신에 속도가 느립니다.

 

CPU는 우선 L1 캐시에 데이터를 요청하고 거기에 없으면 그 다음 단계인 L2 캐시에서 데이터를 읽습니다. 거기에도 없으면 그 다음은 L3 캐시, 그 다음은 RAM 의 순서로 요청을 하여 데이터를 읽는 프로세스입니다.

 

캐시메모리와 램을 통틀어 메모리로 표현하도록 하겠습니다.

 

컴퓨터에 있는 기억장치는 하드디스크, 램, 캐시메모리, 레지스터가 있는데요.

레지스터란 CPU내부에서 데이터를 가져다가 놓고 쓰는 용도로 데이터를 일시적으로 저장하는 장치라고 할 수 있습니다. 그렇기 때문에 접근 거리가 굉장히 짧아 속도가 가장 빠른 메모리라고 할 수 있습니다.

 

컴퓨터 저장장치 비교 피라미드

앞서 봤던 이 피라미드 구조도에서 위로 갈수록 속도는 빠르지만 용량이 작고 가격도 비싸집니다.

 

레지스터는 CPU가 어떻게 동작하는지 알기위해서 반드시 알아야 하는 장치인데요. 위 그림처럼 그 종류가 굉장히 다양하지만 몇가지에 대해서만 알아보도록 하겠습니다.

 

4-1. CPU에 있는 레지스터들

먼저 program counter(프로그램 카운터)라는 레지스터가 있습니다. 여기에는 위 그림의 0004와 같이 다음에 진행할 메모리의 주소가 들어있습니다. 자세한 내용은 뒤에서 다시 살펴보겠습니다.

 

다음으로 메모리 주소 레지스터(Memory address register)가 있습니다. 

이 레지스터는 프로그램 카운터에서 수행할 주소를 넘겨 받은 다음에 그 주소를 직접 찾아가 데이터를 가져오는 역할을 합니다.

 

그렇게 가져온 데이터는 메모리 버퍼 레지스터에 들어옵니다. 메모리 주소 레지스터가 가져온 데이터나 명령(Instruction)들을 일시적으로 저장하는 역할을 합니다.

 

이 레지스터에 저장된 내용 중 명령(Instruction)에 해당하는 것은 명령어 레지스터로 전송되고 연산에 사용될 데이터는 누산기 레지스터로 이동한다.

명령어 레지스터는 명령어에 관한 데이터가 저장되고 누산기 레지스터는 연산의 결과 값이나 중간 값을 일시적으로 저장합니다.

 

최종결과는 메모리 버퍼 레지스터를 통해 메모리로 전송됩니다.

 

그리고 제어장치가 있는데 명령어 레지스터에 있는 명령어를 받아 해석하고 해석된 명령을 실행할 시스템 지시를 보내줍니다. 

ALU는 산술 논리 연산을 실행합니다.

 

5. 프로그래밍 언어(machine language level)

앞선 low-level(hardware적인 내용)보다 조금 높은 단의 얘기를 해보겠습니다.

 

swap(int v[], int k)
{
	int temp:
    temp = v[k]:
    v[k] = v[k+1]:
    v[k+1] = temp:
}

우리가 사용하는 프로그램은 c언어, 파이썬 같은 고급 프로그래밍 언어로 코딩됩니다.

 

코딩된 언어는 컴파일러를 통해 아래와 같이 cpu가 실행할 수 있는 어셈블리 언어로 바뀝니다.

 

<앞선 코드를 컴파일러를 통해 변환한 어셈블리 언어의 모습>

mul i $2, $5, 4
add $2, $4, $2
lw $15, 0($2)
lw $16, 4($2)
sw $16, 0($2)
sw $15, 4($2)
jr $31

 

이 어셈블리어는 어셈블러를 통해 약속된 규칙에 따라 0과 1로 이루어진 기계어로 바뀌게 됩니다.

00000000000000000100000011010000000000011
00000000001010111000001000000010001001000
11001000100100010000100000000000000000000
10010100110101000000000000000000000000000
10101100111100100000000000000000000000000

 

자 그럼 이러한 일련의 과정을 아주 단순화하여 표현해 보도록 하겠습니다.

 

C = A + B

위처럼 고급 프로그래밍 언어(high-level language-인간의 이해를 위한 언어)로 만들어진 코드가 있습니다.

'A와 B의 값을 더해서 그 결과를 C에 저장한다'는 표현인데요. 해당 코드를 컴파일 과정을 거치게 되면 아래와 같은 어셈블리어로 바뀌게 됩니다.

 

LOAD  [10]
ADD   [11]
STORE [12]

 이 내용을 10번지 메모리에 있는 데이터를 읽어와서 11번지에 있는 값과 더한 다음 메모리의 12번지에 저장해라 라는 의미로 해석해 보겠습니다. 

이렇게 바뀐 어셈블리어는 약속된 규칙에 따라 앞서 말한 것과 같이 기계어로 바뀌게 됩니다.

 

 

우리가 사용하는 소프트웨어는 명령어와 데이터의 집합체라고 할 수 있습니다. (컴퓨터구조에서 배우는 내용의 정수)

 

앞에 명령어는 1과 0의 개수가 6개인 6비트로 이루어져 있습니다. 같은 색이 칠해진 부분끼리 같은 의미를 가지고 있는 것입니다. 또한 뒤에 달려있는 흰색 메모리 주소 부분과 매칭되는 비트 부분은 데이터를 의미하고 이는 10비트로 이루어져 있습니다. 

한 줄이 16개의 비트로 이루어진 16비트 언어로 프로세서(CPU)가 한 번에 처리할 수 있는 값이 바로 16비트를 의미하게 됩니다.

 

이 기계어는 램에 이렇게 저장됩니다. 램은 8비트씩 저장되기 때문에 이렇게 두 줄로 저장되는데요. 그렇기 때문에 연속된 두 줄씩이 프로세서가 한 번에 처리할 수 있는 하나의 언어이고 우리가 흔히 32비트다 64비트다 하는데 여기서 사용되는 비트수에 따라 32비트는 4줄씩을, 64비트는 8줄이 됩니다.

 

그렇다면 이 정보가 CPU에서 어떻게 처리되는 알아보겠습니다.

 

프로그램카운터 레지스터에 가져와야 할 메모리의 주소가 있습니다. 보통 짜여진 코드에 따라 다음에 실행해야 하는 명령어에 맞춰서 값이 조작됩니다.

 

해당 주소는 메모리 주소 레지스터로 전달되고 메모리 주소 레지스터는 100번지에 있는 데이터를 가져와 메모리 버퍼 레지스터에 저장합니다. 이렇게 메모리의 데이터를 cpu로 가져오는 과정을 인출이라고 합니다.

 

메모리 버퍼 레지스터에 담긴 LOAD [10]의 정보는 메모리 10번지에 있는 데이터를 가져오라는 명령이기 때문에 명령어를 관할하는 명령어 레지스터로 이동하게됩니다. 

그리고는 프로그램카운터에 그 다음 데이터에 접근하기위해 기존 메모리 주소 값에 2가 더해집니다. 이는 다음에 수행해야 할 메모리가 전에 주소보다 두 칸이 아래에 있기 때문에 2를 더해주는 것입니다.

 

32비트 프로세서는 메모리 4칸을 한 번에 처리할 수 있기 때문에 4가 더해집니다.

 

명령어 레지스터에 저장된 명령은 제어장치로 이동되어 해석(decoding)됩니다. 이 과정을 해석 단계라고 합니다. 이 명령어는 10번지 주솔에 있는 데이터를 읽어오라는 명령이기 때문에 메모리 주소 레지스터에 10이 입력되고 10번지의 데이터를 읽어와서 메모리 버퍼 레지스터에 저장합니다. 10번지에 저장된 값은 명령어가 아닌 데이터이기 때문에 누산기 레지스터에 저장됩니다.

 

 우리는 앞선 C = A + B 프로그램을 실행하기 위해서 이제 LOAD [10] 이라는 어셈블리어 코드 한 줄을 처리했습니다. 이제 다음 줄을 처리하기 위해 프로그램 카운터에 저장된 주소를 가져옵니다.

 

메모리 주소 레지스터에 다음 주소가 들어오고

 

해당하는 주소에 있는 정보가 메모리 버퍼 레지스터에 들어옵니다. 이것은 11번지 주소 값을 더하라는 명령(ADD [11])이기 때문에 명령어 레지스터로 이동합니다. 프로그램 카운터에 다시 2가 더해지고 명령어는 제어장치로 이동되어 해석됩니다.

 

더하기 명령을 실행하기 위해서 누산기 레지스터에 저장된 데이터는 산술 논리장치로 전달됩니다. 다음 메모리 주소 레지스터에 11번지 주소가 입력되고 11번지에 있는 데이터를 아까와 똑같이 메모리 버퍼 레지스터에 저장합니다. 이 값은 명령어가 아닌 데이터이기 때문에 곧바로 누산기 레지스터에 입력됩니다.

 

그 값은 산술 논리장치에서 처리되고 결과 값은 다시 누산기 레지스터에 저장됩니다. 이렇게 산술 논리장치에서 계산되는 과정을 실행 단계(execution)라고 합니다. 

 

이 모든 과정은 제어장치에 의해 컨트롤됩니다.

 

이제 마지막 명령(STORE [12])을 처리하기 위해서 다시 프로그램 카운터에 있는 주소를 읽어옵니다. 

 

메모리 주소 레지스터에 있는 주소를 찾아가 데이터를 가져옵니다. 해당 명령은 저장하라는 명령이기 때문에 명령어 레지스터로 이동되고 프로그램 카운터에 2가 더해집니다.

 

저장하라는 명령어가 제어장치에서 해석되고 12번지 메모리에 계산된 값을 저장하기 위해서 메모리 주소 레지스터에 12를 저장합니다. 누산기 레지스터에 저장된 값은 메모리 버퍼 레지스터를 통해 12번지 메모리에 저장하면 드디어 비로소 프로그램이 종료됩니다.

 

이렇게 CPU는 데이터를 인출하고 해석하고 실행한 다음 저장하는 과정을 거칩니다. 실제로 cpu는 이 단계들 조차 세분화 해서 사용합니다. 우리는 이렇게 분리된 각각의 프로세스를 스레드라고 합니다. 코어 하나에 여러 개의 쓰레드가 실행되면 컴퓨터의 속도는 빨라지게 됩니다.이에 더해 코어 자체의 수가 많아지면 속도는 그것에 비례하여 빨라지게 되겠죠?

 

이러한 프로세서의 구조는 프로세서를 만드는 회사마다 다 다릅니다. 프로세서의 구조를 아키텍쳐(Architecutre)라고 하며 아키텍쳐 디자인은 펜티엄, 샌디브릿지, 하스웰, 타이거레이크 등 다양한 형태로 진화를 거듭하고 있습니다.

 

 

많은 도움이 되셨길 바라겠습니다.

 

Reference

https://www.youtube.com/watch?v=Fg00LN30Ezg 

 

 

반응형

'CS 지식' 카테고리의 다른 글

[Medium] JWT는 안전할까?  (0) 2024.10.05
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.