ALU
ALU(Arithmetic Logic Unit)는 컴퓨터의 중앙 처리 장치(CPU) 또는 마이크로컨트롤러 내에서 산술 연산과 논리 연산을 수행하는 핵심 구성 요소이다. ALU는 계산과 논리 판단을 위한 다양한 정보를 입력으로 받고 이를 처리한 결과를 출력으로 내보낸다.
*계산을 하기 위해서는 피연산자와 수행할 연산(제어 신호)이 필요하다. 계산된 결과값은 임시적으로 레지스터에 담긴다. 그 이유는 cpu가 메모리에 접근하는 속도보다 레지스터에 접근하는 속도가 더 빠르기 때문이다.ALU의 플래그와 플래그 레지스터
플래그(Flags)
플래그는 ALU가 연산을 수행한 결과의 특정 상태를 나타내는 단일 비트 정보이다. 주요 플래그는 다음과 같다.
(1) Carry Flag (CF)
- 역할: 자리 올림(Carry) 또는 자리 내림(Borrow)이 발생했는지를 나타낸다.
- 예: 두 개의 8비트 값을 더할 때, 결과가 9비트를 초과하면 Carry Flag가 설정된다.
(2) Zero Flag (ZF)
- 역할: 연산 결과가 0인지 여부를 나타낸다.
- 설정 조건: 결과가 0이면 설정(1), 그렇지 않으면 해제(0).
(3) Sign Flag (SF)
- 역할: 연산 결과의 부호를 나타낸다.
- 설정 조건: 결과의 최상위 비트(부호 비트)가 1이면 설정(음수), 0이면 해제(양수).
(4) Overflow Flag (OF)
- 역할: 부호 있는 연산에서 오버플로우가 발생했는지를 나타낸다.
- 설정 조건: 두 개의 같은 부호 값을 더했을 때 부호가 반대인 결과가 나올 경우 설정된다.
(5) Auxiliary Carry Flag (AF)
- 역할: 4비트 경계에서 자리 올림이 발생했는지를 나타낸다.
- 용도: BCD(Binary-Coded Decimal) 연산에 주로 사용된다.
(6) Parity Flag (PF)
- 역할: 연산 결과의 1 비트 개수가 짝수인지 홀수인지를 나타낸다.
- 설정 조건: 1 비트의 개수가 짝수이면 설정, 홀수이면 해제.
플래그 레지스터 (Flag Register)
플래그 레지스터는 위에서 설명한 플래그 상태들을 저장하고 관리하는 특수 레지스터이다. CPU가 연산 결과를 참조하거나 조건부 명령을 실행할 때 사용된다.
특징
- 각 플래그는 플래그 레지스터의 특정 비트에 저장된다.
- 플래그 레지스터는 CPU의 아키텍처에 따라 크기가 달라질 수 있다.
ex) x86 아키텍처에서는 16비트의 플래그 레지스터가 사용된다.구조
- 플래그 레지스터의 각 비트는 특정 플래그를 나타낸다. 예를 들어:
- 0번 비트: Carry Flag (CF)
- 2번 비트: Parity Flag (PF)
- 6번 비트: Zero Flag (ZF)
- 7번 비트: Sign Flag (SF)
- 11번 비트: Overflow Flag (OF)
플래그의 활용
- 플래그는 조건문 및 분기문 실행에 중요한 역할을 한다.
ex)if조건의 결과를 결정하거나, 특정 조건에 따라 명령어를 실행한다.- ALU 연산 후 설정된 플래그를 기반으로 CPU는 다음 명령을 결정한다.
4. 요약
- 플래그: ALU 연산 결과를 나타내는 단일 비트 정보.
- 플래그 레지스터: 여러 플래그를 비트 단위로 저장하는 레지스터.
- 사용 목적: CPU의 상태를 나타내고 조건부 연산을 실행하는 데 사용된다.
제어장치(Control Unit, CU)
제어장치는 컴퓨터의 중앙처리장치(CPU) 내부에서 중요한 역할을 하는 구성 요소로, 컴퓨터 시스템이 명령어를 해석하고 실행하도록 제어 신호를 생성하고 전달하는 역할을 한다. 제어장치는 ALU, 메모리, 입출력 장치 등 컴퓨터의 모든 구성 요소가 조화를 이루어 동작할 수 있도록 조율한다.
제어장치의 역할
- 명령어 해석(Instruction Decoding)
- 메모리에서 가져온 명령어(Instruction)를 해독하여, 어떤 작업을 수행해야 하는지 결정한다.
- ex) 산술 연산, 데이터 이동, 조건 분기 등.
- 제어 신호 생성(Control Signal Generation)
- 각 하드웨어 구성 요소에 명령어 실행에 필요한 신호를 보낸다.
- ex) ALU에 연산 명령, 메모리 읽기/쓰기 명령, 데이터 버스 활성화 등.
- 순서 제어(Sequencing)
- 명령어를 순차적으로 실행하도록 CPU의 동작을 제어한다.
- 필요에 따라 분기문, 루프 등의 흐름 제어를 수행한다.
- 타이밍 제어(Timing Control)
- CPU 내부와 외부의 작업이 올바른 시간에 이루어지도록 신호를 동기화한다.
- 클럭 신호를 기반으로 동작한다.
제어장치의 구성 요소
- 명령 레지스터(Instruction Register, IR)
- 현재 실행 중인 명령어를 저장한다.
- 제어장치는 IR에 저장된 명령어를 분석하고 실행한다.
- 프로그램 카운터(Program Counter, PC)
- 다음에 실행할 명령어의 주소를 저장한다.
- 명령어 실행 후 자동으로 증가하거나 분기 명령에 따라 변경된다.
- 디코더(Decoder)
- 명령어를 해석하여 제어 신호를 생성한다.
- 클럭 발생기(Clock Generator)
- 모든 동작을 동기화하는 클럭 신호를 생성한다.
제어장치의 종류
- 하드와이어드 제어장치 (Hardwired Control Unit)
- 고정된 하드웨어 회로를 사용해 제어 신호를 생성한다.
- 장점: 빠르다, 실시간 처리에 적합하다.
- 단점: 설계가 복잡하고 유연성이 떨어진다. 변경이 어렵다.
- 마이크로프로그래밍 제어장치 (Microprogrammed Control Unit)
- 마이크로코드라는 소프트웨어를 통해 제어 신호를 생성한다.
- 장점: 설계가 유연하고 수정이 쉽다.
- 단점: 속도가 느리다.
제어장치의 동작 과정
- 명령어 가져오기(Fetch)
- 프로그램 카운터(PC)에 저장된 주소를 사용해 메모리에서 명령어를 가져온다.
- 가져온 명령어는 명령 레지스터(IR)에 저장된다.
- 명령어 해석(Decode)
- IR에 저장된 명령어를 해석하여 필요한 연산과 데이터를 결정한다.
- 명령어 실행(Execute)
- 해석된 명령어에 따라 ALU, 메모리, 입출력 장치 등에 제어 신호를 전달하여 실행한다.
- 결과 저장(Store)
- 연산 결과를 레지스터 또는 메모리에 저장한다.
제어장치의 중요성
- 중앙 조율자 역할: 컴퓨터 시스템의 모든 구성 요소가 협력하여 작업을 수행할 수 있도록 조율한다.
- 정확성과 효율성 보장: 명령어를 정확히 실행하고, 하드웨어 자원을 효율적으로 활용하도록 지원한다.
제어장치와 ALU의 차이
- 제어장치(CU): 명령어를 해석하고, 제어 신호를 생성하여 CPU 전체를 조율한다.
- 산술논리연산장치(ALU): 산술 및 논리 연산을 실제로 수행한다.
둘은 협력하여 CPU의 주요 기능을 수행한다.
레지스터(Register)란?
레지스터는 컴퓨터 시스템에서 데이터를 일시적으로 저장하는 매우 빠른 임시 기억 장치이다. CPU 내부에 위치한 레지스터는 연산과 데이터 처리를 빠르게 수행할 수 있도록 도와준다. 레지스터는 메모리보다 훨씬 더 빠른 속도로 데이터를 읽고 쓸 수 있어, CPU가 명령을 실행하는 데 중요한 역할을 한다.
레지스터의 특징
- 속도
- 레지스터는 CPU 내부에 있기 때문에 메모리(RAM)보다 훨씬 더 빠른 속도로 데이터를 처리할 수 있다.
- 메모리에서 데이터를 가져오는 데 시간이 걸리는 반면, 레지스터는 한 클럭 주기 내에 데이터를 읽고 쓸 수 있다.
- 크기
- 레지스터의 크기는 몇 비트로 제한된다. 예를 들어, 32비트 시스템에서는 32비트 크기의 레지스터가 일반적이고, 64비트 시스템에서는 64비트 크기의 레지스터를 사용한다.
- 레지스터는 정수, 실수, 주소, 플래그 등 다양한 데이터를 저장할 수 있다.
- 내부 구조
- 레지스터는 단일 비트 또는 비트 집합으로 구성된 다수의 저장 위치를 갖고 있다.
- CPU는 각 레지스터를 활용하여 빠르게 연산을 수행한다.
- CPU와 밀접한 관계
- 레지스터는 CPU 내부에 존재하며, CPU가 명령어를 처리하는 동안 필요한 데이터를 임시로 저장하는 데 사용된다.
- 레지스터는 데이터를 연산하거나 다른 레지스터와 교환하는 데 사용되며, 이 과정을 통해 계산이 이루어진다.
레지스터의 종류
- 일반 레지스터 (General-purpose Register)
- 범용 레지스터는 CPU 연산 중에 사용되는 데이터 저장소이다. 연산 중간 결과나 임시 데이터를 저장할 때 사용된다.
- 예: AX, BX, CX, DX(x86 아키텍처에서의 일반 레지스터)
- 특수 레지스터 (Special-purpose Register)
- 특정한 용도로만 사용되는 레지스터, 예를 들어, 프로그램 카운터(PC), 스택 포인터(SP) 등이 있다.
- 이들은 특정한 작업(예: 프로그램 흐름 제어)에만 사용된다.
프로그램 카운터(PC, Program Counter)
- 프로그램의 현재 실행 위치를 추적하는 레지스터이다. CPU는 PC 값을 확인하고, 해당 메모리 주소에서 명령어를 가져온다.
스택 포인터(SP, Stack Pointer)
- 스택을 추적하는 데 사용되는 레지스터이다. 함수 호출 시 스택에 데이터를 푸시(PUSH)하거나 팝(POP)하는 데 사용된다.
상태 레지스터 (Status Register) / 플래그 레지스터 (Flag Register)
- 연산 결과에 대한 상태를 저장하는 레지스터이다. 예를 들어, Carry, Zero, Overflow 등의 플래그가 저장된다.
- CPU 연산 후 결과를 기반으로 플래그를 설정하거나 변경한다.
- 변경 불가능한 레지스터 (Control Register)
- CPU의 운영 모드나 기타 제어 사항을 설정하는 데 사용된다. 예를 들어, 모드 레지스터, 인터럽트 마스크 등이 있다.
레지스터의 역할
- 연산 속도 향상
- 레지스터는 CPU 내부에서 직접 데이터를 처리하기 때문에, 메모리보다 빠르게 연산할 수 있다.
- CPU가 작업을 빠르게 수행할 수 있도록 도와준다.
- 중간 연산 결과 저장
- 연산 중간 결과나 데이터를 임시로 저장하는 데 사용된. 예를 들어, 덧셈을 수행하는 중에 두 수의 값을 저장하고, 더한 후 그 값을 다른 레지스터에 저장할 수 있다.
- 데이터 이동
- 데이터를 한 레지스터에서 다른 레지스터로 이동시키는 데 사용된다.
- 예를 들어, 한 레지스터에 있는 값을 다른 레지스터로 복사하거나 이동하는 작업을 수행한다.
- 주소 저장
- 메모리 주소를 저장하는 데 사용된다. 예를 들어, 메모리에서 데이터를 읽거나 쓸 때 메모리 주소를 저장하는 레지스터가 필요하다.
레지스터의 예시 (x86 아키텍처)
- EAX (Accumulator Register): 주로 산술 연산이나 함수 반환 값을 처리하는 데 사용된다.
- EBX (Base Register): 배열이나 구조체 등의 기준 주소를 저장하는 데 사용된다.
- ECX (Count Register): 반복문에서 카운터 역할을 한다. 예를 들어, 반복문을 실행할 때 횟수를 저장한다.
- EDX (Data Register): 데이터와 관련된 연산에서 사용된다. 예를 들어, 곱셈 연산에서 결과를 저장하는 데 사용될 수 있다.
- ESI, EDI: 소스 인덱스와 목적지 인덱스로, 주로 문자열 처리나 메모리 복사에서 사용된다.
레지스터와 메모리의 차이점
속도 차이
- 레지스터는 CPU 내부에 위치해 있어 메모리보다 훨씬 빠르다.
- 메모리는 상대적으로 느리며, 레지스터는 데이터 처리 속도를 높이는 데 중요한 역할을 한다.
용량 차이
- 레지스터는 용량이 매우 작고 제한적이다. 일반적으로 수십 개에서 수백 개의 레지스터만 존재한다.
- 반면, 메모리는 훨씬 많은 데이터를 저장할 수 있다.
목적
- 레지스터는 CPU가 연산을 처리하는 동안 사용되는 빠른 임시 저장소이다.
- 메모리는 영구 저장을 위한 대용량 저장소로, 프로그램이나 데이터를 저장하는 데 사용된다.
레지스터 사용 예시
예: 덧셈 연산 (x86 Assembly)
MOV AX, 5 ; AX 레지스터에 5를 저장 MOV BX, 10 ; BX 레지스터에 10을 저장 ADD AX, BX ; AX 레지스터에 BX의 값을 더해서 결과를 저장이 예시에서 AX와 BX는 레지스터이며, ADD 명령어는 이들 레지스터의 값을 더하여 AX 레지스터에 그 결과를 저장한다.
결론
레지스터는 컴퓨터 CPU 내부에 위치한 고속의 임시 저장소로, 연산 중간 데이터나 명령어의 빠른 처리를 위해 사용된다. 레지스터는 메모리보다 빠르지만 용량이 작고 제한적이며, 각기 다른 용도에 따라 범용 레지스터와 특수 레지스터로 구분된다. 레지스터를 적절히 활용하는 것은 CPU 성능을 극대화하고, 빠르고 효율적인 데이터 처리를 가능하게 한다.
클럭(Clock)
클럭(Clock)은 컴퓨터 시스템에서 작업의 동기화와 타이밍을 제어하는 데 사용되는 신호이다.
일정한 주기로 발생하는 전기적 펄스가 클럭 신호로, 이 신호는 컴퓨터의 중앙처리장치(CPU), 메모리, 입출력 장치 등 시스템의 각 구성 요소들이 동시에 동작하도록 조율하는 중요한 역할을 한다.
클럭의 특징
- 주기적 신호 (Pulse Signal)
- 클럭은 주기적으로 발생하는 신호로, 전압이 일정한 간격으로 높아졌다가 낮아지는 형태를 취한다.
- 이 주기는 클럭 주기라고 불리며, 1초 동안의 클럭 주기가 반복되는 횟수를 클럭 속도(Clock Speed)라고 한다.
- 클럭 속도 (Clock Speed)
- 클럭 속도는 헤르츠(Hz) 단위로 측정되며, CPU나 시스템의 처리 속도를 결정짓는 중요한 요소이다.
- 예를 들어, 3.5GHz CPU는 초당 35억 번의 클럭 신호를 처리할 수 있다는 의미이다. 클럭 속도가 빠를수록 CPU가 더 많은 명령을 처리할 수 있다.
- 타이밍 제어
- 클럭은 시스템의 다양한 부품 간에 동기화를 유지하며, 각각의 작업이 일정한 타이밍에 맞춰 수행되도록 돕는다.
- 각 부품은 클럭 신호에 맞춰 데이터를 처리하거나 명령을 실행한다.
클럭의 역할
- 명령 실행 동기화
- CPU 내부에서 명령어를 가져오고, 이를 디코딩하고 실행하며, 최종 결과를 저장하는 과정은 클럭 신호에 맞춰 순차적으로 처리된다.
- 각 명령이 처리되는 과정은 여러 클럭 사이클에 걸쳐 이루어지며, 이 사이클을 통해 명령이 실행된다.
- ex) 명령을 가져오고(fetch) 디코드하고, 실행하고, 결과를 메모리에 쓰는(write) 모든 작업은 클럭 신호에 의해 동기화된다.
- 데이터 전송
- 메모리, 저장 장치, 네트워크 장치 등 컴퓨터의 다른 하드웨어 간 데이터 전송도 클럭 신호에 맞춰 이루어진다.
- 각 데이터 전송은 특정 클럭 주기에 맞춰 처리되며, 이를 통해 시스템 전체의 데이터 흐름이 원활하게 이루어진다.
- 프로세서와 주변 장치 동기화
- CPU와 메모리, 입출력 장치 등의 각 부품은 클럭 신호를 기준으로 작업을 동기화하며, 서로 일관성 있게 동작하게 된다.
- 예를 들어, CPU가 메모리에서 데이터를 읽을 때, 메모리는 클럭 신호에 맞춰 데이터를 제공하고, CPU는 해당 데이터를 처리한다.
클럭의 종류
- 하드웨어 클럭
- 하드웨어 클럭은 시스템의 물리적인 부품으로, 칩셋이나 발진기(Oscillator)에서 생성되며, 시스템의 다양한 동작에 필요한 시간 신호를 제공한다.
- 시스템 클럭
- 시스템 클럭은 컴퓨터의 전반적인 시간 동기화를 담당하는 신호로, 모든 하드웨어 및 소프트웨어 작업이 일정한 시간에 맞춰 동작하도록 한다.
- 예를 들어, CPU가 한 사이클을 처리하는 시간이나, 메모리에서 데이터를 읽는 시간이 시스템 클럭의 주기에 맞춰 정해진다.
클럭 주기와 클럭 속도
- 클럭 주기(Clock Cycle)란, 클럭 신호가 한 번 높았다가 낮아지는 주기를 의미한다. 하나의 클럭 주기는 CPU가 한 번의 작업을 처리하는 시간이 된다.
- 클럭 속도는 초당 클럭 주기의 수를 의미하며, GHz(기가헤르츠) 단위로 측정된다. 예를 들어, 1GHz는 1초에 10억 번의 클럭 신호가 발생하는 것을 뜻한다.
따라서 빠른 클럭 속도는 CPU가 더 많은 작업을 빠르게 처리할 수 있게 해주며, 느린 클럭 속도는 상대적으로 처리 속도가 느리게 된다.
클럭과 성능의 관계
- 클럭 속도와 CPU 성능은 밀접하게 관련이 있지만, 클럭 속도가 빠르다고 해서 무조건 성능이 높다고 볼 수는 없다. CPU의 성능은 클럭 속도 외에도 여러 요인(예: CPU 아키텍처, 캐시 크기, 병렬 처리 능력 등)에 따라 달라지기 때문이다.
- 멀티코어 CPU는 클럭 속도 외에도 여러 개의 코어가 동시에 작업을 처리할 수 있어 성능이 더욱 향상될 수 있다.
클럭의 중요성
- 클럭은 컴퓨터 시스템의 동기화를 담당하는 중요한 요소로, 시스템의 다양한 부품이 정확한 시간에 맞춰 작업을 할 수 있도록 돕는다.
- 클럭 신호의 정확성은 시스템이 안정적으로 작동하는 데 중요한 역할을 하며, 클럭 속도가 빠르면 컴퓨터의 처리 성능이 증가할 수 있다.