김기현
Chapter04

CPU의 작동 원리

ALU와 제어 장치

ALU

레지스터를 통해 피연산자를, 제어장치로 부터 수행할 연산을 알려주는 제어신호를 받아 들여 연산을 수행 = ALU

결과값은 특정 숫자,문자 혹은 메모리 주소로 변환되며, 바로 메모리에 저장되지 않고 일시적으로 레지스터에 저장됨

이유? = CPU가 메모리에 접근하는 속도보다 레지스터에 접근하는 속도가 훨씬 빠르기 때문에
메모리에 접근하면 프로그램 실행 속도가 늦춰질수 있음

ALU는 결과값과 더불어 연산 결과에 대한 추가적인 상태 정보인 플래그를 내보냄

ex: 연산 결과가 연산 결과를 담을 레지스터보다 클때 결괏값이 너무 크다는뜻의 오버플로우라는 플래그를 내보냄

이러한 플래그들은 CPU가 참고해야할 정보이므로, 플래그 레지스터라는 플래그 값을 저장하는 레지스터에 저장됨

제어 장치

제어 신호를 내보내고 명령어를 해석하는 부품 = 제어 장치
컴퓨터 부품들을 관리하고 작동시키기 위한 신호 = 제어 신호

<제어 장치가 받아들이는 정보>

  1. 클럭 (컴퓨터의 시간 단위)
  2. 명령어 레지스터로부터 오는 해석할 명령어
  3. 플래그 레지스터로부터 오는 플래그
  4. 시스템 버스중 제어 버스로 오는 제어 신호

<제어 장치가 내보내는 정보>

CPU 외부(제어 버스)로 전달하는 제어 신호
= 메모리나 입출력장치로 전달

CPU 내부로 전달하는 제어 신호
= ALU나 레지스터로 전달

레지스터

메모리에서 읽어들일 명령어의 주소를 저장
= 프로그램 카운터 (= 명령어 포인터 )

메모리에서 읽어들인 명령어를 저장
= 명령어 레지스터

메모리의 주소를 저장
= 메모리 주소 레지스터

메모리와 주고 받을 값을 저장
= 메모리 버퍼 레지스터(=메모리 데이터 레지스터)

프로그램 카운터 ➡️ 메모리 주소 레지스터 ➡️ 메모리 버퍼 레지스터 ➡️ 명령어 레지스터
➡️ 제어 장치가 명령어 레지스터의 명령어를 해석하고 제어 신호를 발생시킴

데이터, 주소 모두 자유롭게 저장,사용 가능
= 범용 레지스터

ALU 연산 결과에 따른 플래그 저장
= 플래그 레지스터

명령어 사이클과 인터럽트

명령어 사이클

일정한 주기로 명령어를 처리하는 흐름 = 명령어 사이클

메모리에 있는 명령어를 CPU로 가져오는 단계 = 인출 사이클

인출 사이클 후 명령어를 실행하는 단계 = 실행 사이클

명령어 실행을 위해 메모리 접근이 더 필요한 경우 = 간접 사이클

∴ 일반적인 경우 = 인출 사이클 ➡️ 실행 사이클
추가적으로 메모리 접근이 필요한 경우 = 인출 사이클 ➡️ 간접 사이클 ➡️ 실행 사이클

인터럽트

CPU의 정상적인 작업을 방해하는 신호
= 인터럽트

CPU가 실행하는 프로그래밍상의 오류와 같은 예외적인 상황에서 발생하는 인터럽트
= 동기 인터럽트(=예외)

주로 입출력장치에 의해 발생하는 인터럽트
= 비동기 인터럽트(=하드웨어 인터럽트)

하드웨어 인터럽트 처리 과정
  1. 입출력장치가 CPU에 인터럽트 요청 신호 보냄
  2. 실행 사이클이 끝나고 명령어를 인출하기 전에 인터럽트 여부 확인
  3. CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일지 여부 확인
  4. 받아들일수 있는 상태라면 현재까지의 작업을 백업
  5. CPU가 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행
  6. ❺가 끝나면 ❹에서 백업해둔 작업을 재개

인터럽트를 처리하기 위한 프로그램
= 인터럽트 서비스 루틴
ex: 프로그램에 어떻게 문제가 생겼을땐 어떻게 작동한다.

작업 진행 ➡️ 인터럽트 발생 ➡️ 인터럽트 서비스 루틴으로 이동 후 실행 ➡️ 기존 작업으로 이동 후 작업 재개

인터럽트 서비스 루틴의 시작 주소를 포함하는 인터럽트 서비스 루틴의 식별 정보
= 인터럽트 벡터

인터럽트 여부 확인에 상관없이 우선순위가 높은 인터럽트(정전,하드웨어 고장 등)는 인터럽트 플래그가 막을수 없음
= 비마스크 인터럽트 (NMI)