Lecture #2 제2장 CPU의 구조와 기능(1)
강의 목차 2.1 CPU의 기본 구조 2.2 명령어 실행 2.3 명령어 파이프라이닝 2.4 명령어 세트
CPU의 기능 (1) CPU는 기억장치에 저장되어 있는 명령어들을 읽어와 실행하는 과정을 반복하면서 ‘프로그램 수행’이라는 컴퓨터의 기본적인 기능을 수행 명령어 인출(Instruction Fetch) : 기억장치로부터 명령어를 읽어온다 명령어 해독(Instruction Decode) : 수행해야 할 동작을 결정하기 위하여 인출된 명령어를 해독한다 모든 명령어들에 대하여 공통적으로 수행 Computer Architecture
CPU의 기능 (2) 데이터 인출(Data Fetch) : 명령어 실행을 위하여 데이터가 필요한 경우에는 기억장치 또는 입출력장치로부터 그 데이터를 읽어온다 데이터 처리(Data Process) : 데이터에 대한 산술적 또는 논리적 연산을 수행 데이터 쓰기(Data Store) : 수행한 결과를 저장 명령어에 따라 필요한 경우에만 수행 Computer Architecture
2.1 CPU의 기본 구조 산술논리연산장치(Arithmetic and Logical Unit: ALU) 레지스터 세트(Register Set) 제어 장치(Control Unit) Computer Architecture
CPU의 내부 구성요소 (1) ALU(Arithmetic Logic Uint) 레지스터 세트 (Register Set) 각종 산술 연산과 논리 연산 등을 수행하는 회로들로 이루어진 하드웨어 모듈 산술 연산 : +, -, ×, ÷ 논리 연산 : AND, OR, NOT, XOR 등 쉬프트 연산 레지스터 세트 (Register Set) CPU 내부에 위치한 기억장치 컴퓨터의 기억장치들 중에서 액세스 속도가 가장 빠름 구현 회로가 복잡하여 레지스터들의 수가 제한됨 레지스터 종류 제어용 레지스터 – 명령어 실행 과정 제어에 필요한 정보를 저장 일반 산술용 레지스터 – 명령어 실행에 필요한 데이터나 계산 결과를 임시적으로 저장 Computer Architecture
CPU의 내부 구성요소 (2) 제어 장치(Control Unit) 내부 CPU 버스(internal CPU bus): 프로그램 코드(명령어)를 해석하고, 그것을 실행하기 위한 제어 신호들(control signals)을 순차적으로 발생하는 하드웨어 모듈 CPU에서 지원하는 명령어 집합의 복잡도에 따라 구현 회로의 복잡도가 결정 마이크로프로그래밍(Microprogramming) – 명령어 실행 제어 동작을 소프트웨어 방식으로 처리하여 회로 복잡도를 줄이는 기법 내부 CPU 버스(internal CPU bus): ALU와 레지스터들 간의 데이터 이동을 위한 데이터 선들과 제어 장치로부터 발생되는 제어 신호 선들로 구성된 내부 버스 외부의 시스템 버스들과는 직접 연결되지 않으며, 반드시 버퍼 레지스터들 혹은 시스템 버스 인터페이스 회로를 통하여 시스템 버스와 접속 Computer Architecture
2.2 명령어 실행 CPU는 기억장치에 저장되어 있는 명령어를 인출하여 실행하는 사이클을 반복하면서 프로그램을 실행 명령어 사이클 (instruction cycle) CPU가 한 개의 명령어를 실행하는 데 필요한 전체 처리 과정 CPU는 전원이 인가되거나 Reset된 순간부터 전원을 끄거나 회복 불가능한 오류가 발생하여 중단될 때까지 명령어 실행 사이클을 반복 부사이클(subcycle) 인출 사이클(fetch cycle) : CPU가 기억장치로부터 명령어를 읽어오는 단계 실행 사이클(execution cycle) : 명령어를 실행하는 단계 Computer Architecture
기본 명령어 사이클 Computer Architecture
명령어 실행 관련 CPU 레지스터(1) 프로그램 카운터(Program Counter: PC) 다음에 인출할 명령어의 주소를 가지고 있는 레지스터 각 명령어가 인출된 후에는 자동적으로 일정 크기(한 명령어 길이)만큼 증가 분기(branch) 명령어가 실행되는 경우에는 목적지 주소로 갱신 명령어 레지스터(Instruction Register: IR) 가장 최근에 인출된 명령어 코드가 저장되어 있는 레지스터 누산기(Accumulator: AC) 데이터를 일시적으로 저장하는 레지스터 레지스터의 크기는 CPU가 한 번에 처리할 수 있는 데이터 비트 수(단어 길이) Computer Architecture
명령어 실행 관련 CPU 레지스터(2) 기억장치 주소 레지스터(Memory Address Register: MAR) PC에 저장된 명령어 주소가 시스템 주소 버스로 출력되기 전에 일시적으로 저장되는 주소 레지스터 기억장치 버퍼 레지스터(Memory Buffer Register: MBR) 기억장치에 쓰여질 데이터 혹은 기억장치로부터 읽혀진 데이터를 일시적으로 저장하는 버퍼 레지스터 Computer Architecture
데이터 통로가 표시된 CPU 내부 구조 주요 레지스터들과 데이터 통로가 표시된 CPU 구조 Computer Architecture
2.2.1 인출 사이클 (1) 인출 사이클(Fetch Cycle) 명령어 사이클의 시작 단계에서 프로그램 카운터(PC) 가 가리키는 기억장치의 위치로부터 명령어를 인출하여 명령어 레지스터(IR)에 저장한다 다음 명령어 인출을 위해 PC 값을 인출된 명령어 길이 만큼 증가시킨다 Computer Architecture
RTL(Register Transfer Language) 인출 사이클 (2) RTL(Register Transfer Language) 인출 사이클의 마이크로 연산 t0 : MAR PC t1 : MBR M[MAR], PC PC + 1 t2 : IR MBR 단, t0, t1 및 t2는 CPU 클럭의 주기 [첫번째 주기] 현재의 PC 내용을 CPU 내부 버스를 통하여 MAR로 전송 [두번째 주기] 그 주소가 지정하는 기억장치 위치로부터 읽혀진 명령어가 데이터 버스를 통하여 MBR로 적재되며, PC의 내용에 1을 더한다 [세번째 주기] MBR에 있는 명령어 코드가 명령어 레지스터인 IR로 이동 (예) CPU 클럭 = 100㎒ (클럭 주기 = 10㎱) 인출 사이클 : 10㎱ x 3 = 30㎱ 소요 Computer Architecture
인출 사이클의 주소 및 명령어 흐름도 Computer Architecture
2.2.2 실행 사이클 CPU는 실행 사이클 동안에 명령어 코드를 해독(decode)하고, 그 결과에 따라 필요한 연산들을 수행 CPU가 수행하는 연산들의 종류 데이터 이동 : CPU와 기억장치 간 혹은 I/O장치 간에 데이터를 이동 데이터 처리 : 데이터에 대하여 산술 혹은 논리 연산을 수행 데이터 저장 : 연산 결과 데이터 혹은 입력장치로부터 읽어 들인 데이터를 기억장치에 저장 제어 : 프로그램의 실행 순서를 결정 실행 사이클에서 수행되는 마이크로-연산들은 명령어에 따라 달라진다 Computer Architecture
기본적인 명령어 형식의 구성 연산 코드(Operation Code) 오퍼랜드(Operand) CPU가 수행할 연산을 지정 명령어 실행에 필요한 데이터가 저장된 주소(addr) Computer Architecture
[사례 1] LOAD addr 명령어 기억장치에 저장되어 있는 데이터를 CPU 내부 레지스터 AC로 이동하는 명령어 데이터 이동 명령어 실행 마이크로 연산: t0 : MAR IR(addr) t1 : MBR M[MAR] t2 : AC MBR [첫번째 주기] 명령어 레지스터 IR에 있는 명령어의 주소 부분을 MAR로 전송 [두번째 주기] 그 주소가 지정한 기억장소로부터 데이터를 인출하여 MBR로 전송 [세번째 주기] 그 데이터를 AC에 적재 Computer Architecture
[사례 2] STA addr 명령어 AC 레지스터의 내용을 기억장치에 저장하는 명령어 데이터 이동 명령어 실행 마이크로 연산: t0 : MAR IR(addr) t1 : MBR AC t2 : M[MAR] MBR [첫번째 주기] 데이터를 저장할 기억장치의 주소를 MAR로 전송 [두번째 주기] 저장할 데이터를 버퍼 레지스터인 MBR로 이동 [세번째 주기] MBR의 내용을 MAR이 지정하는 기억장소에 저장 Computer Architecture
[사례 3] ADD addr 명령어 기억장치에 저장된 데이터를 AC의 내용과 더하고, 그 결과는 다시 AC에 저장하는 명령어 산술연산 명령어 실행 마이크로 연산: t0 : MAR IR(addr) t1 : MBR M[MAR] t2 : AC AC + MBR [첫번째 주기] 데이터를 저장할 기억장치의 주소를 MAR로 전송 [두번째 주기] 저장할 데이터를 버퍼 레지스터인 MBR로 이동 [세번째 주기] 그 데이터와 AC의 내용을 더하고 결과값을 다시 AC에 저장 Computer Architecture
ADD 명령어 실행 사이클 동안의 정보 흐름 Computer Architecture
[사례 4] JUMP addr 명령어 오퍼랜드(addr)가 가리키는 위치의 명령어로 실행 순서를 변경하는 분기(branch) 명령어 제어 명령어 실행 마이크로 연산: t0 : PC IR(addr) 명령어의 오퍼랜드(분기할 목적지 주소)가 PC에 저장 다음 명령어 인출 사이클에서 그 주소의 명령어가 인출되므로 분기가 발생 Computer Architecture
어셈블리 프로그램 실행 과정 (1) 주소 명령어 기계 코드 100 LOAD 250 1250 101 ADD 251 5251 102 STA 2251 103 JUMP 170 8170 Computer Architecture
어셈블리 프로그램 실행 과정 (2) 100번지의 첫 번째 명령어 코드가 인출되어 IR에 저장 250 번지의 데이터를 AC로 이동 PC = PC + 1 = 101 Computer Architecture
어셈블리 프로그램 실행 과정 (3) 두 번째 명령어가 101번지로부터 인출되어 IR에 저장 AC의 내용과 251 번지의 내용을 더하고, 결과를 AC에 저장 PC의 내용은 102로 증가 Computer Architecture
어셈블리 프로그램 실행 과정 (4) 세 번째 명령어가 102 번지로부터 인출되어 IR에 저장 AC의 내용이 251 번지에 저장 PC의 내용은 103으로 증가 Computer Architecture
어셈블리 프로그램 실행 과정 (5) 네 번째 명령어가 103 번지로부터 인출되어 IR에 저장 분기될 목적지 주소, 즉 IR의 하위 부분(170)이 PC로 적재 (다음 명령어 인출 사이클에서는 170 번지의 명령어가 인출) Computer Architecture
2.2.3 인터럽트 사이클(interrupt cycle) 프로그램 실행 중에 CPU의 현재 처리 순서를 중단시키고 다른 동작을 수행하도록 하는 것 외부로부터 인터럽트 요구가 들어오면, CPU는 원래의 프로그램 수행을 중단하고, 요구된 인터럽트를 위한 서비스 프로그램을 먼저 수행 인터럽트 서비스 루틴(interrupt service routine: ISR) 인터럽트를 처리하기 위하여 수행하는 프로그램 루틴 Computer Architecture
인터럽트에 의한 제어의 이동 인터럽트가 들어왔을 때 CPU는 어떤 장치가 인터럽트를 요구했는지 확인하여 해당 인터럽트서비스루틴을 호출 서비스가 종료된 다음에는 중단되었던 원래 프로그램의 수행을 계속 Computer Architecture
인터럽트 처리 CPU의 인터럽트 처리 동작(Interrupt Cycle) 인터럽트 요구 신호가 대기 중이면 다음에 실행할 명령어의 주소(PC의 내용)를 스택(stack)에 저장 일반적으로 스택은 주기억장치의 특정 부분 인터럽트 서비스 루틴을 호출하기 위하여 그 루틴의 시작 주소를 PC에 적재, 이때 시작 주소는 인터럽트를 요구한 장치로부터 전송되거나 미리 정해진 값으로 결정 자세한 사항은 제7장에서 설명 인터럽트 서비스 루틴에서 필요한 레지스터들을 저장한 후에 인터럽트를 처리한다 인터럽트 처리가 종료되면 저장한 레지스터 정보를 복원한 후에 스택에 저장한 복귀 주소를 PC에 재저장 실행 중단된 프로그램의 수행을 재개 Computer Architecture
인터럽트 사이클이 추가된 명령어 사이클 Computer Architecture
인터럽트 사이클의 마이크로 연산 인터럽트 사이클의 마이크로 연산 t0 : MBR PC t1 : MAR SP, PC ISR의 시작 주소 t2 : M[MAR] MBR 단, SP는 스택 포인터(stack pointer). [첫번째 주기] PC의 내용이 MBR로 전송 [두번째 주기] SP의 내용이 MAR로 전송되고, PC의 내용은 인터럽트 서비스 루틴의 시작 주소로 변경 [세번째 주기] MBR에 저장되어 있던 원래 PC의 내용이 스택에 저장 Computer Architecture
인터럽트 사이클의 마이크로 연산 예 아래 프로그램의 첫 번째 명령어인 LOAD 250 명령어가 실행되는 동안에 인터럽트가 들어왔으며, SP = 999, 인터럽트 서비스 루틴의 시작 주소 = 650 번지라고 가정 100 LOAD 250 101 ADD 251 102 STA 251 103 JUMP 170 Computer Architecture
인터럽트 요구가 들어온 경우의 상태 변화 Computer Architecture
다중 인터럽트 (Multiple Interrupt) 인터럽트 서비스 루틴을 수행하는 동안에 다른 인터럽트가 발생하는 것 다중 인터럽트의 두 가지 처리방법 CPU가 인터럽트 서비스 루틴을 처리하고 있는 도중에는 새로운 인터럽트 요구가 들어오더라도 CPU가 인터럽트 사이클을 수행하지 않도록 방지 인터럽트 처리 시작 단계에서 인터럽트 플래그(interrupt flag)을 인터럽트 불가능(interrupt disabled) 상태로 설정하고, 종료 단계에서 다시 인터럽트 가능(interrupt enable) 상태로 설정 시스템 운영상 중요한 프로그램이나 도중에 중단할 수 없는 데이터 입출력 동작 등을 위한 인터럽트를 처리하는데 사용 인터럽트의 우선 순위를 정하고, 우선 순위가 낮은 인터럽트가 처리되고 있는 동안에 우선순위가 더 높은 인터럽트가 들어오면 현재의 인터럽트 서비스 루틴의 수행을 중단하고 새로운 인터럽트를 처리 Computer Architecture
다중 인터럽트 처리 장치 X를 위한 ISR X를 처리하는 도중에 우선 순위가 더 높은 장치 Y로부터 인터럽트 요구가 들어와서 먼저 처리되는 경우에 대한 제어의 흐름 Computer Architecture
2.2.4 간접 사이클(indirect cycle) 명령어에 포함되어 있는 주소를 이용하여, 실제 명령어 실행에 필요한 데이터를 인출하는 사이클 간접 주소지정 방식(indirect addressing mode)에서 사용 인출 사이클과 실행 사이클 사이에 위치 간접 사이클에서 수행될 마이크로-연산 t0 : MAR IR(addr) t1 : MBR M[MAR] t2 : IR(addr) MBR 인출된 명령어의 주소 필드 내용을 이용하여 기억장치로부터 데이터의 실제 주소를 인출하여 IR의 주소 필드에 저장 Computer Architecture
2.3 명령어 파이프라이닝 (Instruction Pipelining) CPU의 프로그램 처리 속도를 높이기 위하여 CPU 의 명령어 처리 과정을 여러 단계로 나누어 동시에 처리하는 기술 2-단계 명령어 파이프라인(two-stage instruction pipeline) 명령어를 실행하는 하드웨어를 인출 단계(fetch stage)와 실행 단계(execute stage)라는 두 개의 독립적인 파이프라인 모듈들로 분리 두 단계들에 동일한 클럭을 가하여 동작 시간을 일치 첫 번째 클럭 주기에서는 인출 단계가 첫 번째 명령어를 인출 두 번째 클럭 주기에서는 인출된 첫 번째 명령어가 실행 단계로 보내져서 실행되며, 그와 동시에 인출 단계는 두 번째 명령어를 인출 Computer Architecture
2-단계 명령어 파이프라인 (1) Computer Architecture
2-단계 명령어 파이프라인 (2) 2-단계 파이프라인을 이용하면 명령어 처리 속도가 두 배 향상 문제점 일반적으로 단계 수만큼의 속도 향상 문제점 두 단계의 처리 시간이 동일하지 않으면 두 배의 속도 향상을 얻지 못함(파이프라인 효율 저하) 파이프라인 단계의 수를 증가시켜 각 단계의 처리 시간을 같게 함 파이프라인 단계의 수를 늘리면 전체적으로 속도 향상도 더 높아짐 Computer Architecture
4-단계 파이프라인 (1) 명령어 인출(IF) 단계 : 다음 명령어를 기억장치로부터 인출 명령어 해독(ID) 단계 : 해독기(decoder)를 이용하여 명령어를 해석 오퍼랜드 인출(OF) 단계 : 기억장치로부터 오퍼랜드를 인출 실행(EX) 단계 : 지정된 연산을 수행 Computer Architecture
4-단계 파이프라인 (2) Computer Architecture
파이프라인에 의한 전체 명령어 실행 시간 파이프라인 단계 수 = k, 실행할 명령어들의 수 = N, 각 파이프라인 단계가 한 클럭 주기씩 걸린다고 가정 파이프라인에 의한 전체 명령어 실행 시간 : T = k + (N - 1) 첫 번째 명령어를 실행하는데 k 주기가 걸리고, 나머지 (N - 1) 개의 명령어들은 각각 한 주기씩만 소요 파이프라인 되지 않은 경우의 N 개의 명령어들을 실행 시간 : T = k × N Computer Architecture
파이프라인에 의한 속도 향상 (speedup) [예] k=4일 때, N = 100 이라면, Sp = 400/103 = 3.88 N = 1000 이라면, Sp = 4000/1003 = 3.99 N = 10000 이라면, Sp = 40000/10003 = 3.998 N ∞ 이라면, Sp = 4 Computer Architecture
파이프라인에 의한 속도 향상 예 파이프라인 단계 수 = 4이고, 파이프라인 클럭 = 1MHz (각 단계에서의 소요시간 = 1 ㎲)라면, 첫번째 명령어 실행에 걸리는 시간 = 4 ㎲ 다음부터는 매 1 ㎲ 마다 한 개씩의 명령어 실행 완료 10개의 명령어 실행 시간 = 4 + (10 - 1) = 13 ㎲ 속도향상 = (10 × 4) / 13 ≒ 3.08 배 Computer Architecture
파이프라인의 성능 저하 요인들 모든 명령어들이 파이프라인 단계들을 모두 거치지는 않는다 어떤 명령어에서는 오퍼랜드를 인출할 필요가 없다 파이프라인 하드웨어를 단순화하기 위해서는 모든 명령어가 네 단계들을 모두 통과하도록 해야 한다 OF를 위한 사이클을 필요없이 소모 파이프라인의 클럭은 처리 시간이 가장 오래 걸리는 단계가 기준이 된다 IF 단계와 OF 단계가 동시에 기억장치를 액세스하는 경우에 기억장치 충돌(memory conflict)이 일어나면 지연이 발생한다 조건 분기(conditional branch) 명령어가 실행되면, 미리 인출하여 처리하던 명령어들이 무효화된다 인터럽트가 발생하는 경우에도 유사한 결과가 초래 Computer Architecture
조건 분기가 존재하는 경우의 시간 흐름도 Computer Architecture
분기 발생에 의한 성능 저하의 최소화 방법 분기 목적지 선인출(prefetch branch target) 조건 분기가 인식되면, 분기 명령어의 다음 명령어뿐만 아니라 분기의 목적지 명령어도 함께 인출하는 방법 루프 버퍼(loop buffer) 사용 파이프라인의 명령어 인출 단계에 포함되어 있는 작은 고속 기억장치인 루프 버퍼에 가장 최근 인출된 n개의 명령어들을 순서대로 저장해두는 방법 분기 예측(branch prediction) 분기가 일어날 것인 지를 예측하고, 그에 따라 명령어를 인출하는 확률적 방법 분기 역사 표(branch history table) 이용하여 최근의 분기 결과를 참조 지연 분기(delayed branch) 분기 명령어의 위치를 재배치함으로써 파이프라인의 성능을 개선하는 방법 Computer Architecture
상태 레지스터(status register) (1) CPU의 상태 및 명령어 실행 상태 정보를 저장하는 레지스터 조건분기 명령어는 상태 레지스터의 조건 플래그(condition flag) 잉요 부호(S)플래그 직전에 수행된 산술연산 결과값의 부호 비트를 저장 영(Z) 플래그 직전에 수행한 연산 결과값이 0 이면, 1 올림수(C) 플래그 덧셈이나 뺄셈에서 올림수(carry)나 빌림수(borrow)가 발생한 경우에 1로 세트 Computer Architecture
상태 레지스터(status register) (2) 두 수를 비교한 결과가 같게 나왔을 경우에 1로 세트 오버플로우(V) 플래그 산술 연산 과정에서 오버플로우가 발생한 경우에 1로 세트 인터럽트(I) 플래그 인터럽트 가능(interrupt enabled) 상태이면 0로 세트 인터럽트 불가능(interrupt disabled) 상태이면 1로 세트 슈퍼바이저(P) 플래그 CPU의 실행 모드가 슈퍼바이저 모드(supervisor mode)이면 1로 세트, 사용자 모드(user mode)이면 0로 세트 Computer Architecture