CPU의 작동 원리
ALU
- ALU(Arithmetic Logic Unit) : 산술 논리 연산 장치
- 제어장치(명령을 읽고 해석하는 장치)의 제어신호를 읽어들임
- 레지스터로부터 피연산자를 받음
- 제어신호 + 피연산자를 연산함
- 연산 결과를 레지스터에 전달
- 필요에 따라 플래그(추가 정보, 일종의 주석)을 플래그 레지스터에 전달
- CPU가 메모리에 접근하는 것보다 레지스터에 접근하는 것이 빠르므로 레지스터에서 피연산자를 받고 레지스터로 연산 결과를 보낸다.
- 오버플로우 : 연산 결과가 연산 결과를 담을 레지스터보다 큰 상황
- 플래그 정보 요약
제어장치
-
제어 신호를 보내고 명령어를 해석하는 부품
- 제어 신호 : 컴퓨터 부품들을 관리하고 작동시키기 위한 전기신호
-
제어 장치의 정보 수용 순서
(가) 클럭 신호 수용
- 클럭 : 컴퓨터의 모든 부품이 움직일 수 있게 하는 시간 단위. 레지스터간의 데이터 이동, ALU에서 연산 수행, CPU의 메모리의 명령어 읽기. 클럭의 주기에 맞춰 행동함 -> 한 싸이클에 한번, 두 싸이클에 한번, 세 싸이클에 한번 등 다양함.
(나) 해석할 명령어 수용
- 명령어 레지스터로부터 명령어 수용 및 제어 신호 발생.
(다) 플래그 레지스터의 플래그 값 수용
- 플래그 레지스터의 플래그 값을 읽고 제어 신호 발생.
(라) 시스템 버스(특히, 제어 버스)의 제어 신호 수용
-
제어 신호 전송
- 메모리에 제어신호 전송(메모리에 저장된 값을 읽을 때, 메모리에 새로운 값을 입력할 때)
- 입출력 장치에 제어신호 전송(입출력장치의 값을 읽을 때, 입출력장치에 새로운 값을 쓸 때)
- CPU 내부에 제어신호 전송(ALU 제어 신호 - 연산 수행 지시 / 레지스터 제어 신호 - 레지스터 간 데이터 이동 + 저장된 명령 해석)
레지스터
- 레지스터의 종류
- 변위 주소 지정방식 - 오퍼랜드 필드의 값(메모리 주소) + 특정 레지스터의 메모리 주소 값
- 상대 주소 지정 : 오퍼랜드와 프로그램 카운터의 값을 더한 유효 주소 지정 - 명령어 레지스터를 기준으로 몇 번째 번지의 레지스터 값을 읽음
- 베이스 레지스터 주소 지정 : 오퍼랜드 + 베이스 레지스터 값을 더한 유효 주소 지정 - 베이스 레지스터의 값이 기준이 되어 오퍼랜드에 적힌 값을 더한 번짓로 접근
- 레지스터의 처리 순서
- 가정 : CPU로 실행할 프로그램이 1000번지부터 1500번지까지 저장
- 순차적으로 실행되지만 특정 메모리 주소로 실행 흐름이 이동하는 명령어(JUMP, CONDITIONAL JUMP, CALL, RET 등)으로 인해 달라질 수 있음.
레지스터 확인문제
플래그 레지스터 : 연산 결과 혹은 CPU 상태에 대한 부가 정보를 저장하는 레지스터
프로그램 카운터 : 메모리에서 가져올 명령어의 주소를 저장하는 레지스터
범용 레지스터 : 데이터와 주소를 모두 저장할 수 있는 레지스터
명령어 레지스터 : 해석할 명령어를 저장하는 레지스터
명령어 사이클
명령어 사이클 순서
- 인출사이클 : 명령어를 메모리에서 CPU로 가져오는 것
- 실행사이클 : 인출사이클에서 가져온 명령어를 실행
2-1. 간접사이클 : 메모리에 접근이 더 접근하여 명령을 실행(간접 주소 지정 방식)
인터럽트
- 명령어 사이클이 끊어지는 상황
- 작업 도중 우선순위가 높은 업무를 처리해야하 할 때
동기 인터럽트
- CPU에 의해 발생한 예기치 못한 상황(프로그래밍상의 오류 등 예외적인 상황)
- 예외
- 예외의 종류
- 폴트 : 예외를 처리한 직후 예외가 발생한 명령어부터 실행을 재개
- 트랩 : 예외를 처리한 직후 예외가 발생한 명령어의 다음 명령어부터 실행을 재개
- 디버깅(프로그램 개발 중에 발생한 문제를 진단하고 해결하기 위한 작업)을 할 때 주로 사용
- 중단(ABORT) : CPU가 실행 중인 프로그램을 강제로 종료해야 하는 심각한 오류
- 소프트웨어 인터럽트 : 시스템 호출이 발생했을 때 나타나는 인터럽트
비동기 인터럽트
- 입출력장치에 의해 발생한 완료 알림(입출력장치의 작업이 끝나면 CPU에 완료를 알림)
- 하드웨어 인터럽트
- 흔히 인터럽트라고 하면 이를 의미함.
하드웨어 인터럽트(비동기 인터럽트) 처리 순서
- 입출력장치가 CPU에 인터럽트 요청신호 전송
- 인터럽트 요청신호 : 인터럽트 실행 전 작업 현재 작업 일시중지 확인
- CPU가 명령어를 인출하기 전 인터럽트 여부를 확인
- CPU의 인터럽트 요청 확인 및 인터럽트 플래그를 통한 현재 인터럽트 수용 여부 확인
- 인터럽트 플래그 : 하드웨어 인터럽트의 수용 여부를 결정하는 플래그, 플래스 레지스터의 인터럽트 플래그 활성화 상태 필수
- 정진이나 고장으로 등을 대비한 막을 수 없는 인터럽트 존재
- 인터럽트 수용이 가능하면 CPU는 지금까지의 작업을 백업
- CPU는 인터럽트 백터를 참조하여 인터럽트 서비스 루틴을 실행
- 인터럽트 서비스 루틴(=인터럽트 핸들러) : 인터럽트를 처리하기 위한 프로그램
- 인터럽트 백터 : 각각의 인터럽트 서비스 루틴을 구분하는 정보 - 백업한 정보를 재개하기 위한 식별자
- CPU는 인터럽트 서비스 루틴을 실행하기 전에 프로그램 카운터 값 등 현재 프로그램을 재개하기 위해 필요한 모든 값을 스택에 백업
- 인터럽트 서비스 루틴 실행이 끝나면 4에서 저장한 백업을 복구하여 실행 재개
CPU 성능 향상 기법
클럭
- CPU 속도 단위
- 클럭 속도 단위 : Hz, 1초당 클럭의 반복 수
- 오버클럭킹 : 최대속도를 강제로 끌어올리는 기법 - 발열로 인한 성능 저하
코어와 멀티코어
- 코어 : CPU의 명령어를 수행하는 부분
- 코어는 ALU, 제어장치, 레지스터로 구성된 묶음을 1코어로 정의
- 8코는 해당 코어가 8개 존재
- 멀티코어 CPU(멀티코어 프로세서) : 코어를 여러 개 포함한 CPU
스레드와 멀티스레드
- 실행의 흐름 단위
- 하드웨어적 스레드 : 하나의 코어가 동시에 처리하는 명령어 단위
- 멀티스레드 프로세서(멀티스레드 CPU) : 하나의 코어로 여러 명령어를 동시에 처리하는 CPU(=여러 개의 하드웨어적 스레드를 지원하는 CPU)
- 하이퍼스레딩 : 인텔의 멀티스레드 기술
- 멀티스레드 프로세서 구성을 위해서 프로그램 카운터, 스택 포인터, 메모리 버퍼 레지스터, 메모리 주소 레지스터와 같이 명령어를 처리하는 레지스터를 여러 개 소유해야함.
- 메모리 속 프로그램의 관점에서 멀티스레드 프로세서는 하나의 코어가 하나의 명령어를 처리하는 것처럼 인식된다. 따라서 멀티스레드 프로세서를 논리 프로세서라고 부른다.
- 소프트웨어적 스레드 : 하나의 프로그램에서 독립적으로 실행되는 단위
- 한 번에 하나씩 명령어를 처리하는 1코어 1스레드 CPU도 소프트웨어적 스레드를 수십게 실행 가능
- 코어 : 명령을 실행할 수 있는 하드웨어 부품
- 스레드 : 명령어를 실행하는 단위
- 멀티코어 프로세서 : 명령어를 실행할 수 있는 하드웨어 부품이 2개 이상
- 멀티스레드 프로세서 : 하나의 코어로 여러 개의 명령어를 실행하는 CPU
확인문제
- 클럭의 설명
- CPU는 클럭 신호에 맞춰 작동
- 클럭 신호는 CPU의 속도 단위
- 클럭 신호는 일정하지 않음
- 멀티코어와 멀티스레드
- 코어는 명령어를 인출, 해석, 실행하는 부품의 집합
- 스레드는 코어가 처리할 수 있는 작업의 단위
- 여러 개의 스레드를 처리할 수 있다면 하나의 프로그램을 동시에 처리할 수 있다.
- 스레드에는 하드웨어적 스레드와 소프트웨어적 스레드가 있다.
- 멀티코어 CPU의 도식화
명령어 병렬 처리 기법
- 명령어를 동시에 처리하도록 CPU를 지속적으로 작동시키는 기법
- 명령어 처리 과정(일반적으로)
- 명령어 인출
- 명령어 해석
- 명령어 실행
- 결과 저장
명령어 파이프 라이닝
- 각 단계가 겹치지 않으면 각 단계를 동시에 실행 가능(EX, A 명령어 인출, A 명령어 해석 + B 명령어 인출, A 명령어 실행 + B 명령어 해석 + C 명령어 인출)
- 공장 처럼 해당 공정의 작업이 끝나면 다음 작업꺼리를 지속적으로 공급
- 파이프라인 위험 : 성능 향상에 실패하는 경우
- 데이터 위험 : 데이터 의존성에 의한 발생, 이전 명령어 수행 결과를 받아야만 실행하는 경우에 발생
- 제어 위험 : 분기(branch) 등으로 인한 프로그램 카운터의 갑작스러운 변화에 의해 발생, 프로그램 카운터는 현재 실행 중인 명령어의 다음 주소로 갱신되지만 프로그램 실행 흐름이 바뀌어 명령어가 실행되면 프로그램 카운터 값에 갑작스러운 변화가 생겨 명령어 파이프라인에 가지고 있던 명령어가 폐기됨
- 분기 예측(branch prediction)으로 해결
- 구조적 위험(=자원 위험) : 서로 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 할 때 발생
슈퍼스칼라
- CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조
- 슈퍼스칼라 프로세서(=슈퍼스칼라 CPU) : 슈퍼스칼라 구조로 명령어 처리가 가능한 CPU
- 멀티스레드 프로세서는 한 번에 여러 명령어를 인출, 해석, 실행하여 슈프스칼라 구조를 사용할 수 있다.
비순차적 명령어 처리(Out of Order Execution)
- 앞 선 명령어의 결과와 무관하게 처리할 수 있는 명령을 먼저 처리하는 방식
CISC와 RISC
명령어 집합(Intruction Set Architecture)
- 명령어 집합(=명령어 집합 구조) : CPU가 이해할 수 있는 명령어 모음
- CPU 마다 ISA가 다름 - 제어장치의 명령어 해석 방식, 사용되는 레지스터의 종류 나 수, 메모리 관리 방법 등 모두 다름.
- ISA는 CPU 언어
CISC(Complex Instruction Set Computer)
- 복잡하고 다양한 명령어들을 활용하는 CPU 설계 방식
- x86, x86-64
- 명령어의 형태와 크기가 다양한 가변 길이 명령어를 활용, 다양한 메모리 주소 지정 방식 활용
- 장점 : 적은 명령어로 다양한 명령을 수행할 수 있으며, 메모리 절약에 용이
- 단점 : 복잡하고 다양한 기능 제공으로 인한 명령어의 크기와 실행 시간이 일정하지 않으며, 복잡한 명령어 때문에 명령어 하나를 실행하는 데에 여러 클럭 주기 필요
- 여러 클럭 주기를 사용하므로 명령어 파이프라인 구현에 어려움
- 복잡한 명령어를 활용하나 사용빈도가 낮음
RISC(Reduced Instruction Set Computer)
- CISC의 단점을 보완
- 자주 쓰이는 기본 명령어의 효율 향상
- 파이프라인 최적화
- 명령어 길이와 수행시간이 짧고 규격화
- 고정 길이 명령어
- 주소 지정 방식의 종류가 적음
- 메모리 접근의 단순화 및 최소화
- 레지스터의 활용 최대화
- 레지스터 연산이 많음
- 더 많은 범용 레지스터 개수