ALU와 제어장치
CPU는 메모리에 저장된 명령어를 읽어 들이고, 해석하고, 실행하는 장치입니다.
CPU 내부에는 계산을 담당하는 ALU, 명령어를 읽어 들이고 해석하는 제어장치, 작은 임시 저장 장치인 레지스터라는 구성 요소가 있습니다.
이번글에서는 ALU와 제어장치에 대해서 구체적으로 다뤄보겠습니다.
ALU
이 그림은 ALU가 어떤 정보를 받아들이고 내보내는지를 표현한 그림입니다.
계산을 할 때 생각해봅시다. 1+2 을 연산하고 싶을때 1,2 피연산자가 필요하고 더하기라는 수행할 연산이 필요합니다.
ALU는 '계산하는 부품'입니다. 위 연산을 기억하며 그림을 보고 생각해 봅시다.
- ALU는 레지스터를 통해 피연산자를 받아들입니다. ( 1,2 를 받아들이는 것과 같습니다.)
- 제어장치로부터 수행할 연산을 알려주는 제어 신호를 받아들입니다.( 데이터 읽기, 쓰기 등..)
- ALU는 레지스터와 제어장치로부터 받아들인 피연산자와 제어 신호로 산술연산, 논리 연산 등 다양한 연산을 수행
ALU는 연산된 결과를 바로 메모리에 저장하지 않고 일시적으로 레지스터에 저장합니다.
그 이유는 CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 훨씬 느립니다( 메모리 접근 속도 < 레지스터 접근 속도 )
레지스터는 CPU내부에 있기 때문입니다.
ALU가 연산할 때마다 결과를 메모리에 저장하게 된다면 CPU가 프로그램 실행 속도를 늦출 수 있습니다.
플래그
마지막으로 계산 결괏값 외에 ALU가 내보내는 또 다른 정보로 플래그를 내보냅니다.
플래그는 이진수가 양수인지 음수인지 판단하기 어렵기 때문에 플래그를 사용하곤 합니다.
이처럼 때때로 ALU는 결괏값뿐만 아니라 연산 결과에 대한 추가적인 정보를 내보내야 할 때가 있습니다.
예시는 다음과 같습니다.
- 연산 결과가 음수일때 ALU는 방금 계산한 결과가 음수라는 추가 정보를 내보냅니다.
- 연산 결과가 연산 결과를 담을 레지스터보다 클 때 ALU는 결과값이 너무 크다라는 추가 정보를 내보냅니다.
다시 말하면 플래그는 연산 결과에 대한 추가적인 상태정보 입니다. 플래그 종류는 여러가지가 있습니다.
또한 플래그들은 플래그 레지스터라는 레지스터에 저장됩니다.
플래그 종류 | 의미 | 사용 예시 |
부호 플래그 | 연산한 결과의 부호를 나타낸다 | 부호 플래그 1 : 계산 결과는 음수 부호 플래그 0 : 계산 결과는 양수 |
제로 플래그 | 연산 결과가 0인지 여부를 나타낸다 | 제로 플래그 1 : 연산 결과는 0 제로 플래그 0 : 연산 결과는 0이 아님을 의미 |
캐리 플래그 | 연산 결과 올림수나 빌림수가 발생했는지를 나타낸다. | 캐리 플래그 1 : 올림수나 빌림수가 발생했음을 의미 캐리 플래그 0 : 발생하지 않았음을 의미 |
오버플로우 플래그 | 오버플로우가 발생했는지를 나타낸다 | 오버플로우 플래그 1 : 오버플로우가 발생했음을 의미 오버플로우 플래그 0 : 발생하지 않았음을 의미한다. |
인터럽트 플래그 | 인터럽트가 가능한지를 나타낸다. | 인터럽트 플래그 1 : 인터럽트가 가능함을 의미 인터럽트 플래그 0 : 인터럽트가 불가능함을 의미한다. |
슈퍼바이저 플래그 | 커널 모드로 실행 중인지, 사용자 모드로 실행 중인지를 나타낸다. | 슈퍼바이저 플래그 1 : 커널 모드로 실행 중임을 의미 슈퍼바이저 플래그 0 : 사용자 모드로 실행 중임을 의미한다. |
부호 플래그
연산한 결과의 부호를 나타낸다.
- 부호 플래그 1 : 계산 결과는 음수
- 부호 플래그 0 : 계산 결과는 양수
제어장치
제어장치는 제어 신호를 내보내고, 명령어를 해석하는 부품입니다.
그리고 제어 신호는 컴퓨터 부품들을 관리하고 작동시키기 위한 일종의 전기 신호입니다.
1. 제어장치는 클럭 신호를 받아들입니다.
클럭(clock)
컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위입니다.
클럭의 "똑-딱-똑-딱" 주기에 맞춰 한 레지스터에서 다른 레지스터로 데이터가 이동되거나, ALU에서 연산이 수행되거나, CPU가 메모리에 저장된 명령어를 읽어 들이는 것입니다.
하지만 주의해야합니다. 컴퓨터의 모든 부품이 한 클럭마다 작동한다라고 이해하면 안됩니다.
컴퓨터 부품들은 클럭이라는 박자에 맞춰 작동할 뿐이지 한 박자마자 작동하는 것은 아닙니다.
다음 그림은 하나의 명령어가 여러 클럭에 걸쳐 실행되고 있습니다.
2. 제어장치는 '해석해야 할 명령어'를 받아들입니다.
CPU가 해석해야 할 명령어는 명령어 레지스터라는 특별한 레지스터에 저장됩니다.
제어장치는 이 명령어 레지스터로부터 해석할 명령어를 받아들이고 해석한 뒤, 제어 신호를 발생시켜 컴퓨터 부품들에 수행해야 할 내용을 알려줍니다.
3. 제어장치는 플래그 레지스터 속 플래그 값을 받아들입니다.
플래그는 ALU연산에 대한 추가적인 상태 정보라고 했습니다.
제어장치게 제어 신호를 통해 컴퓨터 부품들을 제어할 때 이 중요한 상태 정보를 무시하면 안되겠죠?
제어장치는 이 플래그 값을 받아들이고 이를 참고하여 제어 신호를 발생시킵니다.
4. 제어장치는 시스템 버스, 그 중에서 제어 버스로 전달된 제어 신호를 받아들입니다.
제어 신호는 CPU뿐만 아니라 입출력 장치를 비롯한 CPU 외부 장치도 발생시킬 수 있습니다.
제어장치는 제어 버스를 통해 외부로부터 전달된 제어 신호를 받아들이기도 합니다.
다시 정리 해봅시다.
제어신호는 다음과 같은 정보들을 받아들입니다.
- 클럭 신호를 받아들입니다.
- '해석해야 할 명령어'를 받아들입니다.
- 플래그 레지스터 속 플래그 값을 받아들입니다.
- 시스템 버스 중 제어 버스로 전달된 제어 신호를 받아들입니다.
제어장치가 내보내는 정보
- CPU 외부에 전달하는 제어 신호
- 제어 버스로 제어신호를 보내는 것입니다.
- 예시로 메모리에 전달하는 제어신호 / 입출력장치로 전달하는 제어신호가 있습니다.
- CPU 내부에 전달하는 제어 신호
- ALU에 수행할 연산을 지시하기 위해 ALU에 전달하는 제어신호
- 레지스터 간에 데이터를 이동시키거나 레지스터에 저장된 명령어를 해석하기 위해 레지스터에 전달하는 제어신호