CPU 레지스터 란 무엇입니까?


27

이 질문은 지금 당장 나를 귀찮게 해 왔으며 오늘은 Google에서 할 것이라고 생각했습니다. 나는 그것에 대해 몇 가지를 읽었으며 항상 프로세서 캐시 라고 알려진 것과 매우 비슷해 보였습니다 .

둘 사이에 차이점이 있습니까, 아니면 그들이 동일하다고 생각할 때 맞습니까? 실제로 레지스터가 작동하려면 CPU 내부에 있어야합니까?

Wikipedia에 따르면 레지스터는 RAM에 다시 전송되기 전에 메모리에 빠르게 액세스하고 수정할 수있는 CPU의 위치입니다. 이것을 잘못 이해 했습니까? 아니면 캐시와 등록이 실제로 동일합니까?


13
CPU 레지스터는 CPU를 추적하는 조직입니다. NSA는 CPU 레지스터의 예입니다.
Jimmy Hoffa

3
CPU 레벨 1 캐시는 종종 레지스터와 동일한 유형의 실리콘으로 만들어집니다. 캐시 된 주소를 캐시 위치와 연결하기 위해 추가 조회가 필요하기 때문에 속도가 빠르지 않습니다. 그러나 레지스터와 캐시는 분명히 칩의 다른 위치입니다.
Zan Lynx

3
@JimmyHoffa : 귀하의 의견이 OP, 컴퓨터 과학 지식에 해를 끼치기에 매우 혼란스러워 질 것 같습니다.
rwong

3
@ rwong Nah 나는 그것을 얻었다, 나는 그것이 꽤 재미 있다고 생각했다. : P
Jeroen

1
또 다른 차이점은 크기입니다. 레지스터 파일이 수백 개의 단어보다 거의 크지 않은 반면 L1 캐시는 64k만큼 큰 것일 수 있습니다.
SK-logic

답변:


61

그들은 동일하지 않습니다. 레지스터는 CPU가 실제로 작업하는 값이있는 위치입니다. CPU 설계는 레지스터에있을 때만 실제로 값을 수정하거나 다른 방식으로 작동 할 수 있도록합니다. 따라서 레지스터는 논리를 작동시킬 수 있지만 메모리 (캐시 포함)는 CPU가 읽고 쓰는 값만 보유 할 수 있습니다.

직장에서 목수를 상상해보십시오. 그는 자신의 손 (레지스터)에 몇 가지 항목을 가지고 있으며 자주 작업하는 워크 벤치 (캐시)에 아주 가까이 있지만이 순간에는 올바르게 사용하지 않고 작업장 (메인 메모리)에 관련된 것들 현재 진행중인 프로젝트이지만 워크 벤치에있을만큼 즉시 중요하지는 않습니다.

편집 : 다음은 레지스터 논리의 작동 방식에 대한 간단한 설명입니다.

R1..R4라는 네 개의 레지스터가 있다고 상상해 봅시다. 다음과 같은 문장을 컴파일하면 :

x = y + z * 3;

컴파일러는 (해체 할 때) 다음과 같은 기계 코드를 출력합니다.

LOAD  R1, ADDRESS_Z //move the value of Z into register 1
MUL   R1, 3         //multiply the value of register 1 by 3
LOAD  R2, ADDRESS_Y //move the value of Y into register 2
ADD   R1, R2        //adds the value in R2 to the value in R1
STORE R1, ADDRESS_X //move the value of register 1 into X

대부분의 최신 CPU에는 32 비트 또는 64 비트 폭의 레지스터가 있으므로 보유 할 수있는 크기까지 모든 값을 계산할 수 있습니다. 더 작은 값을 위해 특수 레지스터가 필요하지 않습니다. 레지스터의 일부만 사용하도록 지시하는 특수 ASM 명령어 만 사용합니다. 그리고 두 손만 가진 목수와 마찬가지로 레지스터는 한 번에 적은 양의 데이터 만 보유 할 수 있지만 활성 데이터를주고받으며 재사용 할 수 있습니다. 즉, "많은 레지스터"는 그렇지 않습니다. 결국 필요합니다. (물론 사용할 수있는 것이 많으면 물론 컴파일러가 더 빠른 코드를 생성 할 수 있지만 꼭 필요한 것은 아닙니다.)


26
그리고 도시 (디스크)와 그가 페덱스에 넣을 수있는 다른 것들 (네트워크)에서 더 많은 것들 :-)
Dan Pichelman

2
해당 시스템 아키텍처에 따라 크게 달라집니다.
세계 엔지니어

5
16 비트 x86 프로세서의 @Binero에는 Ax, Bx 등의 레지스터가 있습니다. 이들이 32 비트 프로세서로 이동할 때 레지스터를 32 비트 EAx, EBx로 확장했습니다. Ax에 액세스하면 16 비트의 EAx를 얻게됩니다. 64 비트 모드에서 이들은 하위 32 비트가 EAx이고 하위 16 비트가 여전히 Ax 인 레지스터 RAx를 명명했습니다. : 당신은 16 비트 도끼 레지스터의 상위 바이트 얻을 AH 같은 바이트의 다른 부분에 도착하는 방법을 보려면 다음 다이어그램을 확인 en.wikipedia.org/wiki/X86#Structure
stonemetal

2
최신 CPU에서는 레지스터가 명령 스트림과 예측 명령 스트림을 얼마나 가깝게 따르고 있는지에 따라 실제 고속 메모리의 코어 내 뱅크에 일시적으로 매핑되기 때문에 이러한 종류도 분해됩니다.
Vatine

2
@MasonWheeler 당신의 좋은 선택입니다.
Vatine

3

실제로 CPU 용어의 레지스터는 작습니다. 이름이 지정된 메모리 청크 마이크로 프로세서 (CPU) 내에서 사용 가능합니다. 레지스터에는 특정 이름, 크기 및 기능이 있습니다 (예 : 8085 마이크로 프로세서가 8 인 8 비트 프로세서 인 경우). -비트 레지스터 (A : 누적 기, B, C, D, E, H 및 L 레지스터 및 하나의 플래그 레지스터는 모두 8 비트 임) 2 개의 16 비트 레지스터 PC와 SP는 모두 특수 기능을 가지고 있으며 어셈블리 프로그래밍 중에 기능이 그림에 나타납니다. 프로그래머를 능가하는 레지스터 제어는 거의 없습니다.

다른 프로세서를 사용하는 경우 레지스터에 따라 8086은 16 비트 프로세서이고 AX, BX, CX 및 DX는 모두 16 비트, PC, SP 및 플래그 레지스터입니다.

질문에서 인용했듯이 프로그램 실행 속도를 높이고 프로세서 캐시로 작동하지만 이제 프로세서 아키텍처가 변경되고 프로세서 캐시를 호출하는 많은 메모리를 추가합니다.

그러나 프로세서 (CPU) 캐시와 프로세서 (CPU) 레지스터 사이에는 약간의 차이가 있습니다. 메모리 포인터, 프로그램 상태 등과 같은 일부 특수 활동에 실제로 필요한 레지스터입니다. Ex : PC : 프로그램 카운터에서 메모리 포인터를 작동시키는 프로그램 카운터, SP : 스택 메모리에서 메모리 포인터 역할을하는 스택 포인터. Accumulator는 연산 연산을 위해 ALU에 액세스하기위한 버퍼 및 기본 레지스터입니다.

exaples에 대한 메이슨 휠러 설명을 볼 수 있습니다


1

레지스터가 메모리가 아니며 그렇게 생각해서는 안된다고 생각하는 것이 도움이된다고 생각합니다.

OO처럼 생각하십시오-Register는 메모리에서 파생되지 않은 클래스이고 Memory는 레지스터에서 파생되지 않은 클래스이지만 Register 클래스에는 데이터를 메모리로 변환하거나 메모리에서 변환하는 메소드 (Machine Op Code)가 있습니다. 반면에 메모리는 레지스터에 대해 아무것도 모르고 그에 대한 조치를 호출 할 수 없습니다. 결과적으로 모든 CPU 작업은 레지스터에 의해 수행되며 종종 메모리에 액세스합니다.

쓰기 전용 레지스터를 보는 것은 드문 일이 아니며 메모리의 속성은 거의 없습니다. 메모리에 기대하는 동작이 아니라 레지스터 값을 쓰지 않고 변경하는 것도 가능합니다.


메모리 매핑 된 I / O에서 "메모리"의 쓰기 전용 영역은 일반적이지 않습니다.
SK-logic

@ SK-logic-맞습니다. 그러나 질문의 ​​맥락에서 OP는 메모리를 읽고 쓰는 것으로 생각합니다. 필요가 더 :) 그를 혼란스럽게 없습니다
mattnz

0

@Mason Wheeler가 제공 한 답변은 정확하지만 다른 관점에서 질문을 넣을 수 있다고 생각합니다. 귀하의 질문으로 판단하면 캐시와 레지스터의 차이점을 완벽하게 이해하는 데 필요한 개념은 데이터 경로 입니다. Mason이 올바르게 지적했듯이 CPU의 논리 (즉, 데이터 경로)는 메모리 정보가 CPU에서 직접 처리 할 수 ​​없도록 설계되어 레지스터가 존재합니다. 실제로 CPU는 해당 레지스터가 먼저 올바른 레지스터 (일반적으로 "Instruction Register"라고하는 명령어)에로드되지 않은 경우 실행중인 프로그램의 현재 명령어를 디코딩 할 수 없습니다.

이것은 CPU가 연결된 방식과 관련이 있습니다. 메모리와 ALU 사이에는 물리적 경로가 없습니다. ALU에 공급 된 모든 데이터는 어떻게 든 어떤 레지스터에서 버퍼링되어야합니다. 다를 수 있지만 메모리를 ALU에 직접 연결하는 데 필요한 회로는 너무 복잡합니다. 앞에서 언급 한 데이터 경로에 따라 레지스터 파일을 통해 메모리와 ALU 간의 모든 통신을 중재하는 것이 더 쉽고 효율적입니다. . 실제로, 주어진 명령어가 메모리 위치를 피연산자 ( 직접 주소 지정 이라고하는 주소 지정 모드 ) 로 지정 하더라도 해당 데이터 단위는 MBR (메모리 버퍼 레지스터, MDR이라고도하는 메모리 버퍼, 메모리 데이터 버퍼)로 알려진 레지스터에로드됩니다. ).

CPU의 관점에서 볼 때 정보 (데이터 또는 코드)가 주 메모리 나 캐시에서 오는 것이 중요하지 않지만 후자는 훨씬 빠릅니다. 캐시는 성능상의 이유로 존재하며, 레지스터는 CPU 설계 (즉, 데이터 경로)로 인해 존재합니다. 영리한 프로그래머 (실제로는 영리한 컴파일러)는 메모리 액세스를 최소화하기 위해 레지스터 사용을 최대화하려고합니다 (레지스터는 캐시 또는 메모리보다 빠릅니다). 이는 레지스터에 저장된 정보가 여러 번 사용되는 경향이 있으며 실제로 이것이 RISC 철학의 원칙 중 하나이기 때문에 정당합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.