ALU와 제어장치

ALU(Arithmetic and Logical Unit, 산술 논리 장치)

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

alu

연산의 결과(숫자, 문자, 메모리 주소 등)는 메모리에 바로 저장하지 않고 레지스터에 일시적으로 저장한다. CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 훨씬 느리다. 연산때마다 결과를 메모리에 저장한다면 메모리에 자주 접근하므로 프로그램 실행 속도를 늦출 수 있으므로 메모리가 아닌 레지스터에 우선 저장한다.

ALU는 계산 결과와 더불어 플래그를 내보낸다. 플래그는 연산 결과에 대한 추가적인 상태 정보이다.

  • 플래그의 종류
종류의미사용 예시
부호 플래그연산한 결과의 부호부호 플래그가 1일 경우 음수, 0일 경우 양수
제로 플래그연산 결과가 0인지의 여부제로 플래그가 1일 경우 연산 결과는 0, 0일 경우 0이 아님을 의미
캐리 플래그올림수나 빌림수가 발생했는지캐리 플래그가 1일 경우 올림수나 빌림수가 발생했음을 의미, 0일 경우 발생하지 않음
오버플로우 플래그오버플로우가 발생했는지1일 경우 오버플로우 발생, 0일 경우 발생하지 않음
인터럽트 플래그인터럽트가 가능한지1일 경우 가능, 0일 경우 불가능
슈퍼바이저 플래그커널 모드로 실행 중인지, 사용자 모드로 실행 중인지1일 경우 커널 모드. 0일 경우 사용자 모드

이러한 플래그들은 플래그 레지스터에 저장된다.

제어장치

제어 신호를 내보내고 명령어를 해석하는 부품

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

  • 클럭 신호
  • 해석해야 할 명령어
  • 플래그 레지스터 속 플래그
  • 제어 버스로 전달된 제어 신호

✍ 클럭이란 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위이며, 클럭의 주기에 맞춰 작업을 수행한다.

제어 장치가 내보내는 정보

  • CPU 외부에 전달하는 제어 신호

    • 메모리에 전달하는 제어 신호: 메모리에 저장된 값을 쓸 때
    • 입출력장치에 전달하는 제어 신호: 입출력 장치의 값을 읽거나 새로운 값을 쓸 때
  • CPU 내부에 전달하는 제어 신호

    • ALU에 전달하는 제어 신호: 수행할 연산을 지시하기 위해
    • 레지스터에 전달하는 제어 신호: 레지스터 간에 데이터를 이동, 저장된 명령어를 해석

레지스터

CPU 제조사들마다 이름, 크기, 종류가 다양하다. 그 중에서 공통으로 포함하고 있는 레지스터들이 있다.

  • 프로그램 카운터(PC, Program Counter)
    : 메모리에서 읽어 들일 명령어의 주소를 저장. 명령어 포인터(IP, Instruction Pointer)라고 부르는 CPU도 있다.

  • 명령어 레지스터(IR, Instruction Register)
    : 메모리에서 읽어 들인 명령어를 저장. 제어장치는 명령어 레지스터 속 명령어를 받아들이고 해석한 뒤 제어 신호를 내보낸다.

  • 메모리 주소 레지스터(MAR, Memory Address Register)
    : 메모리의 주소를 저장.

  • 메모리 버퍼 레지스터(MBR, Meomory Buffer Register)
    : 메모리와 주고받을 값(데이터와 명령어)을 저장. 메모리 데이터 레지스터(MDR, Memory Data Register)라고도 부른다.

  • 플래그 레지스터(flag register)
    : 연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장하는 레지스터

  • 범용 레지스터(general purpose register)
    : 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터.

  • 스택 포인터

  • 베이스 레지스터

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

1. 스택 주소 지정 방식

스택 주소 지정 방식은 스택과 스택 포인터(stack pointer)를 이용한 주소 지정 방식이다. 스택 포인터란 스택의 꼭대기를 가리키는 레지스터로 스택의 어디까지 데이터가 채워져 있는지에 대한 표시이다.

💡 스택? 한쪽 끝이 막혀 있는 통과 같은 저장 공간이다. 가장 최근에 저장하는 값부터 꺼낼 수 있다(Last In First Out, LIFO). 이는 메모리 안에 스택처럼 사용할 영역이 정해져 있으며 스택 영역이라고 한다.

2. 변위 주소 지정 방식

오퍼핸드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식

변위 주소 지정 방식을 사용하는 명령어는 연산 코드 필드, 레지스터 필드, 오퍼랜드 필드가 있다.

어떤 레지스터를 더하는지에 따라 상대 주소 지정 방식, 베이스 레지스터 주소 지정 방식으로 나뉜다.

  • 상대 주소 지정 방식(relative addressing mode)

오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식. 모든 코드를 실행하는 것이 아닌, 분기 하여 특정 주소의 코드를 실행할 때 사용.

  • 베이스 레지스터 주소 지정 방식(base-register adadressing mode)

오퍼랜드와 베이스 래지스터의 값을 더하여 유효 주소를 얻는 방식.
베이스 레지스터 = 기준주소, 오퍼랜드 = 기준 주소로부터 떨어진 거리의 역할을 하며 베이스 레지스터 속 기준 주소로부터 얼마나 떨어져 있는 주소 접근할 것인지를 연한하여 주소를 얻어낸다.

상용 CPU의 레지스터 자세하게 들여다 보기

명령어 사이클과 인터럽트

명령어 사이클

프로그램은 수많은 명령어로 이루어져 있고, CPU는 이 명령어들을 하나씩 실행한다. 이때 명령어들은 일정한 주기로 반복되며 실행한다. 이를 명령어 사이클(instruction cycle)이라고 한다.

명령어 사이클 과정
1. 인출 사이클(fetch cycle) - 메모리에 있는 명령어를 CPU로 가지고 오는 단계
2. 실행 사이클(execution cycle) - 가져온 명령어를 실행하는 단계
: 제어장치가 명령어 레지스터에 담긴 값을 해석하고, 제어 신호를 발생시킨다.

간접 주소 지정 방식의 경우 명령어를 인출하여 CPU로 가져왔다 하더라도 곧바로 실행할 수 없는 데, 명령어를 실행하기 위해 메모리 접근을 한 번 더 해야 한다. 이 단계를 간접 사이클(indirect cycle)이라고 한다.

인터럽트

CPU가 수행 중인 작업은 방해를 받아 잠시 중단될 수 있는데, CPU의 작업을 방해하는 신호를 인터럽트(interupt)라고 한다.

인터럽트의 종류

동기 인터럽트(synchronous interupt)

  • CPU에 의해 발생
  • 명령어를 수행하다가 프로그래밍상의 오류와 같은 예외적인 상황에 마주쳤을 때 발생
  • 예외(exeption)라고 부름

비동기 인터럽트(asynchronous interupt)

  • 입출력장치에 의해 발생
  • 작업을 끝낸 입출력장치가 완료 알림(인터럽트)를 보낼 때
  • 일반적으로 인터럽트(하드웨어 인터럽트)라고 부름

하드웨어 인터럽트

하드웨어 인터럽트는 알림과 같은 인터럽트다. 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 사용된다.

하드웨어 인터럽트 처리 순서

  1. 입출력장치는 CPU에 인터럽트 요청 신호를 보낸다.
  2. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.
  3. CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인한다.
  4. 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업한다.
  5. CPU는 인터럽트 벡터를 찹조하여 인터럽트 서비스 루틴을 실행한다.
  6. 인터럽트 서비스 루틴 실행이 끝나면 (4)에서 백업해 둔 작업을 복구하여 싱행을 재개
  • 인터럽트 요청 신호
    : 인터럽트는 CPU의 정상적인 흐름을 끊는 것이기에 인터럽트하기 전에 CPU에 물어본다.

  • 인터럽트 플래그
    : 하드웨어 인터럽트를 받아들일지, 무시할지를 결정하는 플래그

인터럽트 플래그가 불가능으로 설정되어 있어도 무시할 수 없는 인터럽트 요청잉 있는데 정전이나 하드웨어 고장 같은 우선순위가 가장 높은 인터럽트가 이에 해당 된다.

  • 인터럽트 서비스 루틴(Interupt service Routine, ISR)
    : 인터럽트 핸들러라고도 부르며, 어떻게 작동할지에 대한 정보로 이루어진 인터럽트를 처리하기 위한 동작들로 프로그램.

  • 인터럽트 벡터(interupt vector)
    : 인터럽트 서비스 루틴을 식별하기 위한 정보.

0개의 댓글