CS/CA

[CA/혼공단] CPU의 작동 원리

axnuo 2024. 1. 9. 22:43

Chapter 4. CPU의 작동 원리

04-1. ALU와 제어장치

ALU

레지스터를 통해 피연산자를 받아들이고 제어장치로부터 수행할 연산을 알려주는 제어 신호를 받아들인 후 산술 연산, 논리 연산 등 다양한 연산 수행

  • 결과값은 일시적으로 레지스터에 저장
  • → CPU가 메모리에 접근하는 속도가 레지스터에 접근하는 속도보다 훨씬 느리기 때문
  • 플래그
    • 연산 결과에 대한 추가적인 정보
    • 부호 / zero / 캐리 / 오버플로우 / 인터럽트 / 슈퍼바이저 등이 있음
    • 플래스 레지스터에 저장됨

이외에도 가산기, 보수기, 시프터, 오버플로우 검출기 등이 존재…

제어장치

  • 제어장치는 클럭 신호를 받아들임
    • 클럭 (clock) : 컴퓨터의 부품을 움직이는 시간 단위
  • 제어장치는 ‘해석해야 할 명령어’를 받아들임
    • 명령어 레지스터에 저장
  • 제어장치는 플래그 레지스터 속 플래그 값을 받아들임
  • 제어장치는 시스템 버스 중 제어 버스로 전달된 제어 신호를 받아들임.
    • 제어 신호는 CPU뿐만 아니라 CPU 외부 장치도 발생 시킬 수 있음.

제어장치가 내보내는 정보

  • CPU 외부에 전달하는 제어 신호
    • 제어 버스로 제어 신호를 내보냄
    • 메모리에 전달 / 입출력장치에 전달
  • CPU 내부에 전달하는 제어 신호
    • ALU에 전달 / 레지스터에 전달

04-2. 레지스터

  • 프로그램 카운터 : 메모리에서 가져올 명령어의 주소 저장
  • 명령어 레지스터 : 방금 메모리에서 읽어 들인 명령어를 저장하는 레지스터
  • 메모리 주소 레지스터 : 메모리의 주소를 저장
  • 메모리 버퍼 레지스터 : 메모리와 주고받을 값을 저장하는 레지스터
    • 메모리에 쓰고 싶은 값이나 메모리로부터 전달 받은 값은 메모리 버퍼 레지스터를 거침
  • 범용 레지스터 : 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터
  • 플래그 레지스터 : 연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장

실행순서

프로그램 카운터에명령에 메모리 주소 저장 → 메모리 주소 레지스터에 메모리 주소 저장 → 제어버스와 주소 버스를 통해 메모리를 읽음 → 메모리 버퍼 레지스터에 메모리 내용 저장(이때 프로그램 카운터는 1 증가) → 명령어 레지스터에 저장

스택 주소 지정 방식

스택과 스택 포인터를 이용한 주소 지정 방식

  • 가장 최근에 저장하는 값부터 꺼낼 수 있음
  • 스택 포인터 : 스택의 꼭대기를 가리키는 레지스터

스택은 메모리 안 스택 영역에 존재

변위 주소 지정 방식

오퍼랜드 필드의 값과 특정 레지스터의 값을 더해 유효 주소를 얻어내는 주소 지정 방식

⇒ 연산코드 / 레지터 / 오퍼랜드 필드가 존재 (레지스터 값과 오퍼랜드를 더한 곳에 있는 데이터로 연산 코드 내용을 수행하라)

⇒ 오퍼랜드 필드의 주소와 어떤 레지스터를 더하는지에 따라 주소 지정 방식이 나뉨.

  • 상대 주소 지정 방식
    • 오퍼랜드와 프로그램 카운터의 값을 더해 유효 주소를 얻는 방식
  • 베이스 레지스터 주소 지정 방식
    • 오퍼랜드와 베이스 레지스터의 값을 더해 유효주소를 얻는 방식
    • 베이스 레지스터 = 기준 주소, 오퍼랜드 = 기준 주소로부터 떨어진 거리

04-3. 명령어 사이클과 인터럽트

명령어 사이클 : 하나의 명령어를 처리하는 정형화된 흐름

인터럽트 : CPU가 정해진 흐름에 따라 명령어를 처리해 나가다가 끊어지는 상황

명령어 사이클

  • 인출 사이클 : 메모리에 있는 명령어를 CPU로 가지고 오는 단계
  • 실행 사이클 : CPU로 가져온 명령어를 실행하는 단계
    • 제어장치가 명령어 레지스터에 담긴 값을 해석하고 제어 신호를 발생시키는 단계
  • 간접 사이클
    • 명령어를 바로 실핼할 수 없는 경우가 있음
    • 메모리 접근을 한 번 더 해야 할 때 진행

인터럽트

CPU의 작업을 방해하는 신호

  • 동기 인터럽트 : CPU에 의해 발생하는 인터럽트
    • CPU가 명령어를 수행하다가 예상치 못한 상황에 마주쳤을 때
    • 프로그래밍상의 오류와 같은 예외적인 상황에 마주쳤을 때 발생
  • 비동기 인터럽트 : 입출력장치에 의해 발생하는 인터럽트
    • CPU가 입출력을 부탁하면 입출력장치가 CPU에 완료 알림을 보냄
    • 입출력장치가 입력을 받아들이면 이를 처리하기 위해 CPU에 입력 알림(인터럽트)을 보냄
  • 하드웨어 인터럽트
    • 알림과 같은 인터럽트
    • CPU 입출력 작업 도중 효율적으로 명령어를 처리하기 위해 사용
    • 처리 순서
      1. 입출력장치가 CPU에 인터럽트 요청 신호를 보냄 → 2. CPU가 실행 사이클이 끝나고 명령어를 인출하기 전 인터럽트 여부 확인 → 3. 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는 지 여부 확인 → 4. 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업 → 5. 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행 → 4에서 백업해둔 작업을 복구해 실행을 재개함.
    • 인터럽트 하기 전에는 인터럽트 요청 신호를 보내야 함.
    • 인터럽트 요청을 수용하기 위해서는 인터럽트 플래그가 활성화되어 있어야 한다.
    • → 불가능으로 설정되어 있어도 무시할 수 없는 요청도 존재(정전, 하드웨어 고장)
  • 인터럽트 서비스 루틴 : 인터럽트 처리를 위한 프로그램
  • 인터럽트 벡터 : 인터럽트 서비스 루틴을 식별하기 위한 정보

⇒ CPU가 인터럽트를 처리한다 : 인터럽트 서비스 루틴을 실행하고 본래 수행하던 작업으로 다시 되돌아온다.

이때 프로그램 카운터에는 인터럽트 서비스 루틴의 시작 주소가 들어가고 기존 주소는 스택 영역에 들어감.

 

필수 과제

p. 125의 확인 문제 2번

설명에 맞는 레지스터를 보기에서 찾아 빈칸을 채우시오

  • 플래그 레지스터
  • 프로그램 카운터
  • 범용 레지스터
  • 명령어 레지스터