01 프로세서 구성과 동작
[1] 컴퓨터 기본 구조와 프로세서
컴퓨터의 3가지 핵심 장치
;프로세서(Processor, CPU), 메모리, 입출력 장치
현대의 시스템 구조
; 폰 노이만이 만듦
- 메모리 내장 방식
- 프로그램 명령어 순차 실행
버스(Bus)
; 장치 간에 주소, 데이터, 제어 신호를 전송하기 위한 연결 통로(연결선)
- 내부 버스(internal bus) : 프로세서 내부의 장치 연결
- 시스템 버스(system bus) : 핵심 장치 및 주변 장치 연결
프로세서 = CPU
메모리 = 메모리
모니터, HDD, USB ... = I/O 장치
[2] 프로세서 구성 요소
산술 논리 연산 장치
; 산술 및 논리 연산 등 기본 연산을 수행
제어 장치
; 메모리에서 명령어를 가져와 해독하고 실행에 필요한 장치들을 제어하는 신호를 발생
레지스터 세트
; 프로세서 내에 존재하는 용량은 작지만 매우 빠른 메모리로 ALU의 연산과 관련된 데이터를 일시 저장하거나 특정 제어 정보 저장
- 특수 레지스터 : PC나 IR처럼 특수 목적을 위한 것
PC(Program Counter) : 다음 실행할 명령어 주소 저장
IR(Intruction Register) : 현재 실행 중이 명령어를 가짐
플래그 레지스터 : 연산 결과 정보 및 운영체제가 컴퓨터를 제어하는데 필요한 정보 저장
- 범용 레지스터 : 데이터 임시 저장
[3] 프로세서 기본 구조
; 레지스터 세트(일반적으로 1~32개), ALU, CU, 이들 장치를 연결하는 버스로 구성
데이터 경로
ALU를 이용하여 오퍼랜드를 실행하고 결과를 저장하는 부분
CU : 제어장치
ALU : 연산장치
MAR, PC, IR, 레지스터 세트, MBR : 레지스터
이를 쉽게 표현하면 아래와 같다.
ALU
; 덧셈, 뺄셈 등 연산을 수행하고, 그 결과를 누산기(Accumulator, AC)에 저장
레지스터-메모리 명령
- 메모리 워드를 레지스터로 가져옴(LOAD)
- 레지스터의 데이터를 메모리에 다시 저장
레지스터-레지스터 명령
- 레지스터에서 오퍼랜드 2개를 ALU의 입력 레지스터로 가져와 덧셈 또는 논리 AND 같은 몇 가지 연산을 수행
- 연산 결과를 레지스터 중 하나에 다시 저장
[4] 프로세서 명령 실행
1단계 : 다음에 실행할 명령어를 메모리에서 읽어 명령 레지스터(IR)로 가져온다.
2단계 : 프로그램 카운터(PC)는 그 다음에 읽어올 명령어의 주소로 변경된다.
3단계 : 제어 장치는 방금 가져온 명령어를 해독(decode)하고 유형을 결정한다.
4단계 : 명령어가 메모리에 있는 데이터를 사용하는 경우 그 위치를 결정한다.
5단계 : 필요한 경우 데이터를 메모리에서 레지스터로 가져온다.
6단계 : 명령어를 실행한다.
7단계 : 1단계로 이동하여 다음 명령어 실행을 시작한다.
이 단계를 요약하면 인출(fetch)-해독(decode)-실행(execute) 사이클로 구성되며, 이를 주 사이클(main cycle)이라고 함
실행 속도의 빠름
단순한 명령어 여러 개 < 복잡한 명령어 1개
해독기
; 고가인 고성능 컴퓨터의 복잡한 명령어를 저가 컴퓨터에서 실행 가능하게 함
제어 기억 장치
; 빠른 읽기 전용 메모리
02 산술 논리 연산 장치
; 산술 연산과 논리 연산을 처리하는 프로세서의 일부
- 주로 정수 연산을 처리
- FPU(Floating-Point Unit) : 부동 소수 연산
- 최근에는 ALU가 부동 소수 연산까지 처리(보조 프로세서를 사용하기도 함)
산술 연산
; 덧셈, 뺄셈, 곱셈, 나눗셈, 증가, 감소, 보수
논리 연산
; AND, OR, NOT, XOR, 시프트(shift)
[1] 산술 연산
- 가산기(ADD) 기반 동작
- 실제 회로에서는 캐리 전파로 일어나는 속도 지연 문제 때문에 덧셈 회로에 전가산기 대신 캐리 예측 가산기 사용
- 2진수 곱셉은 부스 알고리즘 사용
Booth Algorithm
- 피승수(곱해지는 수)와 승수(곱하는 수)를 곱한 결과는 AQ에 저장
- A와 q0은 초기값으로 0을 설정
- 연산 횟수인 n은 비트 수
예) (-7) * (+3)
-7(M) = 1001, 3(Q) = 0011
-M = 0111(1001의 2의 보수)
결론 1110 1011
[2] 논리 연산과 시프트 연산
시프트 연산
; 데이터를 좌우로 시프트
산술 시프트
; 빈자리는 부호로
논리 시프트
; 빈자리는 0으로
회전 시프트
; 로테이션
03 레지스터
; CPU가 사용하는 데이터와 명령어를 신속하게 읽어 오고 저장하고 전송
- 메모리 계층의 최상위에 존재
- 시스템에서 가장 빠른 메모리
- 주기억 장치에서 데이터를 읽어 와 레지스터에 저장 후 처리가 끝나면 주기억 장치에 결과 저장
[2] 레지스터 종류
- 메모리 주소 레지스터(MAR) : CPU가 읽고 쓰기 위한 데이터의 메모리 주소 저장
- 메모리 버퍼 레지스터(MBR) : 메모리에서 데이터를 읽거나 메모리에 저장될 명령의 데이터를 일시 저장
임시 저장된 명령어 내용 → 명령 레지스터로
데이터 내용 → 누산기 or I/O 레지스터로
- 입출력 주소 레지스터(I/O AR) : I/O장치의 주소를 지장
- 입출력 버퍼 레지스터(I/O BR) : I/O 모듈과 CPU 사이에 교환되는 데이터를 일시적으로 저장
- 프로그램 카운터(PC) : 다음에 실행할 명령어의 주소를 저장하는 레지스터
- 명령어 레지스터(IR) : 기억장치로부터 읽어온 명령어를 수행하기 위하여 일시적으로 저장
- 누산기(AC) : ALU 내부에 위치하며, ALU의 산술 연산과 논리 연산 과정에 사용
- 스택 제어 레지스터 : 메모리 스택을 관리
- 플래그 레지스터(FR) : CPU가 작동하는 동안 특정 조건의 발생을 표시
= 상태 레지스터(SR), 프로그램 상태 워드(PSW)
- 데이터 레지스터(DR) : 주변 장치로, 또는 주변 장치로부터 전송되는 데이터를 일시적으로 저장하기 위해 프로세서에 사용되는 레지스터
[3] 레지스터 전송(LOAD, STORE, MOVE 명령 등)
수업 시간에 진행한 예를 통해 살펴보자.
MOVE는 연산 코드(opcode)
변수a, 20은 피연산자(operand)
이때 연산코드는 동작을 나타내고, 피연산자는 저장 공간을 나타낸다.
- MOV 변수a 20은 상수 20을 변수 a에 저장하라는 것.
→ 즉 피연산자 1과 2가 있으면 동작 수행 후의 결과를 1에다가 저장한다.
주소 버스 : 접근할 주소를 알려줌
데이터 버스 : 값만 가져옴
제어 버스 : 읽기, 쓰기 등 어떤 행위를 할 지
쓰기 방향은 중앙처리장치 → 주기억장치
읽기 방향은 주기억장치 → 중앙처리장치
위의 경우에는 150번에서 500이라는 값을 읽어오는 것
그렇다면 위의 프로그램 코드를 아래의 그림처럼 나타낸 예를 살펴보자.
초기 설정은 위와 같다.
주소 레지스터는 PC, 명령어 레지스터는 IR이다.
101번에서 MOV 변수a 20이라는 명령어를 읽어온다.
명령을 수행하기 전에 PC의 값을 1 올린 후,
명령어 레지스터에 따라 변수 a의 주소인 105번에 20을 쓴다.
그런 다음 102번의 명령어를 읽어온다.
102번의 명령어를 읽어왔으니 PC를 +1 취해주고, 읽어온 명령어를 실행해준다.
읽어온 명령어는 105번의 값을 읽어온 후 레지스터A에 저장하는 것이다.
아래의 실행 과정들도 위처럼 진행된다.
04 명령어 형식
; 연산 코드(opcode), 오퍼랜드(operand), 피연산자 위치, 연산 결과의 저장 위치 등 여러 가지 정보로 구성
0-주소 명령어
; 연산에 필요한 오퍼랜드 및 결과의 저장 장소가 묵시적으로 지정된 경우 : stack을 갖는 구조
Stack의 동작 과정
- LIFO : 가장 마지막에 입력된 것이 가장 먼저 출력됨
- Top에 위치한 요소는 POP을 통해 스택에서 인출됨
- 연산을 수행하고, 연산의 결과를 다시 스택에 저장되도록 PUSH
- 결과 데이터 저장 후 Top은 가장 위로 이동
1-주소 명령어
; 연산 대상이 되는 2개 중 하나만 표현하고 나머지 하나는 묵시적으로 지정 : 누산기(AC)
- 기억 장치 내의 데이터와 AC 내의 데이터로 연산 후 결과는 AC에 저장
- ADD X ; AC ← AC + M[X] (X번지의 내용과 누산기의 내용을 더하여 결과를 다시 누산기에 저장)
cf) ; 는 주석 표시이다.
2-주소 명령어
; 연산에 필요한 두 오퍼랜드 중 하나가 결과 값을 저장
- ADD R1, R2 ; R1 ← R1+R2
3-주소 명령어
; 연산에 필요한 오퍼랜드 2개와 결과 값의 저장 장소가 모두 다름
- ADD R1, R2, R3 ; R1 ← R2+R3
- 연산 후에도 입력 데이터를 보존함
- 프로그램이 짧아지지만 명령어 해독 과정이 복잡해짐
0-주소, 1-주소, 2-주소, 3-주소 명령을 사용하여 Z=(B+C)*A를 구현한 예
- ADD : 덧셈
- MUL : 곱셈
- MOV : 데이터 이동(레지스터와 기억 장치 간)
- LOAD : 기억 장치에서 데이터를 읽어 누산기에 저장
- STOR : AC의 내용을 기억 장치에 저장
[2] 명령어 종류
(1) 데이터 이동 명령
; 연산에 필요한 가장 기본이 되는 작업 : 원본과 동일한 새로운 객체를 만드는 복사(다른 장소에 복사본 생성)
- 변수에 값 할당 : A=B는 메모리 주소 B의 값(데이터)을 A 장소로 복사한다는 의미.
- 데이터의 효율적인 액세스 및 사용 : 메모리와 레지스터 간에 데이터를 이동하여 프로그램 실행을 효율적으로 수행
LOAD : 메모리에서 레지스터로
STORE : 레지스터에서 메모리로
MOVE : 하나의 레지스터에서 다른 레지스터로
(2) 2항 연산
; 산술 연산 및 논리 연산과 오퍼랜드 2개를 결합하여 결과 생성
- AND 연산; 워드에서 특정 비트를 추출하는 용도로 사용 B 마스크와 AND 결합을 통해 3번째 문자 추출 후 오른쪽으로 8비트 시프트 진행
- ex) 8비트 문자가 4개 저장된 32비트 워드에서 3번째 문자만 남기고 오른쪽으로 8비트 시프트
(3) 단항 연산
; 오퍼랜드와 결과가 모두 1개
- 2항 연산보다 명령이 짧지만, 명령에 다른 정보를 지정해야 할 때가 많다.
- shift 연산 : 비트를 왼쪽이나 오른쪽으로 이동하는 작업으로 워드의 끝부분에서 비트 손실 발생
2의 제곱수를 곱할 때와 나눌 때 사용함.
왼쪽으로 시프트 되었을 때는 (원래 수)*(2^k), 오른쪽으로 시프트 되었을 때는 (원래 수)/(2^k)
24*n에 대하여 계산
→ 24*n = (16+8)*n = 2^4*n + 2^3*n
→ n을 4비트 왼쪽 시프트하면 16*n, 3비트 시프트 하면 8*n
→ 최종 목적 : 산술 연산의 속도를 높이기 위함(곱셈보다 시프트 두 번 + 덧셈이 빠름)
- rotate 연산 : 한쪽 끝에서 밀린 비트가 다른 쪽 끝에서 다시 나타나는 이동
(4) 비교와 조건 분기 명령어
- 조건이 충족되면 특정 메모리 주소로 분기 - if; 특정 비트가 0인지 확인 or 음수인지 알아보기 위해 부호 비트 검사(1이면 분기)
- 오버플로 비트; 산술 연산의 결과 데이터가 표현 범위를 벗어났을 때 1로 설정
- 오버플로가 발생하면 에러 루틴 및 수정 조치를 취함
- 캐리 비트; 맨 왼쪽 비트에서 데이터가 넘칠 때 세트
다중 비트 연산 : 정수가 워드 2개 이상으로 표현되는 경우 연산을 수행하려면 캐리 비트 점검
(5) 프로시저 호출 명령
; 특정 작업을 수행하는 명령 그룹, 프로그램 내 어디서든 호출 가능
- 서브루틴(어셈블리), 함수(C언어) 매서드(자바)
(6) 루프 제어 명령
; 명령 그룹을 정해진 횟수만큼 실행해야 하는 경우
- for문
05 주소 지정 방식
주소 지정
; 오퍼랜드의 위치를 지정하는 것
(1) 즉시 주소 지정
; 오퍼랜드를 지정하는 가장 간단한 방법
- 명령어 자체에 오퍼랜드를 포함
- 오퍼랜드가 포함되어 명령어가 인출될 때 오퍼랜드도 자동으로 인출
- 장점 : 오퍼랜드를 인출을 위한 메모리 참조가 필요 없음
- 단점 : 상수만 가능, 상수 값의 크기가 필드 크기로 제한
(2) 직접 주소 지정
; 메모리에 위치한 오퍼랜드의 전체 주소 지정 → 실제 메모리에 있는 주소를 찾아서 넣어주는 것
- 컴파일 할 때 알려진 주소의 전역 변수에 액세스하는 데만 사용 가능함
(3) 레지스터 주소 지정
; 가장 일반적인 주소 지정 방식으로 직접 주소 지정과 개념은 같고, 위치가 레지스터임
cf) 레지스터는 액세스가 빠르고 주소가 짧아서 많이 사용하는 방식임
- LOAD나 STORE 명령어 사용→ 한 오퍼랜드는 레지스터고, 다른 한 오퍼랜드는 메모리 주소
(4) 레지스터 간접 주소 지정
; 직접 주소를 명령어에는 포함하지 않음 → 포인터를 이용 → 명령어에 전체 메모리 주소가 없어도 메모리 참조 가능
(5) 변위(offset) 주소 지정
; 특정 레지스터에 저장된 주소 오프셋을 더해 실제 오퍼랜드가 저장된 메모리 위치 지정
이때 특정 레지스터가 무엇인지에 따라 여러 주소 지정 방식이 가능함
ex) 인덱스 주소 지정 방식 → 인덱스 레지스터, 상대 주소 지정 방식 → PC
- 인덱스 주소 지정
; 레지스터(명시적 또는 암시적)에 일정한 변위를 더해 메모리 주소 참조
R1, R2, R3의 3개의 레지스터 필요함
명령어 루프에 4개 실행
(6) 간접 주소 지정
; 메모리 참조가 2번 이상 일어나는 경우 → 데이터를 가져오는 시간이 많이 소요됨
- 프로세서와 주기억 장치 간의 속도 차가 많은 프로세서의 경우
오퍼랜드 인출 시 오래 걸림 → 프로그램 수행 시간 증가
cf) 현재는 간접 주소 지정을 지원하는 프로세서는 거의 없음
(7) 묵시적 주소 지정
; 오퍼랜드의 소스나 목적지를 명시하지 않음 → 암묵적으로 알 수 있음
- PUSH, POP등의 스택 관련 명령어 사용
PUSH R1 : 레지스터 R1의 값을 스택에 저장
POP : 스택의 TOP에 있는 값을 AC로 인출
- 누산기를 소스나 목적지로 사용하는 경우에 생략 가능
Uploaded by Notion2Tistory v1.1.0