CPU

CPU 는 메모리에 저장된 명령어를 읽고 해석하여 실행합니다.

CPU 의 구성 요소

  1. 산술논리연산장치 (ALU)
  2. 제어장치 (Controll Unit : CU)
  3. 레지스터 셋 (Register Set)

ALU

ALU 는 CPU 내부 구성 요소 중 하나로, 덧셈, 뺄셈, 곱셈, 나눗셈, 논리 연산 등 계산을 위해 존재하는 부품 (계산용 회로)입니다.

  • ALU 는 CPU 연산에 필요한 데이터를 받아들이고 값을 연산 하는 역할을 합니다. 구체적으로는 레지스터로부터 피연산자를 받아들이고 제어장치로부터 제어 신호를 받아들입니다.
  • 연산이 끝나면 그 결과값(0 과 1로 표현된 숫자, 문자 혹은 주소)을 내보내게 되는데 이 결과값은 레지스터에 저장됩니다. 이 레지스터를 바탕으로 메모리에 쓰거나 다른 레지스터와의 연산을 하게 됩니다. 또한, ALU 는 결과값 뿐만 아니라 연산결과 대한 부가정보로 Flag 정보도 내보내게 되는데 이는 플래그 레지스터 에 저장됩니다.

연산 결과를 Memory 가 아닌 Register 에 담는 이유

Memory 는 CPU 밖에 위치합니다. 이와 달리 레지스터는 CPU 의 구성요소이기 때문에 CPU 내부에 위치합니다. 상식적으로 생각해봐도 Memory 에 접근하는 속도보다 Register 에 접근하는 것이 더 빠르기 때문에 레지스터에 연산 결과를 저장하게 됩니다.

Flag 종류

ALU 는 결과값 뿐만 아니라 연산결과 대한 부가정보로 Flag 정보 도 내보냅니다. 대부분의 CPU 가 공통적으로 포함하고 있는 Flag 종류는 다음과 같습니다.

부호 플래그

  • 연산한 결과의 부호를 나타내빈다.
  • 플래그가 1이면 음수, 0이면 양수를 의미합니다.

제로 플래그

  • 연산 결과가 0 인지 여부를 나타냅니다.
  • 플래그가 1이면 결과가 0, 0일경우 결과가 0이 아님을 의미합니다.

캐리 플래그

  • 연산 결과가 올림수나 빌림수가 발생했는지를 나타냅니다.
  • 플래그가 1이면 자리 올림수 혹은 빌림수가 발생했음을 의미하고, 0이면 발생하지 않았음을 의미합니다.

오버플로우 플래그

  • 오버플로우(연산결과가 레지스터의 크기보다 커 값을 담을 수 없다는 정보)가 발생했는지를 나타냅니다.
  • 플래그가 1이면 오버플로우 발생, 0이면 발생하지 않음을 의미합니다.

인터럽트 플래그

  • 인터럽트가 가능한지를 나타냅니다.
  • 플래그가 1이면 인터럽트가 가능함을 의미하며, 0이면 인터럽트가 불가능함을 의미합니다.
  • 인터럽트는 운영체제와 관련된 내용입니다.

슈퍼바이저 플래그

  • 현재 모드가 커널모드인지 사용자모드로 실행중인지를 나타냅니다.
  • 플래그가 1이면 커널모드로 실행중임을 의미하며, 0이면 사용자모드로 실행중임을 의미합니다.
  • 이 또한 운영체제와 관련된 내용입니다.

Controll Unit

Controll Unit (제어장치) 는 컴퓨터 부품들을 관리하고 작동시키기 위한 전기신호인 제어신호 를 발생시키고, 명령어를 해석하는 장치입니다.

받아들이는 신호

  1. 클럭 신호 를 받아들입니다.
  2. IR(Instruction Register) 로 부터 해석할 명령어를 받아들이고, 그 명령어를 해석해서 제어신호를 내보냅니다.
  3. IR 로부터 받아들인 명령어를 해석하는 과정에서 부가정보가 필요할 수 있기 때문에 Flag Register 로부터 Flag 를 받아들입니다.
  4. 외부로부터 들어온 제어신호 를 받아들입니다. (제어신호는 CPU 의 제어장치 뿐만 아니라 입출력장치를 비롯한 여러 제어장치들도 제어신호를 발생시킬 수 있습니다)

클럭

클럭이란 컴퓨터의 모든 부품을 움직일 수 있게 하는 시간 단위를 말합니다. 이 클럭 신호 단위에 맞춰서 명령이 실행됩니다.(ex. Memory 에서 명령어를 가져오기)

내보내는 신호

제어장치는 IR(Instruction Register) 로 받아들인 명령어를 해석하여 크게 CPU 내부, 외부에 제어신호를 내보냅니다.

CPU 내부

  • ALU 에 수행할 연산 제어신호를 내보냅니다.
  • 레지스터 간에 데이터를 이동시키거나 해석하기 위한 제어신호를 레지스터에 내보냅니다.

CPU 외부

  • 메모리에 저장된 값을 읽고 싶을 땐 메모리를 향해 메모리 읽기라는 제어신호를 내보냅니다. (가져온 값은 레지스터에 저장됩니다.)
  • 메모리에 어떤 값을 저장하고 싶을 땐 메모리를 향해 메모리 쓰기라는 제어신호를 내보냅니다.

Register Set

Register(레지스터)는 CPU 내부의 작은 임시 저장장치 입니다. 프로그램 속 명령어와 데이터는 실행 전후로 레지스터에 저장됩니다. CPU 안에는 여러 개의 레지스터가 존재하고, 각기 다른 이름과 역할을 가지고 있습니다. 그리고 이 Register 들의 집합을 Register Set 이라고 합니다.

Register 종류

레지스터의 종류는 CPU 의 종류마다 모두 다르다. 그래도 대부분의 CPU 가 공통적으로 사용하는 CPU 가 있습니다.

Program Counter

  • 프로그램 카운터(PC) 라고 불리며 메모리에서 가져올 다음 명령어의 주소를 저장하는 레지스터입니다.

Instruction Register

  • 명령어 레지스터(IR) 라고 불리며 현재 수행할 명령어의 주소를 저장하는 레지스터입니다. (CPU 로 이미 읽어들인 명령어)
  • Controll Unit(제어장치) 가 IR 의 명령어를 받아들여서 해석하고, 제어신호를 보내게 됩니다.

Memory Address Register

  • 메모리 주소 레지스터(MAR) 라고 불리며 메모리의 주소를 저장하는 레지스터입니다.
  • CPU 가 읽어 들이고자 하는 주소를 주소 버스로 보낼 때 거치는 레지스터입니다. (CPU 가 읽어 들이고자 하는 주소값을 주소 버스로 주고 받습니다.)

Memory Buffer Register

  • 메모리 버퍼 레지스터(MBR) 라고 불리며 메모리의 값을 저장하는 레지스터입니다.
  • CPU 가 정보(데이터와 명령어)를 데이터 버스로 주고받을때 거치는 레지스터입니다.

Flag Register

  • 플래그 레지스터라고 불리며 ALU 가 내보낸 플래그 값이 저장됩니다.

General Purpose Register

  • 범용 레지스터 라고 불립니다.
  • 이름 그대로 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터이며 여러 종류가 있습니다.
  • 주소, 명령어, 데이터 모두 담을 수 있습니다.

Stack Pointer

  • Stack 의 꼭대기를 가리키는 레지스터입니다. (스택이 어디까지 차 있는지에 대한 표시)
  • Stack 과 Stack Pointer 를 이용한 주소지정 방식인 스택 주소 지정 방식에서 사용됩니다.

Base Register

  • 변위 주소 지정 방식 에서 사용되는 레지스터이며, 변위 주소 지정 방식에서 기준 주소를 담고 있는 레지스터입니다.
  • 변위 주소 지정 방식은 Operand 필드의 값특정 레지스터의 값을 더하여 유효주소를 얻는내는 주소 지정 방식입니다.
  • 변위 주소 지정 방식에서 사용되는 특정 레지스터가 베이스 레지스터이며, 이는 변경될 수 있습니다.

명령어 사이클

CPU 는 메모리로부터 명령어나 데이터를 갖고와서 실행하고 값을 저장할 수 있습니다. 이렇게 데이터를 가져오거나 명령어를 실행하는 과정은 모두 정형화된 Cycle 이 있습니다. 이 사이클을 명령어 사이클(Instruction Cycle) 이라고 합니다. 명령어 사이클는 크게 인출 사이클, 간접사이클, 실행 사이클, 인터럽트 사이클 로 구분되며 이 사이클들이 반복되면서 명령어가 실행됩니다.

다시말해 명령어 사이클은 컴퓨터에서 명령어를 처리하는 정형화된 사이클입니다.

간접 사이클

CPU 로 명령어를 인출해와도 메모리 접근이 더 필요하여 바로 실행이 불가능할 때가 있습니다. 대표적인 예가 간접 주소 지정 명령어를 사용했을 때 입니다. 해당 경우에는 인출 간접 실행 순으로 실행되게 됩니다.

인출 사이클

메모리에 저장된 값을 CPU 내부로 값고오는 것을 인출 이라고 하며, 메모리의 데이터를 CPU 로 가져오는 주기를 인출 사이클 이라고 합니다.

실행 사이클

메모리에서 데이터와 명령어를 CPU 로 가져왔으면 실행해야합니다. 즉, 실행 사이클은 CPU에서 명령어를 실행하는 사이클 입니다.

인터럽트

CPU 는 정해진 흐름(명령어 사이클) 에 맞춰 데이터를 가져오거나 명령어를 실행합니다. 하지만 이러한 흐름을 방해하는 신호가있는데 그 신호를 인터럽트(Interrupt)라고 합니다.

인터럽트는 CPU 가 기존 명령어를 처리하는 과정에서 먼저 처리해야할 작업이 생겼을 때 발생합니다.

인터럽트 종류

동기 인터럽트

  • 예외라고 불리며, CPU 가 예기치 못한 상황을 접했을 때 발생합니다.
  • 실행중인 명령어 사이클을 멈추고, 예외를 먼저 처리하게 됩니다.

비동기 인터럽트

  • 하드웨어 인터럽트라고 불리며, 주로 입출력장치에 의해 발생하는 인터럽트입니다.
  • CPU는 입출력 장치의 작업 완료를 기다리지 않고, 인터럽트를 통해 통지받아 효율적으로 다른 작업을 수행할 수 있습니다.
  • 하드웨어 인터럽트가 없다면, CPU 는 프린터와 같은 입출력 장치에게 주기적으로 작업 완료 여부에 대한 신호를 보내야 합니다. 하드웨어 인터럽트가 있어서, 입출력 작업 동안 CPU 는 다른 일을 할 수 있게 됩니다.

비동기 인터럽트 처리 순서

  1. IO 장치는 CPU 에 인터럽트 요청 신호를 보냅니다.
  2. CPU 는 실행 사이클이 끝나고, 다음 명령어를 인출하기 전 항상 인터럽트 여부를 확인합니다.
  3. CPU 는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인합니다.
  4. 인터럽트를 받아들일 수 있다면 CPU 는 지금까지의 작업을 백업한다.
  5. CPU 는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행합니다.
  6. 인터럽트 서비스 루틴 실행이 끝나면 백업해둔 작업을 복구하여 실행을 재개합니다.

인터럽트 처리

CPU 가 인터럽트를 처리한다는 것은 인터럽트 서비스 루틴을 수행하고, 본래 수행하던 작업으로 다시 되돌아오는 것을 의미합니다. 보다 정확히는 인터럽트 서비스 루틴으로 jmp 하기 전, 레지스터(PC, IR 등) 내용들을 모두 Stack 에 백업해두고, 인터럽트를 처리합니다. 처리가 완료되면 Stack 의 내용들을 pop 하여 인터럽트 서비스 루틴을 실행하기 전 상황으로 복귀하게 됩니다.

인터럽트 요청 신호

  • CPU 의 작업을 방해하는 인터럽트에 대한 요청 신호입니다.
  • CPU 에게 “지금 끼어들어도 되냐?” 는 요청을 보내는 신호라고 생각하면 됩니다.

인터럽트 플래그

  • Flag Register 안에 저장된 Flag 의 한 종류이며, CPU 가 인터럽트 요청을 받아들일지 무시할지를 결정하는 Bit 입니다.
  • 이 플래그에 의해 인터럽트를 차단(마스킹)할 수 있습니다.
  • 하지만 이 플래그로 차단할 수 없는 인터럽트를 비차단 인터럽트(Non-Maskable Interrupt, NMI)라고 합니다.
    • 쉽게 말해, 일반 인터럽트는 “받을래? 말래?” 하고 CPU가 결정할 수 있지만
    • 비차단 인터럽트는 “아무리 인터럽트 플래그가 꺼져 있어도 무조건 받아야 해!” 하는 긴급한 신호를 말합니다.

인터럽트 서비스 루틴(Interrupt Service Routine : ISR)

  • 인터럽트가 발생했을 때, 해당 인터럽트를 처리하는 방법이 기록된 프로그램 코드(프로그램)입니다.
  • 프로그램이기 때문에 메모리에 저장되어 있습니다.
  • 인터럽트를 발생시킨 장치(예: 프린터, 키보드)에 따라 각각 다른 ISR의 시작 주소를 갖고 있습니다.
  • 인터럽트를 발생시킨 장치(예: 프린터, 키보드)에 따라 각각 다른 ISR의 시작 주소를 갖고 있어, CPU는 이를 참조해 적절한 ISR을 실행합니다.

인터럽트 벡터

  • 각 인터럽트에 대응하는 인터럽트 서비스 루틴(ISR)의 시작 주소를 저장한 정보입니다.
  • CPU가 어떤 인터럽트가 발생했는지 구분하고, 해당 인터럽트를 처리할 ISR의 위치를 알기 위해 사용합니다.
  • 즉, 인터럽트 종류별로 ISR의 주소를 가리키는 식별자 역할을 합니다.