본문 바로가기
Study/컴퓨터 구조

[컴퓨터구조] CPU의 구조와 기능

by generous_jeans 2021. 1. 14.

CPU : 기억장치에 저장되어 있는 프로그램 코드인 명령어들을 실행하여 프로그램을 수행함. 

 

CPU가 수행해야 하는 세부적인 동작

① 명령어 인출(Instruction fetch) : 기억장치로부터 명령어를 읽어옴. 

② 명령어 해독(Instruction decode) : 수행해야 할 동작을 결정하기 위하여 명령어를 해독함. 

③ 데이터 인출(Data fetch) : 명령어 실행을 위해 데ㅣ터가 필요한 경우 기억장치 혹은 I/O 장치로부터 데이터를 읽어옴. 

④ 데이터 처리(Data process) : 데이터에 대한 산술적 혹은 논리적 연산을 수행.

⑤ 데이터 저장(Data store) : 수행한 결과를 저장함. 

①, ② : 필수적으로 수행됨.

③. ④, ⑤ : 명령어에 따라 필요한 경우에만 수행됨.

 

- CPU의 기본 구조 - 

CPU는 산술논리연산장치(ALU:Arithmetic and Logical Unit)와 레지스터 세트 및 제어 유니트로 구성됨. 

 

산술논리연산장치(ALU:Arithmetic and Logical Unit) 

: 산술 및 논리 연산들을 수행하는 회로들로 이루어진 하드웨어 모듈.

산술 연산

: 덧셈, 뺄셈, 곱셈, 나눗셈

논리 연산 

: AND, OR, NOT 등

 

레지스터(register)

: CPU 내부 기억장치로서 액세스 속도가 기억장치들 중에서 가장 빠름. 

내부 회로가 복잡해 비교적 큰 공간을 차지하여, 많은 레지스터들을 CPU 내부에 포함할 수 없음.

지정된 용도로만 사용되는 특수 목적용 레지스터들과 적은 수의 일반 목적용 레지스터들로 이루어져 있음.

 

제어 유니트(control unit)

: 인출된 명령어를 해독하고, 그 실행을 위한 제어 신호들을 순차적으로 발생하는 하드웨어 모듈. 

명령어 실행에 필요한 각족 정보들의 전송 통로와 방향을 지정해주고, CPU 내부 요소들과 시스템 구성 요소들의 동작 시간을 결정해 줌.

CPU가 제공하는 명령어들의 수가 많아질수록 제어 유니트의 내부 회로는 더 복잡해짐. 

복잡도를 줄이기 위해 제어 유니티의 동작을 소프트웨어로 처리해주는 방법을 마이크로프로그래밍(microprogramming)이라 함.

마이크로프로그래밍을 사용하면 명령어 실행 시간이 길어짐.

따라서, 명령어의 수를 줄이고 명령어 형식을 단순화하여 하드웨어만으로 명령어를 실행할 수 있도록 하는 RISC(Reduced Instruction Set Computer) 설계 개념이 많이 사용되고 있음.

 

CPU 내부 버스(CPU internal bus) 

: CPU 내부 구성요소들 간의 정보 전송 통로.

외부의 시스템 버스와 직접 연결되지 않음. 

버퍼 레지스터 혹은 인터페이스 회로를 통해 시스템 버스와 접속됨. 

 

- 명령어 실행 - 

명령어 사이클(instruction cycle) 

: 한 명령어를 실행하는 데 필요한 전체 과정으로서, 명령어 인출 단계와 명령어 실행 단계로 나누어짐.

CPU가 프로그램 실행을 시작한 순간부터 전원을 끄거나 회복 불가능한 오류가 발생하여 중단될 때까지 반복하여 수행됨. 

명령어 인출(instruction fetch) - 인출 사이클

명령어 실행(instruction execution) - 실행 사이클

 

명령어를 실행하기 위해 기본적으로 필요한 CPU 내부 레지스터

① 프로그램 카운터(Program Counter : PC)

: 다음에 인출된 명령어의 주소를 가지고 있는 레지스터. 

각 명령어가 인출된 후에는 그 내용이 자동적으로 1(혹은 명령어 길이에 해당하는 주소 단위의 수만큼)이 증가되고, 분기(branch) 명령어가 실행되는 경우에는 그 목적지 주소로 갱신됨.

② 누산기(Accumulator : AC)

: 데이터를 일시적으로 저장하는 레지스터.

이 레지스터의 비트 수는 CPU가 한 번에 연산 처리할 수 있는 데이터 비트 수, 즉 단어 길이와 같음.

③ 명령어 레지스터(Instruction Register : IR)

: 가장 최근에 인출된 명령어가 저장되어 있는 레지스터.

④ 기억장치 주소 레지스터(Memory Address Register : MAR)

: 프로그램 카운터에 저장된 명령어 주소가 시스템 주소 버스로 출력되기 전에 일시적으로 저장되는 주소 레지스터.

이 레지스터의 출력 선들이 주소 버스 선들과 직접 접속됨.

⑤ 기억장치 버퍼 레지스터(Memory Buffer Register : MBR)

: 기억장치에 저장될 데이터 혹은 기억장치로부터 읽혀진 데이터가 일시적으로 저장되는 버퍼 레지스터.

이 레지스터의 입력 및 출력 선들은 데이터 버스 선들과 직접 접속됨.

 

기억장치로부터 인출된 명령어는 MBR을 경유하여 IR에 저장되며, 실행 사이클에서 제어 유니트로 보내져 해독됨.

기억장치로부터 인출된 데이터는 MBR을 통하여 AC로 적재됨. 

명령어가 그 데이터에 대하여 산술 혹은 논리 연산을 수행하는 것일 경우, AC의 내용이 ALU로 보내짐. 

ALU의 연산 결과는 다시 AC에 저장됨. 

 

- 인출 사이클 - 

CPU는 각 명령어 사이클의 시작 단계에서 프로그램 카운터가 가리키는 기억장치의 위치로부터 명령어를 인출해 옴.

CPU는 PC의 내용을 1씩 증가시켜 명령어들을 기억장치에 저장되어 있는 순서대로 릭어올 수 있게 함. 

 

인출 사이클(fetch cycle)

: CPU가 기억장치의 지정된 위치로부터 명령어를 읽어 오는 과정. 

 

마이크로-연산(micro-operation)

: CPU 클록의 각 주기 동안 수행되는 기본적인 동작.

 

인출 사이클에서 각 단계별로 수행되는 동작을 마이크로-연산으로 표현.

t0 : MAR PC

t1 : MBR ← M[MAR], PC ← PC + 1

t2 : IR ← MBR

 

t0, t1, t2 : CPU 클록의 각 주기.

명령어 인출에는 세 개의 CPU 클록 주기만큼의 시간이 걸림.

예. CPU의 클록 주파수가 1GHz일 때, 클록 주기는 1ns, 인출 사이클은 1ns X 3 = 3ns

 

t0 : PC의 내용을 CPU 내부 버스를 통해 MAR로 보냄. 

시스템 주소 버스와 직접 접속된 MAR를 통해 주소가 기억장치로 전송됨.

 

t1 : 주소가 지정하는 기억장치 위치로부터 읽혀진 명령어가 데이터 버스를 통해 MBR로 적재됨.

동시에 PC의 내용에 1을 더해 다음 명령어 주소를 가리키게 함. 

만약, 컴퓨터의 각 기억장치 주소가 8비트 단위로 지정되고 명령어 길이가 16비트일 경우, 한 명령어를 읽은 다음 PC의 내용에 2를 더해야 다음 명령어가 저장된 위치를 지정할 수 있음.

 

t2 : MBR에 저장되어 있는 명령어 코드가 명령어 레지스터인 IR인 이동됨. 

 

- 실행 사이클 - 

실행 사이클(execute cycle)  

: CPU가 명령어를 해독하고, 그 결과에 따라 필요한 연산들을 수행하는 과정.

 

① 데이터 이동 : CPU와 기억장치 간 혹은 CPU와 I/O 장치 간에 데이터를 이동함. 

② 데이터 처리 : 데이터에 대하여 산술 혹은 논리 연산을 수행. 

③ 데이터 저장 : 연산결과 데이터 혹은 입력장치로부터 읽어들인 데이터를 기억장치에 저장함. 

④ 프로그램 제어 : 프로그램의 실행 순서를 결정함. 

 

명령어

: CPU가 수행할 연산을 지정해주는 연산 코드와 그 연산의 수행에 필요한 오퍼랜드로 구성되어 있음. 

오퍼랜드(addr) 

: 명령어가 사용할 데이터가 저장되어 있는 기억장치의 주소를 가리킨다고 가정. 

 

① IR에 저장된 명령어의 오퍼랜드를 MAR을 통해 기억장치로 보내 데이터를 인출.

LOAD addr

: 기억장치에 저장되어 있는 데이터를 CPU 내부 레지스터인 AC로 적재(load)함. 

 

t0 : MAR  IR(addr)

t1 : MBR ← M[MAR]

t2 : AC ← MBR

 

t0 : IR에 적재된 명령어의 오퍼랜드인 주소(addr)를 MAR을 통해 기억장치로 보냄. 

t1 : 그 주소가 지정하는 기억 장소로부터 데이터를 인충해 MBR에 저장.

t2 : AC 레지스터에 적재함. 

 

② 데이터 저장. 

STA addr

: AC 레지스터의 내용을 기억장치에 저장. 

 

t0 : MAR  IR(addr)

t1 : MBR ← AC

t2 : M[MAR]MBR

 

t0 : 데이터를 저장할 기억 장소의 주소를 MAR로 보냄. 

t1 : 저장할 데이터를 MBR로 이동시킴. 주소와 데이터가 모두 기억장치로 보내짐.

t2 : 주소가 지정하는 기억 장소에 데이터가 저장됨. 

 

③ 데이터 처리를 위한 명령어. 

ADD addr

: 기억장치에 저장된 데이터를 AC 레지스터의 내용과 더하고, 그 결과를 다시 AC 레지스터에 저장. 

 

t0 : MAR  IR(addr)

t1 : MBR ← M[MAR]

t2 : AC ← AC + MBR

 

t0 : 명령어의 오퍼랜드를 주소 버스를 통해 기억장치로 보냄. 

t1 : 해당 기억 장소로부터 데이터를 인출해 MBR에 적재함. 

t2 : 데이터와 AC 레지스터의 내용을 더하고, 그 결과값을 AC 레지스터에 저장함. 

 

④ 프로그램 제어. 

명령어 실행 순서는 프로그램 카운터에 의해 자동적으로 순서가 결정됨.

 

분기(branch) 명령어 

: 현재 PC 내용이 가리키는 위치가 아닌 다른 위치의 명령어로 실행 순서를 바꾸도록 해주는 명령어. 

 

JUMP addr

: 기억장치에 저장된 데이터를 AC 레지스터의 내용과 더하고, 그 결과를 다시 AC 레지스터에 저장. 

 

t0 : PC  IR(addr)

 

t0 : 오퍼랜드는 분기 목적지 주소(branch target address)를 가리키기 때문에, 주소를 PC로 적재하기만 하면 됨.

주소가 가리키는 기억 장소로부터 명령어가 인출되므로, 명령어 실행 순서가 바뀌게 됨.

 

- 인터럽트 사이클 - 

인터럽트(interrupt) 

: CPU로 하여금 현재 진행중인 프로그램 처리를 중단하고 다른 프로그램을 처리하도록 요구하는 메커니즘으로서, CPU와 외부장치들 간의 상호작용을 위하여 필요한 기능.

 

인터럽트 서비스 루틴(ISR)

: 인터럽트 요구를 처리해주기 위해 수행하는 프로그램 루틴.

 

인터럽트 요구가 들어왔을 경우, 

CPU는 인터럽트 요구를 인식하고, 어떤 장치가 요구를 했는지 확인하여 해당 인터럽트 서비스 루틴을 수행하고, 중단했던 프로그램을 다시 수행해야 함. 

CPU는 명령어의 실행 사이클을 종료하고 다음 명령어를 위한 인출 사이클을 시작하기 전에, 인터럽트 요구 신호가 들어왔는지 검사해야 함.

① 다음에 실행할 명령어의 주소를 가리키는 현재의 PC 내용을 스택에 저장.

인터럽트 처리를 한 후 복귀할 주소를 저장하는 절차.

② 해당 인터럽트 서비스 루틴을 호출하기 위해 그 루틴의 시작 주소를 PC에 적재함.

이때 시작 주소는 인터럽트를 요구한 장치로부터 전송되거나 미리 정해진 값으로 결정됨. 

 

인터럽트 사이클(interrupt cycle) 

: 인터럽트 요구가 들어왔는지 검사하고, 그 처리에 필요한 동작들을 수행하는 과정. 

 

인터럽트 가능(interrupt enabled) 

: 인터럽트를 받을 수 있는 상태.

인터럽트 불가능(interrupt disabled)

: 인터럽트를 받을 수 없는 상태. 

 

t0 : MBR ← PC

t1 : MAR ← SP, PC ISR의 시작 주소

t2 : M[MAR] ← MBR, SP SP - 1

 

스택 포인터(stack pointer : SP)

: 스택의 최상위 주소를 저장하고 있는 레지스터. 

일반적으로 스택으로는 주기억장치의 끝 부분이 사용되기 때문에, XP의 초깃값은 주기억장치의 마지막 주소로 세트됨. 

 

t0 : PC의 내용이 MBR로 보내짐. 

t1 : SP의 내용이 MAR을 통해 주소 버스로 나가게 되고, PC에는 인터럽트 서비스 루틴의 시작 주소가 적재됨. 

t2 : MBR에 저장되어 있던 원래의 PC 내용을 스택에 저장하며, 동시에 SP의 내용을 1 감소시켜 TOSㅇ의 주소를 수정함. 

 

다중 인터럽트(multiple interrupt)

: 인터럽트 서비스 루틴을 수행하고 있는 동안에 다른 장치로부터 인터럽트가 들어오는 경우. 

 

다중 인터럽트 처리 방법

① 인터럽트 불가능 상태일 때 CPU가 인터럽트 요구 신호를 검사하지 않음. 

루틴을 처리하는 동안에 발생한 인터럽트 요구는 대기 상태로 남아 있다가, CPU가 다시 인터럽트 가능 상태로 바뀐 후에 인식함. 

② 인터럽트 요구들 간에 우선순위를 정하고, 우선순위가 낮은 인터럽트 요구를 처리하고 있는 동안에 우선순위가 더 놓은 인터럽트 요구가 들어오면 현재의 인터럽트 서비스 루틴 수행을 중단하고 새로운 인터럽트를 처리. 

이렇게 할 경우, 첫 번째 인터럽트 서비스 루틴으로 복귀하는 데 사용될 주소도 저장되어야 함.

 

- 간접 사이클 - 

간접 사이클(indirect cycle)

: 실행 사이클에서 사용될 데이터의 실제 주소를 기억장치로부터 읽어오는 과정. 

 

t0 : MAR IR(addr)

t1 : MBR ← M[MAR]

t2 : IR(addr) MBR

 

인출 사이클에서 읽혀져 IR에 적재되어 있는 명령어의 주소 필드 내용을 다시 기억장치로 보내, 데이터의 실제 주소를 인출하여 IR의 주소 필드에 저장.

댓글