CS/컴퓨터구조

[컴퓨터구조] CPU의 구성 요소, 작동 원리

연듀 2024. 2. 8. 09:34

 

1. CPU란?

 

CPU는 메모리에 저장된 명령어를 읽어 들이고, 해석하고, 실행하는 장치이다.

CPU 내부에는 계산을 담당하는 ALU, 명령어를 읽어 들이고 해석하는 제어장치, 작은 임시 저장 장치인 레지스터라는 구성 요소가 있다.

 

 

2. CPU의 구성 요소

 

ALU

  • 계산하는 부품
  • 레지스터로부터 받아들인 피연산자와 제어장치로부터 받아들인 제어 신호로 연산을 수행
  • 연산 결과와 플래그(추가적인 상태 정보)를 내보내 레지스터에 저장

 

제어장치

  • 제어 신호를 내보내고, 명령어를 해석하는 부품
  • 클럭 신호, 명령어 레지스터로부터 해석할 명령어, 플래그 레지스터 속 플래그 값, 제어 버스로 전달된 외부로부터 전달된 제어 신호를 받아들인다.
  • CPU 내부에 제어 신호 내보냄(ALU, 레지스터에 전달)
    • ALU에는 수행할 연산을 지시
    • 레지스터에는 레지스터 간에 데이터를 이동시키거나 레지스터에 저장된 명령어를 해석하기 위함
  • CPU 외부에 제어 신호 내보냄(메모리, 입출력장치에 제어 버스로 전달)

 

 

레지스터

  • 명령어와 데이터가 저장되는 곳
  • 프로그램 카운터 : 메모리에서 가져올 명령어의 주소 저장
  • 명령어 레지스터 : 메모리에서 읽어 들인 명령어 저장
  • 메모리 주소 레지스터 : 메모리 주소 저장
  • 메모리 버퍼 레지스터 : 메모리와 주고받을 데이터와 명령어 저장
  • 플래그 레지스터 : 연산 결과나 CPU 상태에 대한 부가적인 정보를 저장
  • 범용 레지스터 : 데이터와 주소 모두 저장
  • 스택 포인터 : 스택 최상단의 위치 저장
  • 베이스 레지스터 : 기준 주소로서의 역할을 하는 주소를 저장
  • 작동 과정
    • 메모리의 1000번지에 1101이 저장되어있다고 가정하자.  메모리에서 가져올 명령어가 있는 100번지는 프로그램 카운터에 저장된다.
    • 메모리 주소 레지스터에는 1000이 저장된다.
    • '메모리 읽기' 제어 신호와 메모리 주소 레지스터 값이 각각 제어 버스와 주소 버스를 통해 메모리로 보내진다.
    • 메모리 1000번지에 저장된 1101은 메모리 버퍼 레지스터로 전달되고, 프로그래 카운터는 1001로 증가되어 다음 명령어를 읽을 준비를 한다.
    • 메모리 버퍼 레지스터에 저장된 값은 명령어 레지스터로 이동한다.
    • 제어장치는 명령어 레지스터의 명령어를 해석하고 제어 신호를 발생시킨다.
    • 이렇게 1000번지 명령어 처리가 끝나면 증가된 프로그램 카운터 값을 통해 다음 명령어(1001번지)를 읽어들인다. 

 

특정 레지스터를 이용한 주소 지정 방식

프로그램 카운터, 스택 포인터, 베이스 레지스터는 주소 지정에 사용될 수 있는 특별한 레지스터다.

 

  • 스택 주소 지정 방식 : 메모리 안의 스택과 스택 포인터를 이용
  • 변위 주소 지정 방식
    • 상대주소 지정 방식 : 오퍼랜드와 프로그램 카운터의 값을 더해 유효 주소를 얻는 방식
    • 베이스 레지스터 주소 지정 방식 : 오퍼랜드와 베이스 레지스터의 값 더해 유효 주소 얻는 방식

 

 

 

3. CPU의 명령어 처리

 

명령어 사이클

CPU가 하나의 명령어를 처리하는 정형화된 흐름

프로그램 속 명령어들은 일정한 주기인 명령어 사이클이 반복되며 실행된다.

 

인출 사이클, 실행 사이클, 간접 사이클, 인터럽트 사이클로 구성

 

 

 1. 인출 사이클

 

메모리에 있는 명령어를 CPU로 가지고 오는 단계

 

 

 2. 실행 사이클

 

CPU로 가져온 명령어를 실행하는 단계

제어장치가 명령어 레지스터에 담긴 값을 해석하고, 제어 신호를 발생 시킴 

 

 

 3. 간접 사이클

 

명령어 실행 위해 메모리 접근을 한번 더 하는 단계

명령어를 인출하여 CPU로 가져왔다 하더라도 곧바로 실행할 수 없는 경우도 있다. 이럴 때 이 단계를 거친다. 

 

 

 

인터럽트

 

CPU의 작업을 방해하는 신호

인터럽트는 크게 동기 인터럽트와 비동기 인터럽트가 있다.

 

  • 동기 인터럽트(예외)  
    • CPU에 의해 발생
    • 프로그래밍상의 오류와 같은 예외적인 상황에 마주쳤을 때 발생
  • 비동기 인터럽트(하드웨어 인터럽트) 
    • 입출력장치에 의해 발생
    • 입출력 작업 도중에도 효율적으로 명령어를 처리할 수 있게 해줌 
    • 처리 순서
      • 입출력 장치가 CPU에 인터럽트 요청 신호를 보냄
      • CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인하고, 받아들일 수 있다면 지금까지의 작업을 스택에 백업
      • CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴의 시작 주소를 알아내 인터럽트 서비스 루틴을 실행
      • 인터럽트 서비스 루틴이 끝나면 백업해둔 작업을 복구해 실행 재개
    • 인터럽트 요청 신호: CPU의 작업을 방해하는 인터럽트에 대한 요청
    • 인터럽트 플래그: 인터럽트 요청 신호를 받아들일지 결정하는 비트
    • 인터럽트 벡터: 인터럽트 서비스 루틴의 식별 정보
    • 인터럽트 서비스 루틴(인터럽트 핸들러): 인터럽트를 처리하는 프로그램. 어떤 인터럽트가 발생했을 때 어떻게 처리하고 작동할지에 대한 정보로 이루어짐

 

 


 

 

빠른 CPU를 위한 설계 기법

 

  • 클럭 속도를 높인다.
    • 클럭: 컴퓨터의 모든 부품을 움직일 수 있게 하는 시간 단위
  • CPU의 코어의 수를 늘린다.
    • 코어 : 명령어를 실행하는 하드웨어 부품
    • 멀티코어 프로세서(멀티코어 CPU) : 여러개의 코어를 포함하고 있는 CPU. 성능이 단일 코어 CPU보다 좋음
  • 스레드 수를 늘린다.
    • 하드웨어적 스레드
      • 하나의 코어가 동시에 처리하는 명령어 단위
      • 논리 프로세서라고도 부름
      • 멀티스레드 프로세서(멀티스레드 CPU) : 하나의 코어로 여러 명령어를 동시에 처리하는 CPU
        • 명령어를 처리하기 위해 필요한 레지스터들을 여러개 둠으로써 하나의 코어에서 여러 명령어가 동시에 실행될 수 있음
    • 소프트웨어적 스레드
      • 하나의 프로그램에서 독립적으로 실행되는 단위

 

명령어 병렬 처리 기법

 

  • 명령어 파이프라이닝
    • 동시에 여러 개의 명령어를 겹쳐 실행하는 기법
    • 특정 상황에서 성능 향상에 실패하는 파이프라인 위험 가능
      • 데이터 위험: 명령어간 데이터 의존성에 의해 발생
      • 제어 위험: 프로그래 카운터의 갑작스러운 변화에 의해 발생
      • 구조적 위험: 서로 다른 명령어가 동시에 CPU 부품을 사용하려고 할 때 발생
  • 슈퍼스칼라
    • 여러 개의 명령어 파이프라인을 두는 기법
  • 비순차적 명령어 처리
    • 파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 기법

 

ISA

 

  • 명령어 집합(ISA)
    • CPU가 이해할 수 있는 명령어들의 모음 
    • CPU의 언어이자 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속

 

 

명령어 병렬 처리 기법들을 도입하기 유리한 ISA

 

  • CISC(Complex Instruction Set Computer)
    • 복잡하고 다양한 수의 가변 길이 명령어 집합을 활용
    • 명령어의 크기와 실행되기까지의 시간이 일정하지 않다는 단점 -> 명령어 파이프라인 구현시 걸림돌
  • RISC
    • 단순하고 적은 종류의 고정 길이 명령어 집합 활용
    • 명령어 파이프라이닝에 최적화