Machine Language: CPU가 제공하는 Instruction Code
컴파일: 프로그래밍 언어로 작성된 프로그램은 컴파일러를 통해 CPU의 Instruction Code로 전환된다.
컴파일을 안하는 언어(파이썬, JS 등): 인터프리터 언어라고도 하며, 이들은 코드를 한 줄씩 기계어로 전환하여 실행시킨다. 한 줄 실행할 때마다 번역 과정이 동반되므로 컴파일 언어에 비하면 상대적으로 느리다.
LOD A, [1003h]
LOD -> 10h의 Instruction Code
A -> Accumulator(가산기)를 나타내는 약자
풀이 -> 1003h에 있는 데이터를 로드하여 Accumulator에 넣으라는 뜻
BEGIN: LOD A, [1005h]
코드를 재작성할 때마다 주소가 바뀌므로 이름을 붙여주는 작업
Instruction Code를 저장하는 곳과 데이터값을 저장하는 구역은 동일하다.
CPU의 레지스터들
PC(Program Counter): CPU가 다음으로 실행할 명령어의 주소를 가리킨다. 명령어가 실행되면 PC도 업데이트 된다.
IR(Instruction Register): 현재 실행중인 명령어를 보관한다. 메모리에서 읽혀진 명령어가 IR에 먼저 로드되고, 그 뒤에 CPU가 IR의 명령어를 디코딩해서 실행한다.
ACC(Accumulator): 산술&논리 연산을 수행한다. 이런 연산에 대한 결과를 임시로 보관한다.
MAR(Memory Address Register): CPU가 메모리를 참조할 때 필요한 주소들을 보관한다.
MBR(Memory Buffer Register): CPU가 메모리에서 읽거나, 메모리에 저장하는 데이터를 보관한다.
CPU의 기본 실행 구조
Instruction Fetch: 실행할 명령어를 메모리에서 읽어서 CPU로 가져온다.
PC가 가리키는 주소를 MAR에 보낸다.
MAR이 가진 주소를 메모리에서 읽고, MBR로 보낸다.
MBR이 가진 명령어가 IR에 저장된다.
다음 명령어를 가리키도록 PC의 주소값이 증가한다.
Instruction Decode: 명령어가 가진 데이터를 가져오면서, 명령어가 뭔 뜻인지 해독한다.
Instruction Execution: 해독된 명령어를 실행한다.
MBR의 데이터와 ACC의 데이터를 대상으로 연산을 수행하며, 이후 ACC에 저장된다.
Write Back: 실행한 결과를 저장한다.
파이프라인
하나의 작업에 필요한 일을 세부적으로 나누어, 동시에 다른 세부작업을 실행하는 방법이다.
음식을 배달하기 위해서는 재료 준비-조리-포장-배달 의 과정이 필요하다. 다만 이것을 혼자 실행하게 되면 아무래도 효율이 나쁘다. 재료 준비를 하는 동안 조리, 포장, 배달은 놀기 때문. 그렇기에 네 개의 작업을 나눈 다음, 여러명이 겹치지 않도록 작업을 시키게 한다면 효율이 크게 늘어난다.
파이프라인 세부작업은 크게 다음과 같이 나눌 수 있다.
명령어 인출(IF, Instruction Fetch)
명령어 해독(ID, Instruction Decode)
오퍼랜드 인출(OF, Operand Fetch)
명령어 실행(EX, Execute)
결과를 저장(SR, Store)
이러한 파이프라인의 단계는 나누면 나눌수록 효율이 더 늘어난다. 그럼 500, 1000개로 쪼개면 되지 않을까 싶지만, 단계가 늘어날수록 요구되는 클럭의 수도 증가해 나중에는 CPU가 불타버리게 된다. 그렇기에 현대에는 파이프라인의 단계보다는 CPU의 코어를 늘리는 방향으로 가닥을 잡고 있다.
한계점
파이프라인 수행 도중 문제가 생기면, 해당 파이프라인의 코드는 완전히 취소된다. 그러면 그만큼 CPU의 연산은 낭비되어버리고 만다.
CPU 명령어 전략
CISC(Complex Instruction Set Computer)
명령어 하나로 최대한 많은 작업을 수행하는 전략이다. 명령어가 복잡해지므로 CPU 논리 회로의 복잡도도 증가한다. 복잡도가 증가하니 명령어 실행에 걸리는 시간도 늘어난다!
명령어가 복잡해지기 쉬우므로 포맷이나 길이에 관한 규칙이 없다. 그렇기에 전체 명령에 걸리는 시간을 예측하기 어렵다.
인텔 계열 CPU(AMD도 그렇다)가 이 전략을 사용한다.
RISC(Reduced Instruction Set Computer)
CISC의 반대로, 간단한 명령어의 조합으로 효율을 꾀하는 전략이다. 명령어의 포맷과 길이가 고정되어 있으므로, 전체 명령에 걸리는 시간을 예측하기 쉽다.
ARM CPU가 이 전략을 사용한다. 스마트폰, 임베디드, IOT 등등이 해당된다.
메모리 전략
CPU에 사용되는 메모리는 읽고 쓰기 위해 들이는 시간적 비용이 높다. 그렇기에 성능을 높이기 위해 중요한 메모리는 CPU 바로 옆에 두고, 그렇지 않은 메모리는 좀 먼곳에 두게 되었다. CPU와 가까운 곳에 있을수록 크기는 작아지지만 빨라지게 된다.
아래의 순서대로 CPU와 가깝다.
Register: CPU 내부에서 데이터를 보관한다.
SRAM: L1, L2, L3 캐쉬를 뜻하며, 최대한 자주 사용되는 데이터를 모아서 하위 메모리까지 갈 필요 없이 CPU가 접근할 수 있도록 보관한다.
DRAM: 샘숭 램카드 뭐 그런거...
SSD/HDD: 컴퓨터를 꺼도 데이터가 보존되며, 용량도 매우 크다.
Register나 SRAM의 데이터를 가져오는 것은 CPU선에서 해결할 수 있지만, DRAM이나 하드 디스크에서 데이터를 가져오는 것은 CPU 낭비가 영 좋지 않다. 그렇기에 DRAM과 하드 디스크는 DMA(Driect Memory Access)라는 기능을 통해 데이터를 자기들 스스로 관리하고 있을 수 있다. 그렇게 되면 CPU는 연산에만 집중하고, 데이터의 제공은 메모리 쪽에서 알아서 찾아주므로 효율이 증가한다.