본문 바로가기

컴퓨터

[NOOBHACK] CPU의 작동 원리

CPU의 작동원리다 시작은 원자와 전자, 논리 회로 수학까지 들어가니 집중해서 들어야 한다

 

CPU의 구성 요소는 트랜지스터라고 하는 반도체로 만들어져 있다

트랜지스터 N과 P로 이루어져 있다

트랜지스터라는 반드체는 주로 실리콘으로 만들어져 있다

실리콘의 원자 구조는 외각천자가 4개로 다른 실리콘과 무수하게 연결 되어 단단하게 결합 있다

 

이 실리콘은 최 외각 전자가 8개 일 때 가장 안정한 구조를 이루는데

이렇게 단단하게 결합 된다면 전자(전류)가 이동하지 않는다

 

그렇기에 실리콘보다 전자가 한 개 많거나 전자가 하나가 없는 실리콘을 첨가하 전류가 흐르게 한다

전자 하나가 없는 실리콘 구조와 

P형 반도체

전자 하나가 더 많은 실리콘 구조가 있다

지금은 전자가 없는 실리콘을 보겠다

 

N형 반도체

여기 전자가 없는 공간에는 옆에 있는 전자가 공간을 메꾸어 줄 수 있다

그 구조에서 빈 공간엔 전자가 있고 이동한 전자엔 전자가 없어 서로 이동한 것 처럼 보일 수 있다

출저: CPU는 어떻게 작동할까?

그렇기에 전자가 없는 구멍은 양전하를 띈 구멍이라는 의미로 양공이라고 부른다

 

그렇기에 P형 반도체는 한 전자가 없기에 양성을 띄어 P이고

전자가 한 개 많은 반도체는 N 반도체라 부른다

 

그렇다면 이 P형 반도체와 N형 반도체를 서로 붙여 본다

N형은 전자가 하나 더 많고(자유 전자) P형은 전자가 하나 없는 반도체가 이루어져 있다

그렇다면 자연스럽게 N형에 있는 자유 전자가 양공(구멍)에 끌려 결합하게 된다

 

N형과 P형 반도체의 경계선에 - 전하와 + 전하가 띄면서

P형 쪽엔 -전하가 띄어 더 이상 N형의 자유전자가 넘어가지 못 한다 

반대쪽도  P형의 양공도 N형으로 넘어가지 못한다

더 이상 이동 가능한 전하들이 없어지는 영역을 공핍영역이라 한다

 

이 상태에서 전압을 가한다

전압을 가한다면 전지 방향에 따라 전류가 흐르는 방향이 결정 된다

아래의 -,+는 건전지의 방향으로 위의 화살표 방향대로 P형은 전자 왼쪽 외곽 쪽으로 이동하고

N형의 전자은 외곽으로 이동한다 그렇다면 공핍영역은 더욱 확대 되며, 더 이상 전하의 이동이

없어진다

 

반대로 건전지를 반대로 한다면 

이번엔 다른 방향으로 전자와 양공이 이동하면서 전류가 흐르게 된다

공핍영역은 전자의 이동 방향이 더 강해져 공핍영역을 무시하게 된다

 

이렇게 전자가 흐르게 하는 건전지는 순방향으로 연결 했다 하고

반대로 공핍영역이 확장되고 전자의 이동을 막는 방향을 역방향이라 한다

 

이 반도체 옆에 P형 반도체를 더 붙이고 N형 반도체를 줄여 본다

 

PNP 트랜지스터라 부른다

이 반도체에서 순방향 건전지와 역방향 건전지를 설치한다

그렇다면 위의 양공들이 -가 있는 쪽으로 흐르게 된다 하지만

 

위의 전자는 계속 돌면서 순환한다

양공이 N형 반도체를 뛰어 넘을 수 있을 만큼의 특정 전압을 걸어주면 

 

전자가 N형을 넘어 순환한다 특정 전압을 걸고 말고를 한다면 스위치 형식으로 만들 수 있게 된다

 

 

이렇게 NPN 트랜지스터와 PNP 트랜지스터가 따로 있다

그렇게 CPU의 부품을 하나 알아 봤다

 

이제 이 노란색 고리 표는 전류가 흐르고 말고를 표현한 것이다

이제 전류가 흐르면 1, 흐르지 않으면 0를 나타내는데

컴퓨터는 0과 1로 명령을 받으므로 기본적인 전류를 보내는 방법을 배운 것이다

 

이제 이 트랜지스터를 이용한다면 Logic Gate라는 논리회로를 만들 수 있다

 

AND

이 게이트는 AND 게이트 이다 A와 B의 전류가 모두 들어온다면 출력 값이 1이 될 수 있다

하지만 둘 중 하나라도 전력이 안들어 온다면 출력 값은 전기가 없는 0이 된다

 

OR

그리고 OR은 A와 B중 둘 중 하나라도 전류가 흐른다면 결과 값은 참이 된다

 

NOT

not게이트는 입출력의 값을 서로 바꿔주는 논리회로다

VCC에서 전류가 흐를때 Y는 출력갑이며 트랜지스터 A에 전압을 준다면 Y의 값은 0이 되며

A에 전압이 없다면 Y는 1이 된다

 

 

 

XNOT

기본적인 AND,OR,NOT으로 만드는 회로다 A와 B의 값이 서로 다를 때만 참을 출력하며, 둘다 같은 값은 거짓을 출력하는 회로다

이제 위의 회로로 덧셈의 논리 회로를 만들 수 있다

이것은 덧셈 회로인데 이는 입력값 A,B가 S,C가 나온다 진리표를 살펴 보자면

입력 출력
A B C(올림수) S(합)
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0

C는 반올림의 여부를 나타내고

S는 첫번쨰 자리수를 나타낸다

컴퓨터는 1와 0만을 이용하여 연산을 하니 2진수로 계산을한다

 

0+0=0

1+0=1

0+1=1

1+1=10

 

이렇게 된다 실제 모든 수를 계산하는 더하기 게이트는 이것보다 복잡하다

 

CPU는 트랜지스터로 이루어져 있지만 크기는 생각보다 작지만 트랜지스터는 보기보다 크다

물리적으로 불가능해 보이는데 어떻게 가능한 걸까?

 

Monfet

Mosfet는 미세먼지가 2.5 나노미터지만 Mosfet는 0.1나노미터로 매우 작다

이런 구조로 되어 있는데 +가 가르키는 곳에 전압을 가한다면 자기장이 형성 되어 전자가모여 전류가 흐를 수 있게한다

가운데에 전압을 걸어주면 ON이 된다는 것이다

 

 

 

그리고 그 외의 부품이다

산술 논리 장치(Arithmetic Logic Unit)

CPU에는 ALU라는 산술 논리 장치가 있는데 산술은 더하기 빼기 등 산수를 계산하고 

논리 장치는 AND나 OR의 논리를 맡게 된다

 

 

램(Random Access Memory)

Random Access Memory의 약자로 사용자가 자유롭게 내용을 읽고 쓰고 지울 수 있는 기억장치다

컴퓨터가 켜지고 난 순간부터 CPU는 연산을 하고 동작에 필요한 모든 내용이 전원이 유지되는 내내 이 기억장치에 저장된다

 

하드디스크(Hard Disk Drive)

HDD는 하드 라고도 하며 비휘발성, 순차접근이 가능한 컴퓨터의 보조 기억장치이다

데이터를 저장하는 장치이기도 하며 우리의 소중한 직박구리가 숨겨져 있다

 

 

부품의 상호작용

하드 디스크는  CPU에 비하면 너무 느리기 떄문에 HHD와는 소통하지 않는다

그 대신 램과 소통한다 우리가 프로그램을 실행하면 HHD에서 데이터를 꺼내 램으로 이동하고

그 램에 있는 데이터는 CPU로 가져다 준다

하지만 램도 CPU에 비하면 한참 느리기에 CPU내부나 근처에 캐시메모리라는 것을 만들어 그곳에 램의 데이터를 저장한다

캐시 메모리는 램에 비하면 용량이 작다 그렇기에 중요하다고 판단하는 데이터만 캐시 메모리에 저장해서 사용한다

 

이제 캐시 메모리를 살펴보자

캐시 메모리(Cache Memory, Hardware Cache)

캐시 메모리는 컴퓨터 시스템의 성능을 향상 시키기 위해 별도로 탑재된 캐시 전용 메모리다

하드웨어의 메모리 관리 시스템이 내부적으로 제어하며 자주 사용하는 데이터를 캐시 메모리에 담아

사용한다

 

 

 

이제 본론으로 돌아와서 캐시 메모리의 구조는 다음과 같다

L1 CACHE
L2 CACHE
L3 CACHE

LEVEL1 캐시는 CPU가 가장 먼저 접근하는 메모리로 속도가 가장 빠르지만 용량은 작다

이처럼 LEVEL1에 가까울 수록 속도가 빨라지고 용량은 작아지지만 LEVEL3으로 갈 수록 속도는 느려지지만

용량이 커진다

 

CPU는 우선 LEVEL1캐시에 데이터를 요청하고 L1에 데이터가 없다면 L2에서 데이터를 찾아본다 또 없으면 L3에 요청을 하며 L3에도 없으면 RAM에 있는 데이터를 읽게 된다 

 

레지스터(Register)

프로세서에 위치한 고속 메모리(가장 빠른 메모리)로 극히 소량의 데이터나 처리 중인 중간 결과와도 같은 프로세서가 바로 사용할 수 있는 데이터를 담고 있는 영역을 말한다 컴퓨터의 구조에 따라 크기와 종류가 다양하다 그리고 이 레지스터는 어셈블리어 언어에도 이용된다

 

 

 

이처럼 속도가 빠를수록 용량은 작아지고 가격도 비싸진다

속도와 가격이 빠르고 비싼 순으로 나열 하자만

REGISTER > CACHE > RAM > HHD

 

레지스터는 CPU 작동에 있어서 가장 중요한 메모리다 종류가 많지만 그 몇 가지만 알아 보자

 

프로그램 카운터: 다음에 수행해야 할 메모리 주소가 담겨져 있다

메모리 주소 레지스터: 프로그램 카운터에서 받은 주소를 그 주소로 찾아가 데이터를 받아 온다

 

메모리 버퍼 레지스터:  메모리 주소 레지스터가 가져온 데이터나 명령들을 일시적으로 저장한다

최종 결과 값을 저장하는 레지스터기도 하다

 

명령어 레지스터: 명령어에 관한 데이터가 저장 된다

 

누산기 레지스터: 연산의 결과 값이나 중간 값을 일시적으로 저장한다

 

우리가 C언어로 프로그래밍을 한다면 그 C언어 코드들은 어셈블리어로 변환되고 그 어셈블리어는 약속된 규칙에 따라

기계어로 바뀌어 컴퓨터에게 명령하게 된다

 

이제 어셈블리어를 배우고 한 명령어를 CPU가 처리하는 과정을 보게 된다면 더욱 쉽게 이해 할 수 있을 것이다

https://noobhack.tistory.com/22

 

[NOOBHACK] 어셈블리어란

해킹을 배운다면 정말정말 중요한 어셈블리어에 대해 배워보자 일단 어셈블리어란 프로그래밍 언어인데 이게 좀 저급 언어다 언어로서 질이 낮다는게 아니라 프로그래밍 언어 중 고급 언어와

noobhack.tistory.com

https://noobhack.tistory.com/23

 

[NOOBHACK] 어셈블리어 구동 방식과 명령어

어셈블리어를 입문하는 사람들을 위해 친절하고 링크도 걸어주고 다 할테니까 어셈블리어를 처음 접하는 분이라면 아래 링크에 들어가길 바란다 https://noobhack.tistory.com/22 [NOOBHACK] 어셈블리어란

noobhack.tistory.com

https://noobhack.tistory.com/25

 

[NOOBHACK] C언어를 어셈블리어로 변환하기

자 어셈블리어는 겁나 어렵고 읽기도 버겁다고 했습니다 하지만 포너블이나 해킹을 위해서는 꼭 필요한 요소로 작용하는데요 그런 어셈블리어를 읽는 방법을 알려주겠습니다 먼저 코드부터 보

noobhack.tistory.com

https://noobhack.tistory.com/26

 

[NOOBHACK] 어셈블리어 읽는 방법

자 오늘은 어셈블리어를 쉽사리 못 읽는 초보들을 위해 어셈블리어를 쉽게 읽는 방법을 알려주겠다 그전에 내 게시물을 제대로 안 본 사람들이 있다면 전 게시물을 보고 오시길 바랍니다 https://

noobhack.tistory.com

 

이제 C언어의 한 코드를 CPU가 어떻게 처리하는지 알아보자

 

A = C+B;

 

변수 C,B를 더해 A에 저장하라는 C언어 코드다 

이를 컴파일 과정을 거친다면

 

LOAD[10] = 100110 0000001010

ADD[11] = 110011 0000001011

STORE[12] = 111010 0000001100

 

어셈블리어로 나타 낼 수 있다

명령어는 6비트로 이루어져 있으며 데이터는 10비트로 이루어져 있다

그렇다면 명령어 비트와 데이터 비트를 합치면 CPU가 한번에 처리 할 수 있는 비트 수는 16비트 이므로

16비트 CPU가 될 수 있는 것이다

 

이제 이 어셈블리어를 간단하게 해석하자면

 

LOAD[10] 은 메모리 주소 10에서 데이터를 가져와

ADD[11] 은 메모리 주소 11의 데이터를 더해

STORE[12] 은 그 결과값을 메모리 주소 12에 저장하라는 의미로 볼 수 있다

(어셈블리어를 아는 사람은 알텐데 이건 가정이지 실제 어셈블리어와는 무관하다)

 

이제 램에 저장된 구조를 한번 살펴보자

 

데이터 메모리 주소
0 98
0 99
10011000(LOAD) 100
00001010(10) 101
11001100(ADD) 102
00001011(11) 103
11101000(STORE) 104
00001100(12) 105
0 106

 

램은 8비트로 저장되기 떄문에 두 줄로 8비트를 표기된다

이렇게 두 줄이 프로세서가 한번에 처리 할 수 있는 하나의 언어이며 32비트는 4줄 64비트는 8줄이 된다

 

이제 이 CPU가 어떻게 처리 되는지 알아보자

지금 프로그램 카운터 레지스터에 값이 있다

그 값은 메모리 주소 레지스터로 전달 되고

 

이제 메모리 버퍼 레지스터에 메모리 주소 레지스터의 명령어(LOAD)와 값(10)을 가져오게 된다

메모리의 데이터를 CPU로 가져오는 과정을 인출이라고 한다

그리고 메모리 버퍼 레지스터의 내용은 LOAD[10]이기 때문에 명령어 레지스터로 이동한다

 

 

이 명령어가 끝났으니 다음을 실행할 메모리 주소를 프로그램 카운터에 등록한다

32비트 프로세서는 메모리 4칸을 한번에 처리하기 때문에 다음 메모리 주소 값은 최소 4칸 이상이다

그리고 프로그램 카운터를 더 이해 하고 싶다면 ret와 sft를 알아보자

https://noobhack.tistory.com/29

 

[NOOBHACK] sfp,ret의 대한 설명

포너블을 처음 접하신 분이라면 스택의 구조가 buffer+sfp+ret으로 이루어 졌다는 것 쯤은 알 것이다 buffer란 그냥 데이터가 저장되는 공간이라는 것을 생각하면 되고 sfp와 ret를 모르는 분들을 위해

noobhack.tistory.com

 

그리고 명령어 레지스터에 저장된 명령은 제어장치로 이동되어 해석된다

이를 해석 단계 라고 한다

 

명령어는 제어장치에서 처리하기 때문에 제어장치에선 LOAD[10]를 해석하여 메모리 주소 레지스터는 10이 되고 메모리 주소 10에서 데이터를 가져오게 된다

 

데이터 메모리 주소
0 8
0 9
2 10
3 11
  12
0 ...
0 ...
0 98
0 99
10011000(LOAD) 100
00001010(10) 101
11001100(ADD) 102
00001011(11) 103
11101000(STORE) 104
00001100(12) 105
0 106

그리고 우린 10번지의 데이터를 읽어와서 메모리 버퍼 레지스터에 저장한다

 

 

10번지에 저장된 값은 명령어가 아닌 데이터기 때문에 누산기 레지스터로 이동된다

 

 

이제 우린 LOAD[10] 이라는 명령어를 겨우 실행하게 됐다 이제 다음 줄을 처리하기 위해 프로그램 카운터에 저장된 주소를 메모리 주소 레지스터에 가져온다

 

이제 메모리 주소 레지스터에 있는 값의 주소의 메모리를 메모리 버퍼 레지스터에 넘기게 된다

 

 

메모리 버퍼 레지스터에 있는 명령어는 메모리 주소 11에 주소 값을 더하라는 명령이기 때문에 명령어 레지스터로 넘어간다

 

 

 

 

그리고 명령어 레지스터에 있는 명령어는 다시 제어장치로 이동되어 해석 된다

 

 

 

이번엔 더하기 명령을 실행하는 누산기 레지스터에 저장된 데이터(2)는 산술 논리 장치(ALU)로 이동 된다

다음 메모리 주소 레지스터는 메모리 주소 11에 있는 데이터(3)를 메모리 버퍼 레지스터에 넣게 된다.

 

데이터 메모리 주소
0 8
0 9
2 10
3 11
  12
0 ...
0 ...
0 98
0 99
10011000(LOAD) 100
00001010(10) 101
11001100(ADD) 102
00001011(11) 103
11101000(STORE) 104
00001100(12) 105
0 106

 

메모리 버퍼 레지스터에 있는 값은 명령어가 아닌 데이터이므로 누산기 레지스터에 입력 된다

 

그리고 누산기의 값은 2의 데이터가 있는 ALU에 이동된다

 

 

 

ALU에서 계산된 값은 누산기에 저장된다

 

 

이렇게 산술 논리장치에서 계산되는 과정을 실행 단계라고 한다

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

 

이제 마지막 명령을 처리하기 위해 다시 프로그램 카운터에 있는 주소를 읽어준다

 

어느때와 같이 프로그램 카운터에 있는 명령어를 메모리 주소 레지스터로 옮겨준다 

그리고 메모리 주소 레지스터에 있는 메모리 주소 값으로 찾아가 데이터를 가져온다

 

 

이는 저장하라는 명령이기 때문에 명령어 레지스터로 이동되고 프로그램 카운터는 ret값이 된다

그리고 메모리 버퍼 레지스터는 명령어이기 떄문에 명령어 레지스터로 이동되고 명령어 레지스터는 다시 제어장치에 들어간다

 

제어장치에서 저장하라는 명령을 알아 듣고 실행하기 위해 메모리 주소 레지스터는 STORE[12]의 12를 메모리 주소 레지스터에 저장된다

 

누산기에 저장된 값은 메모리 버퍼 레지스터를 통해

 12번지 메모리에 저장하면 프로그램이 완료된다

 

데이터 메모리 주소
0 8
0 9
2 10
3 11
5 12
0 ...
0 ...
0 98
0 99
10011000(LOAD) 100
00001010(10) 101
11001100(ADD) 102
00001011(11) 103
11101000(STORE) 104
00001100(12) 105
0 106

이렇게 해서 A=B+C;의 프로그램이 끝났다

이젠 이 인출+해석+실행+저장이라는 과정을 거친다

실제 CPU는 이 단계를 조차 세분화 해서 사용한다

 

이렇게 분리된 각각의 프로세스를 스레드라고 한다

코어 하나에 여러개의 쓰레드가 실행되면 속도가 빨라지게 된다

 

그리고 그 코어는 많을수록 컴퓨터가 빨라지며 이러한 프로세서 구조는 회사마다 다르다

프로세서 구조를 아키텍처라 하며 그 아키텍처는 회사마다 다르다

 

이렇게 길고 긴 CPU의 작동 원리를 알아 보았다 자료는 전부 구글과 해당 링크에서 찾았다

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

 

'컴퓨터' 카테고리의 다른 글

[NOOBHACK] cmd 사용 방법  (0) 2023.10.27
[NOOBHACK] C언어에서 기계어 변환 과정  (0) 2023.09.13
[NOOBHACK] GDB를 통한 언더플로우 관찰  (0) 2023.09.13
[NOOBHACK] GPU의 원리  (1) 2022.10.18