본문 바로가기
Computer Science/컴퓨터구조(Computer Architecture)

CPU

by 컴돈AI 2024. 3. 27.

목차

    CPU

    • CPU 구성
      • 계산을 담당하는 ALU
      • 명령어를 읽어들이고 해석하는 제어장치
      • 작은 임시 저장장치 레지스터 (레지스터는 여러개 존재)
    • CPU가 명령어를 실행하는 과정
      1. 제어장치가 메모리에 저장된 명령어를 읽어 들이기 위해 메모리에 "메모리 읽기" 제어 신호를 보냄
      2. 메모리가 저장된 명령어를 CPU에 건네주면, CPU는 이 명령어를 레지스터에 저장
        • CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 훨씬 느림. 따라서 우선적으로 ALU의 결괏값을 메모리가 아닌 레지스터에 우선 저장함.
      3. 제어장치는 읽어 들인 명령어를 해석한뒤, 명령에 필요한 데이터를 가져오기 위해 메모리에 "메모리 읽기" 제어 신호를 보냄
      4. 다시 메모리는 저장된 데이터를 CPU에 건네주고, CPU는 이 데이터를 서로 다른 레지스터에 저장
      5. ALU는 레지스터를 통해 읽어 들인 데이터를 받아오고, 제어장치로부터 수행할 연산을 알려주는 제어 신호를 받아들인 뒤 연산 수행. 계산된 결괏값은 레지스터에 저장 (연산 결과에 대한 추가적인 상태 정보 플래그(flag)는 플레그 레지스터에 저장)
      6. 첫 번째 명령어가 끝나면, 다음 명령어에 대해서 (1~5) 반복 수행
      7. 모든 명령이 끝나고 계산 결과를 저장하기 위해 제어장치는 계산 결과와 메모리에 "메모리 쓰기" 제어 신호를 함께 보냄.

    ALU

    • ALU는 레지스터를 통해 읽어 들인 데이터를 받아오고, 제어장치로부터 수행할 연산을 알려주는 제어 신호를 받아들인 뒤 연산 수행. 계산된 결괏값은 레지스터에 저장
      • ALU가 받아들이는 정보
        • 레지스터 -> 피연산자
        • 제어창치 -> 수행할 연산을 알려주는 제어신호
      • ALU가 내보내는 정보
        • 연산을 수행한 결과 -> 레지스터에 저장
          • CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 훨씬 느림. 따라서 우선적으로 ALU의 결괏값을 메모리가 아닌 레지스터에 우선 저장함.
        • 연산 결과에 대한 추가적인 상태 정보 플래그(flag) -> 플레그 레지스터에 저장
          • 부호 플래그, 제로 플래그,캐리 플래그, 오버플로우 플래그, 인터럽트 플래그, 슈퍼바이저 플래그 등 

    제어장치

    • 제어장치는 제어 신호를 내보내고, 명령어를 해석하는 부품
      • 제어장치는 CPU 제조사마다 제어장치의 구현 방식이나 명령어를 해석하는 방식, 받아들이고 내보내는 정보에는 조금씩 차이 존재 (대표적인 예시만 살펴볼 것)
    • 제어장치가 받아들이는 정보
      • 제어장치는 클럭 신호를 받아들임
        • 클럭(Clock)
          • 클럭이란 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위
          • 클럭의 "똑-딱-똑-딱" 주기에 맞춰 한 레지스터에서 다른 레지스터로 데이터가 이동되거나, ALU에서 연산이 수행되거나, CPU가 메모리에 저장된 명령어를 읽어들이는 것
            • 그렇다고 컴퓨터의 모든 부품이 한 클럭마다 작동한다라고 이해하면 안됨. 컴퓨터의 부품들은 클럭이라는 박자에 맞춰 작동할 뿐 한 박자마다 작동하는 것이 아님.
            • 하나의 명령어가 여러 클럭에 걸쳐 실행될 수 있음.
          • 클럭은 단어만 보면 시계처럼 클럭 속도가 매번 읽정하게 유지된다고 생각할 수 있지만, 실제로는 그렇지 않음. 기본 클럭 속도(Base)와 최대 클럭 속도(Max)로 나뉘어져 있음. (고성능을 요하는 순간에는 순간적으로 클럭 속도를 높이고, 그렇지 않을 때는 유연하게 클럭속도를 낮추기도 함.)
            • 최대 클럭 속도를 갖에로 더 끌어올릴 수도 있는데, 이런 기법을 오버클럭킹(overclocking)이라고 함
      • 제어장치는 해석해야 할 명령어를 받아들임
        • CPU가 해석해야 할 명령어는 명령어 레지스터라는 특별한 레지스터에 저장됨.
        • 제어장치는 이 명령어 레지스터로부터 해석할 명령어를 받아들이고 해석한 뒤, 제어 신호를 발생시켜 컴퓨터 부품들에 수행해야 할 내용을 알려줌.
      • 제어장치는 플래그 레지스터 속 플래그 값을 받아들임
        • 제어장치가 제어 신호를 컴퓨터 부품들을 제어할 때, ALU 연산에 대한 추가적인 상태 정보를 무시하면 안되기 때문에 제어장치는 플래그 값을 받아들이고 이를 참고하여 제어 신호를 발생시킴.
      • 제어장치는 시스템 버스, 그중에서 제어 버스로 전달된 제어 신호를 받아들임.
        • 제어 신호는 CPU뿐만 아니라 입출력장치를 비롯한 CPU 외부 장치도 발생시킬 수 있음.
        • 제어장치는 제어 버스를 통해 외부로부터 절달된 제어 신호를 받아들이기도 함.
    • 제어장치가 내보내는 정보
      • CPU 외부에 전달하는 제어 신호
        • 제어장치가 CPU 외부에 제어 신호를 전달한다는 말은 곧, 제어 버스로 제어 신호를 내보낸다는 말과 같음
        • 이러한 제어 신호에는 크게 메모리에 전달하는 제어 신호와 입출력장치에 전달하는 제어 신호가 있음.
          • 메모리에 저장된 값을 읽거나 메모리에 새로운 값을 쓰고 싶을 경우 메모리에 제어 신호 내보냄
          • 제어장치가 입출력장치의 값을 읽거나 입출력장치에 새로운 값을 쓰고 싶을때는 입출력장치로 제어 신호를 내보냄.
      • CPU 내부에 전달하는 제어 신호
        • 제어장치가 CPU 내부에 전달하는 제어 신호에는 크게 ALU에 전달하는 제어 신호와 레지스터에 전달하는 제어 신호가 있음.
          • ALU에는 수행할 연산을 지시하기 위해 제어 신호 전달
          • 레지스터에는 레지스터 간에 데이터를 이동시키거나 레지스터에 저장된 명령어를 해석하기 위해 제어 신호를 내보냄.

    레지스터

    • 레지스터의 대표적인 8가지
      • 프로그램 카운터(PC : Program Counter)
        • 메모리에서 가져올 명령어의 주소, 즉 메모리에서 읽어 들일 명령어의 주소를 저장
        • 프로그램 카운터를 명령어 포인터(IP: Instruction Pointer)라고 부르는 CPU도 존재
      • 명령어 레지스터(IR, Instruction Register)
        • 해석할 명령어, 즉 방금 메모리에서 읽어 들인 명령어를 저장하는 레지스터.
        • 제어장치는 명령어 레지스터 속 명령어를 받아들이고 이를 해석한 뒤 제어신호를 내보냄
      • 메모리 주소 레지스터(MAR, Memory Address Register)
        • 메모리의 주소를 저장하는 레지스터
        • CPU가 읽어들이고자 하는 주소 값을 주소 버스로 보낼 때 메모리 주소 레지스터를 거치게 됨.
      • 메모리 버퍼 레지스터(MBR, Memory Buffer Register)
        • 메모리와 주고받을 값(데이터와 명령어)를 저장하는 레지스터
        • 즉, 메모리에 쓰고 싶은 값이나 메모리로부터 전달 받은 값은 메모리 버퍼 레지스터를 거침.
        • CPU가 주소 버스로 내보낼 값이 메모리 주소 레지스터를 거친다면, 데이터 버스로 주고받을 값은 메모리 버퍼 레지스터를 거치게 됨.
        • 메모리 데이터 레지스터(MDR, Memory Data Register)라고도 부름
      • 플래그 레지스터
        • ALU 연산 결과에 따른 플래그를 플래그 레지스터에 저장
        • 플래그 레지스터는 연산 결과 또는 CPU 상태에 대한  부가적인 정보를 저장
      • 범용 레지스터
        • 이름 그대로 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터
        • 메모리 버퍼 레지스터는 데이터 버스로 주고 받을 값만 저장하고, 메모리 주소 레지스터는 주소 버스로 내보낼 주소값만 저장하지만, 범용 레지스터는 데이터와 주소를 모두 저장할 수 있음.
        • 일반적으로 CPU 안에는 여러개의 범용 레지스터들이 있고, 현대 대다수 CPU는 모두 범용 레지스터를 가지고 있음.
      • 스택 포인터
        • 스택 포인터는 스택 주소 지정 방식이라는 주소 지정 방식에 사용
        • 스택 주소 지정 방식은 스택과 스택 포인터를 이용한 주소 지정 방식.
          • 스택 포인터란 스택의 꼭대기를 가리키는 레지스터
            • 스택은 메모리 안에 존재.
            • (정확히는 메모리 안에 스택처럼 사용할 영역이 정해져 있음 = 스택 영역(이 영역은 다른 주소 공간과는 다르게 스택처럼 사용하기로 암묵적으로 약속된 영역)
      • 베이스 레지스터
        • 프로그램 카운터와 베이스 레지스터는 변위 주소 지정 방식에 사용됨.
    • 레지스터 예시
      • CPU로 실행할 프로그램이 1000번지부터 1500번지까지 저장되어 있다고 가정
        • 1000번지에는 1101(2)이 저장되어 있음.
      • 프로그램을 처음부터 실행하기 위해 프로그램 카운터에는 1000이 저장됨. 이는 메모리에서 가져올 명령어가 1000번지에 있다는 걸 의미
      • 1000번지를 읽어들이기 위해서는 주소 버스로 1000번지를 내보내야 함. 이를 위해 메모리 주소 레지스터에는 1000이 저장됨.
      • 메모리 읽기 제어 신호와 메모리 주소 레지스터 값이 각각 제어 버스와 주소 버스를 통해 메모리로 보내짐.
      • 메모리 1000번지에 저장된 값은 데이터 버스를 통해 메모리 버퍼 레지스터로 전달되고, 프로그램 카운터는 증가되어 다음 명령어를 읽어들일 준비를 함
      • 메모리 버퍼레지스터에 저장된 값은 명령어 레지스터로 이동함.
      • 제어장치는 명령어 레지스터의 명령어를 해석하고 제어 신호를 발생시킴.
      • 프로그램 카운터 값이 증가했으니 1000번지 명령어 처리가 끝나면 CPU는 다음 명령어(1001번지)를 읽어 들임
      • (참고: 인터럽트가 발생할 경우 프로그램의 순차적인 실행 흐름이 끊어집니다. )

    출처