ch02. CPU 구조와 기능
-CPU 기본 동작 : 기억장치에 저장된 명령어( 프로그램 코드)를 실행하는 ‘프로그램 수행’
-CPU가 프로그램 수행을 위해 해야 하는 세부 동작 5가지
[CPU 세부 동작 기능] (5)
1) 명령어 인출 : 기억장치로부터 명령어 읽어옴
2) 명령어 해독 : 수행할 동작 결정 위해 명령어 해독
// 모든 명령어에 공통 수행 동작
3) 데이터 인출 : 동작 수행 시 필요한 데이터 (기억장치 OR I/O장치)에서 읽어옴
4) 데이터 처리 : 데이터에 산술,논리 연산 수행
5) 데이터 저장 : 수행한 결과 데이터를 저장
// 필요에 따라 수행 동작
2-1. CPU 기본 구조
[CPU 내부 구성 요소] (3)
1) ALU (산술논리연산장치)
: 산술,논리 연산 수행 회로들로 구성된 하드웨어 모듈
2) 레지스터 : CPU 내부에 위치한 기억장치
: 기억장치 중 가장 속도 빠르다
-일반 목적 레지스터
-특수 목적 레지스터
3) 제어 유니트
: 명령어 프로그램 코드 해석 후 동작 수행 위한 제어신호 순차 발생시키는 하드웨어 모듈
+ ) CPU 내부 버스
: 데이터와 제어신호전송통로, CPU 내부 구성 요소 간 통로
: 내부 버스 선들은 외부 시스템 버스와 직접 연결X
: 반드시 버퍼 레지스터 OR 인터페이스 회로 통하여 시스템 버스와 연결됨
2-2. 명령어 실행
-CPU는 기억장치에 저장된 명령어 인출 후 실행 처리 작업 수행
[명령어 사이클]
: CPU가 한 개의 명령어 실행에 필요한 전체 과정 사이클
시작 -> 명령어 인출 -> 명령어 실행 -> 중단
[인출 사이클] [실행 사이클]
[CPU 내부 특수 목적 레지스터] (5) : 명령어 실행 위해 필요
1) PC (Program Counter) : 프로그램 카운터
: 다음에 인출될 명령어 주소 가지고 있는 레지스터
: 각 명령어 인출된 후 자동 일정 크기증가
2) AC (Accumulator) : 누산기
: 연산에 사용될 데이터 일시적 저장하는 레지스터
3) IR (Instruction Register) : 명령어 레지스터
: 가장 최근 인출된 명령어 저장된 레지스터
4) MAR (Memory Address Register) : 기억장치 주소 레지스터
: PC에 저장된 명령어 주소가 시스템 주소버스 가기 전에 일시적 (저장) 경유 주소 레지스터
: MAR은 CPU 내부 주소 버스 <-> 외부 시스템 주소 버스 사이에서 주소 버퍼 역할
5) MBR (Memory Buffer Register) : 기억장치 버퍼 레지스터
: 기억장치에 저장될/ 기억장치로부터 읽혀진 ‘데이터’가 일시(저장) 경유되는 버퍼 레지스터
: MBR은 CPU 내부 데이터 버스 <-> 외부 시스템 데이터 버스 사이에서 데이터 버퍼 역할
*버퍼 : 메모리 간 속도 차이 줄이기 위해 존재
(1) [인출 사이클]
: CPU가 PC 내용(다음 주소) 토대로 기억장치 속 특정 위치의 명령어 읽어오는 과정
: PC -> 최종 IR에 적재
t0 :MAR <- PC
t1 :MBR <- MAR , PC <- PC + 1
t2 :IR <- MBR
1클록 주기 = 1ns
인출 사이크 클록 개수 : 3개 (t0, t1, t2)
인출 시간 = 1ns X 3 = 3ns
(2) [실행 사이클]
: CPU가 명령어 해독 후, 그에 필요한 연산 수행하는 과정
: 실행 사이클에서는 명령어 종류에 따라 ‘마이크로 연산’이 달라지므로 분류해서 보자
<CPU 수행 연산 종류 (4) >
(1) 데이터 이동 : CPU <-> 메모리 사이/CPU <-> I.O장치 사이 ‘데이터 이동’
(2) 데이터 처리 : 데이터에 대한 연산 수행
(3) 데이터 저장 : 데이터를 기억장치[M]에 저장
(4) 프로그램 제어 : 프로그램 실행 순서 결정
[[ 실행 사이클 종류 (4) ]]
① 데이터 이동 (실행 사이클)
: 데이터 이동 (addr 속 내용) -> AC
: IR -> 최종 AC 로 데이터 이동
Load (addr) 명령어 실행 : Load(이동)
t0: MAR <- IR(addr) // 인출 사이클에서 IR에 적재된 명령어 주소를 MAR 거쳐 M으로 보냄
t1: MBR <- M(MAR) // 기억장치 속 주소에서 데이터 인출 후 MBR로 보냄
t2: AC <- MBR //MBR에서 AC 데이터 누산기로 데이터 적재
② 데이터 저장 (실행 사이클)
: IR(주소) -> AC(데이터) -> 최종 M(기억장치)에 데이터 저장
STA(addr) 명령어 실행 : STA (storage) 저장
t0: MAR <- IR(addr) //데이터 저장할 주소 내용 MAR 거쳐서 M(기억장치)로 보냄
t1: MBR <- AC // AC 속 데이터를 MBR 거쳐서 M(기억장치)로 보냄
t2: M[MAR] <- MBR // 결과적으로 주소, 데이터 모두 기억장치에 보내진 상태인데,
기억장치 속에 저장해둔 주소 내용과 저장할 데이터 내용 모두 읽고 그 주소에 데이터 내용을 저장시킴
③ 데이터 처리 (실행 사이클)
: IR -> 데이터 연산 결과값 -> 최종 AC에 적재
ADD(addr) 명령어 실행
t0: MAR <- IR(addr) // 연산 대상 데이터의 주소를 M으로 보냄
t1: MBR <- M(MAR) // M의 해당 주소에서 연산할 데이터 인출 후 MBR로 보냄
t2: AC <- AC + MBR //MBR 속 데이터와 기존 AC의 데이터를 ALU에 보내 연산 처리 후
-> 연산 결과값은 다시 AC에 결과 적재
④ 프로그램 제어(분기 명령어)
: 보통 명령어들은 순서대로 PC 내용 읽어서 차례로 실행된 후, PC+! 시킴
만약 다른 위치로 분기시켜서 프로그램 실행 순서 바꿀 경우 ‘분기 명령어’ 사용
JUMP(addr) 명령어 실행
t0: PC <-IR(addr) // 다음 실행 주소 저장하는 PC에 분기될 주소 넣어
현재 실행 마친 뒤 다음 실행이 분기 주소에서 이루어지도록 함
[어셈블리 프로그램 실행 과정 예시]
*어셈블리 = 중간 언어
*임의로 코드 지정 : LOAD = 1, STORE = 2, ADD = 5, JUMP = 8
PC(100) 1250 : 기억장치 250번지 내용을 AC에 적재 후, : LOAD (250)
PC(101) 5251 : 기억장치 251번지 내용과 더하고, (ADD) : ADD (251)
PC(102) 2251 : 결과값을 251번지에 저장 후, (STA) : STA(251)
PC(103) 8170 : 170번지로 점프하는 프로그램 (JUMP) : JUMP(170)
[단계 1] : LOAD 명령어 인출
:현재 PC는 첫 번째 명령어(1250)를 100번지에 갖고 있다. 1250 = Load(250)
PC 100번지의 내용인 ‘LOAD’ 명령어 인출되어 IR(명령어 레지스터)에 적재된다.
[단계 2] : LOAD 명령어 실행
: IR에 적재된 명령어 해독하여 250번지 속 데이터를 AC로 이동시켜서 LOAD 실행 완료
: PC 내용은 다음 실행을 위해 +1 증가되어 101번지 가리키게 된다.
[단계 3] : ADD 명령어 인출
: 현재 PC는 두 번째 명령어(5251)를 101번지에 갖고 있다. 5251 = ADD(251)
PC 101번지의 내용인 ‘ADD’명령어 인출되어 IR에 적재된다.
[단계 4] : ADD 명령어 실행
: IR에 적재된 명령어 해독하여 251번지의 내용 + AC 내용 (ALU에서 연산 ) 후,
연산결과를 다시 AC에 적재시켜 ADD 실행 완료
: PC 내용은 다음 실행을 위해 +1 증가되어 102번지 가리키게 된다.
[단계 5] : STA 명령어 인출
: 현재 PC는 세 번째 명령어(2251)를 102번지에 갖고 있다. 2251 = STA(251)
PC 102번지의 내용인 ‘STA’명령어 인출되어 IR에 적재된다.
[단계 6] : STA 명령어 실행
: IR에 적재된 명령어 해독하여 현재 AC내용 -> M[251번지]에 저장시켜 STA 실행 완료
: PC 내용은 다음 실행을 위해 +1 증가되어 103번지 가리키게 된다.
[단계 7] : JUMP 명령어 인출
: 현재 PC는 네 번째 명령어(8170)를 103번지에 갖고 있다. 8170 = JUMP(170)
PC 103번지의 내용인 ‘JUMP’명령어 인출되어 IR에 적재된다.
[단계 8] : JUMP 명령어 실행
:IR에 적재된 명령어 해독하여 분기 목적 주소 170번지를 PC내용에 저장. JUMP 실행 완료
이 다음 실행 시 PC내용에 저장된 분기 주소로 가서 실행 시작
(3) [인터럽트 사이클]
인터럽트 사이클
:인터럽트 요구 신호 검사하고 현재 PC내용은 복귀주소로서 스택에 저장한 후
인터럽트 ISR 시작 주소를 PC내용에 적재시키는 과정
: CPU가 순차적으로 프로그램 수행하는 도중//
외부에서 ‘인터럽트 요구’가 들어오면 CPU는 기존 프로그램 수행까지만 수행한 뒤 ,
인터럽트 요구를 우선 처리하기 위해 ISR(인터럽트 서비스 루틴) 프로그램 우선 수행한다.
: 이후 인터럽트 처리 끝나면 CPU는 기존 프로그램으로 복귀하여 기존 수행 지속한다.
t0: MBR <- PC //현재 PC내용(복귀주소) 데이터 취급하여 MBR로 보냄
t1: MAR <- SP, PC <- ISR 시작 주소 //현 SP가 가리키는 스택 주소를 MAR로 보냄
// 동시에 ISR 시작 주소는 비어있는 PC 내용에 보냄
t2: M[MAR] <- MBR, SP <- SP-1 //MBR 속 복귀주소를 MAR 속 스택 주소에 임시 저장
// 동시에 SP는 다음 수행 위해 SP-1 처리
[스택 VS SP(스택 포인터) ]
스택 : 주기억장치의 특정 부분에 위치
: 메인 메모리의 일부분을 따와서 아래부터 차례로 데이터 저장
SP : CPU 내부 레지스터 중 하나
: 스택의 최상위 주소 가리키며, CPU 내부 특수 목적 레지스터 중 하나
+ [다중 인터럽트]
인터럽트 서비스 루틴 실행 도중에 또 인터럽트 요구가 중복되어 들어온 경우
<다중 인터럽트 처리방법 (2) >
1) 인터럽트 불가능 상태로 만듦
: 새로운 인터럽트 요구 들어오더라도 인터럽트 불가능 상태로 만들어두면
인터럽트 사이클 수행 X
2) 인터럽트 우선순위 정함
: 우선순위 높은 인터럽트 우선 수행
: 우선순위 동일한 경우에는 먼저 수행하던 인터럽트 처리 후 나중 인터럽트 처리
(4) [간접 사이클]
: 인출 사이클에서 읽어온 주소 속에 간접 주소 저장된 경우에 한해서 실행되는 사이클
: 실행 사이클에서 사용될 실제 데이터의 주소를 기억장치로부터 읽어오는 사이클
: 인출 사이클과 실행 사이클 사이에 존재
t0: MAR <- IR(addr) //간접 주소 MAR로 보냄
t1: MBR <- M[MAR] //MAR 따라가 기억장치 속 실제 주소값 읽어 MBR 보냄
t2: IR(addr) <-MBR //MBR 속 실제 주소값을 다시 IR에 적재
2-3. 명령어 파이프라이닝
*파이프라인 : 기존 하드웨어 쪼개서 속도향상 도모
[명령어 파이프라이닝] : 속도 향상 목적 CPU 성능 높이는 기술
: 명령어 실행에 사용되는 하드웨어를 여러 개의 독립적인 단계로 분할시켜
각 단계들이 병렬로 동시 수행되도록 만든다.
(동시에 서로 다른 명령어 처리 가능해져서 속도 향상 가능케 하는 기술)
(1) 2단계 명령어 파이프라인
[문제점]
: 명령어의 인출과 실행 처리 시간 동일한 경우에 한해서만 속도향상이 가능
: 만약 처리시간 동일하지 않다면 되려 파이프라인 효율 저하
[해결책]
: 파이프라인 단계 수를 증가시켜 각 단계 처리시간을 같게 만들어준다.
: 처리 시간이 더 긴 파이프라인 단계를 여러 개로 분할함으로써
단계들의 처리시간 거의 같도록 만드는 것
(2) 4단계 명령어 파이프 라인
-명령어 인출(IF) 단계 : 다음 명령어를 기억장치로부터 인출
-명령어 해독(ID) 단계 : 해독기 이용하여 명령어 해독
-오퍼랜드 인출(OF) 단계 : 기억장치로부터 오퍼랜드 인출
-실행(EX) 단계 : 지정된 연산 수행
[파이프라인에 의한 전체 명령어 실행 시간]
- 파이프라인 단계 수 : K개
실행할 명령어들의 수 : N개
(가정: 각 파이프라인 단계가 한 클럭 주기씩 걸린다고 가정하자 )
< 전체 명령어 실행 시간 Tk > : 파이프라인 O
Tk = k + (N – 1)
: 첫 번째 명령어 실행 시 k주기 걸리지만,
나머지 (N=1) 개 명령어들은 한 주기마다 실행이 끝나기 때문.
< 기본 명령어 실행 시간 T1> : 파이프라인 X
T1 = k X N
< 파이프라인 사용에 의한 속도 향상 Sp>
Sp = T1 / Tk =
[파이프라인 효율 저하 원인]
: 이론 상의 속도 효율이 그대로 나타나지 않는 요인
① 모든 명령어들이 파이프라인 단계들을 모두 거치지는 않는다.
ex. 어떤 명령어의 경우, 오퍼랜드 인출할 필요가 없는데 파이프라인 단순화시키기 위해
불필요하게 소모되는 시간 발생
② 파이프라인의 클록은 처리 시간이 가장 오래 걸리는 단계를 기준으로 결정한다.
즉, 시간 소모 가져옴 (-> 해결법 : 슈퍼파이프라이닝 )
③ IF단계와 OF단계가 동시에 기억장치 액세스할 경우, ‘기억장치 충돌’ 발생되어 지연된다
동시 액세스 불가능하기 때문에 하나는 지연이 불가피
(-> 해결법 : 캐시)
④ 중간에 ‘조건분기’ 명령어 실행되면 미리 인출하여 처리해둔 명령어들이 무효화된다.
[분기 발생에 의한 성능 저하 최소화 방법]
① 분기 예측
: 분기 언제 일어날 것인지 미리 예측하여 어느 경로의 명령어 인출할지 미리 결정하는 방법
② 분기 목적지 선인출
: 조건 분기가 인식되면, 분기명령어의 다음 명령어 뿐 아니라,
분기의 목적지 명령어도 함께 인출하는 방법
③ 루프 버퍼 사용
: 파이프라인의 명령어인출 단계에 포함되어 있는 ‘작은 고속 기억장치’인 루프 버퍼에
가장 최근 인출된 n개 명령어 순서대로 젖아해두는 방법
④ 지연 분기
: 프로그램 내부 분기 명령어 위치를 재배치함으로써 파이프라인 성능 개선하는 방법
[상태 레지스터]
: 조건 분기 명령어가 사용할 조건 플래그들 저장 R 레지스터
: 플래그 통해서 CPU 내의 상태를 보여주는 장치
*플래그 : 조건 상태 나타내는 비트
부호(S) 플래그 : 직전 수행된 산술연산 결과값의 부호비트에 ( + : 0// - : -1) 저장
제로(Z) 영 플래그 : 연산 결과값이 0이면 플래그를 1로 세팅
올림수(C) 플래그 : 올림수 발생시 플래그 1로 세팅
동등(E) 플래그: 두 수 비교한 결과
(A-B = 0) 두 수 같게 나왔을 경우 플래그 1로 세팅
오버플로그(V) 플래그 : 산술 연산 과저에서 오버플로우(에러) 발생 시 플래그 1로 세팅
인터럽트(I) 플래그
인터럽트 가능 상태 : 0 세팅
인터럽트 불가능 상태 : 1 세팅
-슈퍼바이저(P) 플래그 : CPU 실행모드가 슈퍼바이저 모드이면 1로 세팅
사용자 모드이면 0 세팅
(3) 슈퍼스칼라
: CPU 처리 속도 더욱 높이기 위해
내부에 여러 개의 명령어 파이프라인들을 덧붙여 포함시킨 구조 \
파이프라인 수 = m개
-> m-wqy 슈퍼스칼라 로 부름
<일반 파이프라인 실행> : 단일 파이프라인
<2-way 슈퍼스칼라 실행> : 파이프라인 2개씩 덧붙임
N : 실행할 명령어의 수
K : 주기
m: 파이프라인 수
< 단일 파이프라인 실행 시간 T1>
T1 = k + (N – 1)
<m-wqy 슈퍼스칼라 실행 시간 Tk>
Tk = k + (N-m / m)
< 슈퍼스칼라에 의한 속도향상 Sp >
Sp = T1 / Tm =
(4) 멀티-코어
: CPU 코어 여러 개를 하나의 칩에 넣은 것
ex) 칩에 2개 코어 삽입 : 듀얼-코어 프로세서
ex) 칩에 4개 코어 삽입 : 쿼드-코어 프로세서
: 각 CPU 코어는 별도의 하드웨어 모듈로 구현된 하나의 칩에 포함되는데,
각 CPU 코어는 프로그램 실행 독립적 수행하여 동시 처리 가능 O
*CPU 코어 (ex. ALU, 레지스터 세트 등)
: CPU 칩 내부 회로 중에서 명령어 실행에 반드시 필요한 핵심 부분들로 이루어진 하드웨어 모듈
2-4. 명령어 세트
[명령어 세트]
: 어떤 CPU를 위해 정의되어 있는 명령어들의 집합
<명령어 세트 설계 위해 결정되어야 할 사항들>
① 연산 종류 : CPU 가 수행할 연산들의 종류
② 데이터 유형 : 연산 수행될 데이터 유형
③ 명령어 형식 : 명령어 길이
④ 주소지정 방식: 오퍼랜드 주소 지정 방식
(1) 연산의 종류
① 이동
- 데이터 전송
: 레지스터와 레지스터 간, 레지스터와 기억장치 간, 기억장치와 기억장치 간
데이터를 이동하는 동작
- 입출력(I/O)
: CPU와 외부(I/O장치) 간 데이터 이동하는 동작
② 연산
- 산술 연산 : 기본 연산
- 논리 연산 : AND/OR/NOT 논리 연산
③ 제어
-프로그램 제어 : 명령어 실행 순서 바꾸는 연산 ex분기연산, 서브루틴 호출
CALL : 현재 PC 내용 복귀주소로 스택에 저장시키고 호출 주소로 가서 모두 실행 후//
RET : 스택 Pop 연산해서 복귀 주소 가져와서 복귀
(2) 명령어 형식
op코드 | 오퍼랜드 | 다음주소 |
<명령어 형식 기본 요소>
연산코드 (op코드) : 수행될 연산 지정 (ex. LOAD, ADD ...)
오퍼랜드 : 연산 수행에 필요한 데이터의 주소
다음 명령어 주소 : 현재 명령어 실행 이후, 다음 인출할 명령어 위치
(3) 주소 지정 방식
: 명령어 실행에 필요한 오퍼랜드(데이터)의 주소 결정하는 방식
직접, 간접 / 묵시적, 즉시 / 레지스터, 레지스터 간접 / 변위 주소 지정
① 직접 주소지정 방식
: 명령어 내 오퍼랜드 필드 내용 = 실제 데이터 주소 그대로 저장됨
EA = A
(장점) : 데이터 인출 시 1번만 액세스
(단점) : 연산코드 제외하고 남은 비트만으로 주소비트 사용 가능하기에
직접 지정할 수 있는 기억장소의 수는 제한된다.
② 간접 주소지정 방식
: 명령어 내 오퍼랜드 필드 내용 = 간접 주소 저장됨
EA = (A)
(장점) : 주소 지정 가능한 기억장치 용량이 확장됨
(단점) : 액세스 2번 필요함
③ 묵시적 주소지정 방식
: 명령어 실행에 필요한 데이터의 위치가 이미 묵시적으로 정해져 있는 방식
(장점) : 오퍼랜드가 없거나 1개 뿐이므로 명령어 길이 짧다
(단점) : 명령어 종류 제한된다.
④ 즉시 주소지정 방식
: 명령어 내 오퍼랜드 필드 내용 = 실제 데이터 자체를 저장
: 메모리 갈 필요 없이 데이터를 명령어 코드 자체에 포함하고 있다.
(장점) : 데이터 인출을 위해 메모리에 갈 필요X. 실행 사이클 단축된다.
(단점) : 사용할 수 있는 상수값의 크기는 제한됨
-> 오퍼랜드 필드에 실제 데이터 저장시키므로 배정되는 비트 수 제한
⑤ 레지스터 주소지정 방식
: 연산에 사용될 데이터가 내부 레지스터에 저장되어 있음
: 명령어의 오퍼랜드 내용 = 해당 레지스터 번호 저장
EA = R
(장점) ; 레지스터는 CPU 내부에 있기 때문에 굳이 메모리까지 들릴 이유 X,
: 명령어 실행 시간 짧아진다.
(단점) : 데이터 저장될 수 있는 위치가 CPU 내부 레지스터로 제한된다.
⑥ 레지스터 간접 주소지정 방식
: 오퍼랜드 필드가 가리키는 지정된 레지스터 내용을
다시 유효주소로 활용하여 기억장치에 가서 실제 데이터 인출하는 방식
EA = (R)
(장점) : 주소 지정 영역이 앞선 방식에 비해서는 확장됐다.
⑦ 변위 주소지정 방식
: ‘기준 주소’ 기준으로 상대적 위치 나타냄
: 직접 주소지정 방식과 레지스터 간접 주소지정 방식 조합하여 ‘유효주소’를 결정하는 방식
i) 상대 주소지정 방식
: PC 레지스터 사용
-> PC 내용 + 변위 A 더하여 ‘유효주소’ 결정
EA = (PC) + A
ii) 인덱스 주소지정 방식
: IX(인덱스) 레지스터 사용
: 주요 용도 = 배열 데이터 액세스
-> IX 내용 + 변위 A 더하여 ‘유효주소’ 결정
EA= A + (IX)
iii) 베이스-레지스터 주소지정 방식
: BR(베이스) 레지스터 사용
: 주요 용도 = 프로그램 시작 위치 지정
-> BR 내용 + 변위 A 더하여 ‘유효주소’ 결정
EA = (BR) + A
'[CS] 전공 공부 모음 > [학교] 생능_컴퓨터구조론' 카테고리의 다른 글
[+논리회로]_노트필기정리본 (0) | 2021.08.24 |
---|---|
[+논리회로]_ppt 정리본 (0) | 2021.08.24 |
[컴퓨터구조론_생능] ch01 개념정리 (0) | 2021.08.23 |
6장. 생능_컴퓨터구조론_연습문제 (0) | 2021.07.27 |
5장. 생능_컴퓨터구조론_연습문제 (2) | 2021.07.27 |