CPU(Central Prosessing Unit)는 명령을 읽고 해석하여 처리하는 중앙 처리 장치입니다. 메모리 소자들의 회로를 하나의 패키지에 집적하여 만들어진 IC(Integrated Circuit), 즉 집적회로가 CPU이며, IC 중 제일이라고 할 수 있습니다.
CPU는 명령을 읽고 해석한다는 장점 덕분에, 하드웨어로만 이루어진 기계와 달리 소프트웨어를 변경하여 다양한 기능을 하게 만들 수 있어서, 대부분의 전기/전자 시스템에 사용됩니다.
CPU의 구성은 크게 CU, ALU, REGISTER로 구분할 수 있습니다.
CU(Control Unit)
CU는 ALU, REGISTER 등의 주변 유닛을 제어하는 제어 유닛이며, 기계어 명령을 읽고, 해석하고, 실행하기 때문에, 거의 모든 일을 하게 됩니다.
ALU(Arithmetic Logic Unit)
ALU는 산술/논리 연산을 담당하는 연산 유닛이며, 피연산자와 명령을 CU로부터 받아, 산술 연산이나 논리 연산을 계산하여 결과를 출력합니다. 연산 결과의 상태는 상태 레지스터에 비트로 표시됩니다.
REGISTER
레지스터는 하드디스크, 램과 같은 기억장치의 일종으로, 데이터의 임시 저장, 연산 작업 등에 사용하는 cpu 전용 메모리입니다. 하드디스크, 램보다 저장할 수 있는 용량은 작지만, 그것들에서 데이터를 읽어오는 것보다 처리속도가 빠릅니다.
CU나 ALU와는 달리, 레지스터는 펌웨어에 접근 가능하며, 정말 많이 사용됩니다. 그 중, CPU가 특수한 용도로 사용하는, 사용 용도가 정해진 레지스터들을 알아보겠습니다.
PC(Program Counter)
프로그램 카운터는 CPU가 다음에 수행할 명령의 메모리 주소를 저장하는 레지스터입니다. CPU가 PC를 통해 명령의 주소로 이동하여 명령을 읽어오면, PC는 값을 하나 증가시켜 다음 명령의 메모리 주소를 저장합니다.
IR(Instruction Register)
명령어 레지스터는 PC에 저장된 주소에서 읽어온 명령어를 저장하는 레지스터입니다. CU는 IR 레지스터의 명령어를 해석하고 실행합니다.
LR(Link Register)
복귀 레지스터는 프로그램에서 함수를 호출할 때, 함수로 이동하고 함수의 명령어들을 다 수행한 후, 다시 호출한 장소로 복귀할 주소를 저장합니다.
PSR(Program Status Register)
상태 레지스터는 명령을 수행한 후 ALU가 수행한 연산 결과 등에 대한 CPU의 상태 정보를 기록합니다. 기록되는 상태 정보 중, 연산에 대한 상태 정보로는 overflow, negative, zero, carry, parity 비트 등이 있습니다.
MAR(Memory Address Register)
메모리 주소 레지스터는 데이터를 읽어오거나, 변경할 메모리의 주소를 저장합니다.
MBR(Memory Buffer Register)
메모리 버퍼 레지스터는 메모리에 읽거나 쓸 데이터, 명령을 저장합니다. 이 레지스터에 저장된 명령은 IR, 명령어 레지스터로 전송됩니다.
AC(Accumulator Registr)
누산기 레지스터는 ALU 내부에 위치하며, ALU의 산술/논리 연산 중에 사용됩니다. CU는 산술/논리 연산이 필요한 데이터를 누산기 레지스터에 저장합니다.
SP(Stack Pointer Register)
스택 포인터 레지스터는 스택의 현재 위치 정보를 저장합니다.
스택은 데이터를 저장, 복원하는 등의 동작에 사용되는 메모리 저장 구조입니다. 저장하는 동작을 PUSH, Stacking이라 하며, 인출하는 동작을 POP, Unstacking이라 합니다.(push, pop은 어셈블리 명령어이기도 하다) 스택은 마지막에 저장된 데이터가 제일 처음 인출되는 구조이기에 LIFO(Last In First Out)구조라 합니다. 그래서 보통 특정 정보를 저장했다가, 다시 복원하는 일에 사용됩니다. Ctrl+Z의 역할을 생각하면 이해하기 쉽습니다.
지금까지는 특수 용도 레지스터들을 알아봤습니다. 이제부터는 일반 목적 레지스터에 대해서도 알아보겠습니다.
일반 목적 레지스터(General Purpose Register)
함수의 파라미터(인수), 변수, 연산 결과 등 일반적인 데이터를 저장하는 일반적인 용도로 사용되는 일반 목적 레지스터는 R0, R1, R2... 와 같이 Rn 형태로 정의됩니다.
ex) num1 + num2; → add r0, r1
CPU는 기본적으로 메모리에서 순차적으로 명령을 읽어와서 해석하여 실행시키는 동작을 합니다. 여기서 명령어를 메모리에서 읽어오는 과정을 FETCH, 명령어를 해석하는 과정을 DECODE, 명령어를 실행하는 과정을 EXECUTE라고 합니다.
이러한 세 단계에 거쳐 CPU는 명령을 실행시키는데, 한 동작을 1 클럭 신호에 따라 수행합니다. 세 단계를 수행하는, 한 명령어를 실행시키기 위해 필요한 기간을 Machine Cycle이라 합니다.
FETCH
PC의 주소에서 명령어를 인출하여 IR에 저장한 후, PC 값을 1 증가시킵니다.
DECODE
IR에 저장한 명력어를 해석하고 실행할 준비를 합니다.
EXECUTE
명령어를 실행하고, 산술/논리 연산이 필요하면 ALU를 사용합니다.
CU가 Decode를 하는 동안, 외부 메모리는 사용되지 않기 때문에 동시에 Fetch(외부 메모리에서 명령어 인출하기)를 할 수 있습니다. 이처럼 현재 동작과 다음 동작을 동시에 처리하는 것과 같은 효과를 내는 동작을 파이프라인(병렬처리) 동작이라고 합니다. 처리 속도가 굉장히 빨라지기 때문에 거의 모든 CPU가 이 파이프라인 동작을 사용합니다.
기존에는 1 클럭에 한 동작을 수행 했으므로 Machine Cycle은 3 클럭에 해당했다. 그러나 파이프라인 동작을 사용하면 동시에 다음 다음 Fetch, 다음 Decode, 현재 Execute 동작을 수행하기에 Machine Cycle은 1 클럭에 해당한다. 처리 속도가 세 배 빨라진 것이다.
예시
예시로 a++;을 들어보며 자세한 연산과정을 살펴보겠습니다.
우선 a++;이란 명령어는 기계가 이해할 수 있는 명령어로 바뀌어 메모리에 저장됩니다. load [a], add 1, store[a]가 임의의 메모리 주소인 100, 101, 102에 저장되어있다고 가정하고, 변수 a는 10이란 값이 저장된 상태로 임의의 메모리 주소인 1에 저장되어있다고 가정합니다.
memory add [1] : a | memory add ... | memory add [100] | memory add [101] | memory add [102] |
10 | ... | load [a] | add 1 | store [a] |
이 명령어들이 작성된 프로그램이 수행될 때, PC에는 가장 첫 명령인 load [a]가 저장된 메모리 주소 100이 들어있게 됩니다. PC에 저장된 100은 MAR에 똑같이 저장되고 PC는 가진 값을 +1 시켜 다음 명령어의 주소를 저장합니다. MAR은 저장된 메모리 주소 100으로 이동하여 그 주소에 들어있는 데이터를 읽어와서 MBR에 저장 시킵니다. 이 때, MBR에 저장된 데이터는 명령어이므로 다시 IR에 저장됩니다. IR에 저장된 명령어 load [a]를 CU가 '메모리 주소 1로 이동하여 그 데이터를 불러와라'라고 해석하여 수행시킵니다.
따라서 MAR에는 1이 저장되고, MAR은 저장된 메모리 주소 1로 이동하여 그 주소에 들어있는 데이터를 읽어와서 MBR에 저장 시킵니다. 이 때, MBR에 저장된 데이터는 산술/논리 연산이 필요한 데이터이므로 다시 AC에 저장됩니다.
이제 load [a] 명령어가 끝났기 때문에, 처음부터 반복합니다.
PC에 저장된 101은 MAR에 똑같이 저장되고 PC는 가진 값을 +1 시켜 다음 명령어의 주소를 저장합니다. MBR은 저장된 메모리 주소 101로 이동하여 그 주소에 들어있는 데이터를 읽어와서 MBR에 저장 시킵니다. 이 때, MBR에 저장된 데이터는 명령어이므로 다시 IR에 저장됩니다. IR에 저장된 명령어 add 1을 CU가 '1을 더하라'라고 해석하여 수행시킵니다.
따라서 기존 누산기에 있던 a의 값인 10이 ALU로 이동되고, 더할 값인 1도 ALU로 이동합니다. 그 후에는 ALU가 알아서 10과 1을 더해준 후, 결과값인 11을 누산기에 저장시킵니다.
이제 add 1 명령어가 끝났기 때문에, 처음부터 반복합니다.
PC에 저장된 102는 MAR에 똑같이 저장되고 PC는 가진 값을 +1 시킵니다. 다음 명령어는 없지만, 그래도 +1 시킵니다. MBR은 저장된 메모리 주소 102로 이동하여 그 주소에 들어있는 데이터를 읽어와서 MBR에 저장 시킵니다. 이 때, MBR에 저장된 데이터는 명령어이므로 다시 IR에 저장됩니다. IR에 저장된 명령어 store [a]를 CU가 '메모리 주소 1로 이동하여 데이터를 저장시켜라'라고 해석하여 수행시킵니다.
따라서 MAR에는 1이 저장되고, 누산기에 있던 값 11이 MBR로 이동된 후, 다시 MBR에 이동된 11 데이터가 MAR에 저장된 메모리 주소 1, 즉 변수 a에 저장됩니다.
이제 처리해야 할 명령어가 모두 끝났기 때문에 프로그램은 종료됩니다.
+과제용으로 잠시 url 추가 : 유튜브 초반 반도체 내용, 이전에 정리해둔 것이 있기에 올립니다.
'HD' 카테고리의 다른 글
그래핀이란? (0) | 2023.05.26 |
---|---|
반도체에서 흐르는 전류란? (0) | 2023.02.22 |
반도체란? (1) | 2023.02.20 |