[CS] 4. CPU 동작원리
안녕하세요, 루피입니다!
오늘은 CPU 동작원리에 대해 정리해보려합니다.
바로 시작합니다.
1. 제어 장치와 ALU
1) 제어 장치
제어 장치는 명령어 실행 순서를 제어합니다. 즉, 명령어를 해석하고 실행에 대한 흐름을 제어하는 역할을 합니다. 예를 들어 다음과 같은 과정이 잘 진행될 수 있도록 흐름을 제어합니다.
- 메모리에서 저장된 명령어를 가져옵니다.
- 명령어를 해석해 ALU에 보냅니다.
- 그러면 ALU는 계산을 실행하고 그 결과를 다시 메모리에 저장합니다.

즉, 제어 장치가 각 과정을 수행하는 것이 아니라 일련의 흐름에 따라 순차적으로 잘 수행될 수 있도록 신호를 발생시키는 역할을 하는 것 입니다.
2) ALU
ALU는 말 그대로 연산을 담당합니다. 즉, 산술 연산과 논리 연산을 담당합니다.
3) 전체 과정

고급언어 혹은 어셈블리 언어로 코드를 생성하면, 컴파일러나 어셈블러로 기계어 파일들이 생성됩니다.
이 파일들을 하나의 실행 가능한 프로그램으로 결합해야 하는데, 이를 링커라고 합니다. 즉, 링커는 컴파일러에 의해 생성된 여러 파일을 하나의 실행 가능한 파일로 결합하는 프로그램입니다. 그리고 만들어진 파일이 메모리에 이동하면, CPU는 해당 파일의 명령어를 실행합니다.
2. 레지스터
레지스터는 CPU 내에 있는 매우 빠른 데이터 저장소입니다. 레지스터는 고속의 데이터 저장 장치로 CPU가 처리하는 명령어에 필요한 데이터나 중간 결과를 일시적으로 저장하기 위해 사용됩니다.

1) 레지스터 종류 (사용 용도)
- 프로그램 카운터 (PC) : 다음에 실행할 명령어의 주소를 가지고 있는 레지스터입니다. 한 명령어가 실행되면, PC는 다음 명령어를 가리키도록 숫자를 증가시킵니다.
- 명령어 레지스트(Instruction Register : IR) : 현재 실행 중인 명령어를 저장하는 레지스터입니다.
- 메모리 주소 레지스터 (Memory Address Register, MAR) : 메모리에 접근할 때 사용할 주소를 저장하는 레지스터입니다.
- 메모리 버퍼 레지스터(MBR) : 메모리와 CPU 사이에 데이터를 전달할 때 사용하는 레지스터입니다.
- 누산기(Accumulator, AC) : 연산 수행에 대한 중간 결과를 저장하는 레지스터입니다.
레지스터는 용량이 매우 작기 때문에 필요한 정보를 모두 담아 둘 수 없습니다. 그렇기에 레지스터는 메모리와 지속적으로 통신해야하며, 단독으로 존재할 수 없습니다. 또한, 레지스터가 메모리와 통신할 때는 시스템 버스를 사용합니다. 따라서 레지스터와 메모리, 시스템 버스 간 관계를 표현하면, 다음과 같습니다.

2) 레지스터 VS 메모리
레지스터와 메모리는 둘다 공통적으로 데이터를 저장하는 데 사용된다는 점이 있습니다. 이 둘의 가장 큰 차이는 물리적으로 레지스터는 CPU 안에, 메모리는 CPU 외부에 있다는 점입니다.

| 레지스터 | 메모리 | |
|---|---|---|
| 위치 | CPU 내부에 위치 | CPU 외부에 위치 |
| 속도 | CPU의 일부분으로 매우 빠름 | 레지스터보다 느림 |
| 크기 | 매우 제한적 | 상대적으로 큼(보통 GB) |
| 용도 | 임시 데이터 저장, 명령어 실행에 대한 중간 결과 저장 | 프로그램 코드와 데이터를 저장 |
| 가격 | 비교적 비싼 편 | 레지스터에 비해 상대적으로 저렴 |
3. 명령어 사이클 (Instruction cycle)
명령어 사이클은 CPU가 프로그램 내 명령어를 처리하는 단계를 의미합니다. CPU가 명령어를 가져오고 해석하고 실행하는 과정을 통칭하며, 이 과정은 프로그램이 실행되는 동안 계속 반복됩니다.

이때, 명령어를 가져오는 것을 인출 사이클, 명령어를 해석하고 실행시키는 것을 실행 사이클이라고 합니다.
1) 인출 사이클
인출 사이클(fetch cycle)은 CPU가 명령어를 메모리에서 가져오는 단계입니다. 명령어 사이클의 첫 번째 단계이며, 명령어가 실행되기 전에 반드시 거쳐야 하는 과정입니다.
- CPU 내부의 프로그램 카운터에서 다음에 실행할 명령어의 메모리 주소를 확인한 후, 그 값을 메모리 주소 레지스터로 가져옵니다. (MAR ← PC)
- 메모리 주소 레지스터로 가져온 주소로 메모리에 접근한 후, 명령어를 읽어와 메모리 버퍼 레지스터를 거쳐 명령어 레지스터에 저장합니다.(IR ← MBR ← MAR)
- 명령어가 인출되면 프로그램 카운터는 다음 명령어의 주소를 가리키도록 1을 증가시킵니다. (PC ← PC +1)

이를 메모리와 레지스터 관점에서 정리하면 다음과 같습니다. PC에서 명령어의 메모리 주소를 MAR에 보낸다는 것은
- 접근해야 할 메모리 주소를 알고 있다는 것입니다.(예를 들어, PC 값을 300이라고 가정합니다.)
- 메모리 주소에서 명령어를 가져와 MBR에 저장합니다.
- 이후 명령어는 IR에 저장됩니다.

2) 실행 사이클
실행 사이클(excute cycle)은 말 그대로 CPU가 명령어를 해석하고 실행하는 과정을 의미합니다. 이 단계에서 CPU는 해석된 명령어에 따라 필요한 연산을 실행하고 연산 결과를 저장하는 작업을 수행합니다.
- IR에 저장된 메모리 주소를 MAR에 저장합니다. (MAR ← IR)
- 이후 MAR에 저장된 주소를 이용해서 메모리에 접근한 후, 데이터를 읽어 MBR에 저장합니다. (MBR ← MAR)
- 그 다음, MBR에 저장된 데이터는 ALU로 이동하여 연산을 수행합니다. 이후 연산 결과는 AC나 레지스터에 저장됩니다.

실행 사이클은 명령어가 실제로 작업을 수행하는 단계이기 때문에 CPU의 성능에 직접 영향을 미칩니다. 따라서 고성능 CPU를 사용할수록 실행 사이클 처리 속도가 빠릅니다.
3) 간접 사이클
간접 사이클(indirect cycle)은 CPU의 명령어 사이클 중 간접 주소 지정 방식을 사용하는 명령어를 처리할 때 발생합니다. 즉, 이단계는 인출 사이클에 간접 주소 지정 방식이 사용되었을 때만 진행됩니다. 따라서 간접 사이클은 다음과 같은 단계로 진행됩니다.
- CPU는 PC에 있는 주소를 사용해 메모리로부터 명령어를 인출하고 IR에 저장합니다.
- CPU는 IR의 명령어를 해석합니다.
- IR에서 추출된 메모리 주소를 MAR에 저장하면 이 주소로 메모리에 접근합니다. 이때 메모리에 접근하여 가져온 주소는 간접 주소로서 실제 데이터가 위치한 주소를 가리킵니다.
- MBR에 저장된 간접 주소를 MAR에 저장합니다. 이후 MAR에 저장된 주소로 메모리에 접근하여 실제 데이터를 가져와서 MBR에 저장합니다. 즉 메모리를 세번 갔다 오게 되는 것입니다.
- CPU는 최종 데이터를 사용하여 필요한 연산을 수행합니다.
- 연산 결과나 AC나 레지스터에 저장됩니다.
간접 사이클은 3번 메모리에 접근하게 됩니다.
- 명령어를 인출할 때
- 간접 주소를 가져올 때
- 데이터를 가져올 때

간접 사이클은 특히 포인터를 사용하는 프로그래밍 언어에서 중요하며 메모리 주소를 유동적으로 처리해야 할 때 유용합니다. 그러나 실제 데이터를 얻기 위해 메모리에 두 번 접속해야 하기 때문에 CPU 처리 성능에 영향을 줄 수 있습니다.
4) 인터럽트 사이클
인터럽트 사이클은 CPU가 현재 처리 중인 작업을 일시 중단하고, 긴급하거나 특별한 상황에 대응하기 위해 인터럽트 요청을 처리하는 과정입니다. 인터럽트는 하드웨어 신호나 소프트웨어 명령에 의해 발생할 수 있으며, CPU가 즉시 대응해야 할 때 발생합니다. 인터럽트 사이클은 다음과 같은 단계로 진행됩니다.
- 외부 장치나 소프트웨어가 인터럽트를 발생시킵니다.
- 인터럽트가 인식되면 CPU는 현재 작업을 중단하기 전에 현재 상태를 저장합니다. 일반적으로 PC와 현재 레지스터 값을 메모리에 저장합니다.
- CPU는 인터럽트를 요청한 긴급한 상황을 처리합니다.
- 인터럽트 처리가 완료되면 CPU는 이전에 저장한 상태를 복원하고 중단된 지점에서 프로그램의 실행을 재개합니다.
인터럽트는 주로 다중 작업을 지원하는 환경에서 필요합니다.
4. 인터럽트
인터럽트는 CPU가 현재 실행 중인 프로세스 또는 작업을 일시 중지하고, 긴급하게 처리해야 할 예외 사항을 우선 처리한 후, 이전 작업으로 복귀하는 매커니즘을 말합니다.

1) 인터럽트의 필요성
컴퓨터가 단일 CPU나 단일 코어라는 가정하면, 컴퓨터는 한번에 여러 작업을 할 수 없습니다. 하지만 여러 작업을 한번에 하는 경험을 줍니다. 즉 인터넷 검색과 ppt 작성을 우리는 동시에 하고 있다고 생각하지만, 사실 동시에 하는 것이 아닙니다. 하나의 작업을 하는 동안 다른 긴급한 요청이 들어오면, 그것을 먼저 수행한 후 원래 진행하던 작업을 돌아가기 때문이죠
2) 인터럽트 발생
인터럽트는 다음과 같은 상황에서 발생합니다.
- 하드웨어 인터럽트 : 키보드 입력, 마우스 클릭, 이메일 도착 등과 같이 외부 장치와 통신하는 상황에서 발생합니다.
- 소프트웨어 인터럽트 : 프로그램 내부에서 발생하며, 대게 특정 작업을 요청하기 위해 소프트웨어가 의도적으로 발생시키는 인터럽트입니다. 예를 들어 0으로 나누기, 유효하지 않은 명령어 실행등이 있습니다.
인터럽트가 발생하면 다음과 같은 과정으로 처리됩니다.
- CPU는 현재 실행 중인 명령어 사이클이 끝날 때마다 인터럽트를 체크하여 인터럽트 신호가 있는지 확인합니다.
- 인터럽트가 발견되면, CPU는 현재 실행 중인 작업의 상태(레지스터 값 등)를 메모리에 저장합니다.
- CPU는 인터럽트 벡터 테이블을 사용하여 해당 인터럽트를 처리할 서비스 루틴의 주소를 찾습니다.
- CPU는 인터럽트 서비스 루틴을 실행하여 인터럽트를 처리합니다.
- 인터럽트 처리가 완료되면, 저장된 상태를 복구하고 원래 작업을 계속 실행합니다.

3) 인터럽트 서비스 루틴과 인터럽트 벡터 테이블
인터럽트 서비스 루틴(ISR)은 컴퓨터에서 어떤 특별한 이벤트가 발생했을 때, 그 이벤트를 처리하기 위해 실행되는 일련의 지시 사항(코드)입니다.
인터럽트 벡터 테이블은 특정 인터럽트 신호에 대해 실행되어야 하는 인터럽트 서비스 루틴의 주소를 가지고 있는 테이블입니다.
인터럽트가 발생하면 CPU는 이 인터럽트 벡터 테이블을 참조하여 해당 인터럽트에 대응하는 인터럽트 서비스 루틴의 주소를 알아내고 이 주소로 이동하여 인터럽트를 처리합니다.
예를 들어 다음과 같이 각 인터럽트 유형은 벡터 테이블 내 고유한 위치를 가지고 있으며, 이 위치에 인터럽트 서비스 루틴의 시작 주소가 저장되어 있습니다.

사용자가 마우스를 클릭한다면
- 사용자가 마우스를 클릭하면 인터럽트가 발생합니다. 즉, 마우스는 컴퓨터에 인터럽트 신호를 보냅니다. 이 신호는 CPU에 ‘긴급한 작업’이 있음을 알리는 효과를 냅니다.
- 그러면 CPU는 현재 수행 중인 작업을 잠시 중단하고, 인터럽트의 종류를 식별합니다. 이때 인터럽트 벡터 테이블을 참조하여 마우스 클릭에 해당하는 인터럽트 서비스 루틴의 주소를 찾습니다.
- CPU는 테이블에서 찾은 인터럽트 서비스 루틴의 시작 주소로 PC를 설정합니다. 그러면 다음 CPU 사이클에서 인터럽트 서비스 루틴이 실행됩니다. 예를 들어 마우스가 특정 링크를 클릭했다면 해당 링크를 화면에 보여 줍니다.
- 인터럽트 서비스 루틴의 실행이 완료되면 CPU는 인터럽트 발생 전에 수행하던 작업으로 돌아가 이전에 하던 일을 계속 실행합니다.

4. CPU 유형에 따른 분류
좀 더 하드웨어적인 관점에서 CPU를 관찰해 보면, CPU는 마이크로프로세서라는 단일 칩의 중요한 구성 요소입니다. 이때 마이크로프로세서는 설계 방식에 따라 CISC, RISC, EISC라는 세 유형이 있습니다.
1) CISC
많은 종류의 복잡한 명령어를 사용하여 다양한 작업을 수행할 수 있지만, 이로 인해 명령어 실행 시간이 길어지고 CPU설계가 복잡해 질수 있습니다.
2) RISC
제한된 수의 간단한 명령어를 사용하여 효율적으로 작업을 수행합니다. 명령어가 단순하기 때문에 빠르게 처리할 수 있고 CPU 설계가 간소한 장점이 있습니다.
3) EISC
RISC처럼 간소화한 명령어 집합을 사용하지만, 특정 애플리케이션 또는 작업에 최적화한 방식으로 명령어 집합을 조정하는 방식입니다. EISC는 RISC나 CISC처럼 널리 알려진 방식은 아니고, 특적 목적의 애플리케이션에 주로 사용됩니다.
오늘도 화이팅입니다!