2023. 2. 19. 01:04ㆍHardware
지난번 글에서는 순차회로에 대해 알아봤고,
순차회로를 만들기 위해 필수적인 저장 모듈인
flip-flop과 그것을 동작시키는 clock에 대해 알아봤다.
이번에는 레지스터 파일 (register file)에 대해 알아본다.
일단 레지스터가 무엇인지 알아야 하니까
먼저 메모리 계층 구조에 대해 알아보자:
메모리의 종류로는 위에서부터 아래까지
레지스터 - 캐시 - 주기억장치 - 플래시 - 하드디스크가 있다.
위에서 아래로 갈수록 속도는 느려지는 반면,
용량은 커지고 접근하는데 필요한 전력이 적게 소모된다.
또한 위에 레지스터와 캐시를 보다시피
둘은 CPU에 내장이 되어 있으며,
그 외에는 모두 컴퓨터 안에 다른 장치로 자리 잡는다.
주기억장치는 RAM으로,
플래시를 SSD 정도로,
하드디스크는 흔히 아는 HDD로 생각해도 좋다.
이런 계층 구조는 왜 생기는 건가?
그냥 하나의 크고 빠른 메모리를 사용하면 될 것이지,
왜 이렇게 복잡하게 세분화시켰을까?
일단 우리가 필수로 알아야 하는 것은,
CPU가 clock 신호를 먼저 받고
그다음 clock를 받을 때까지 시간을 clock cycle라고 하는데,
일반적으로 CPU는 하나의 clock cycle 안에 하나의 명령어를 실행한다.
자, CPU는 1 clock당 하나의 명령어를 실행한다.
그리고 CPU가 실행하는 프로그램의 코드는 주기억장치에 있다.
프로그램의 코드가 CPU에 있는 것이 아닌, 주기억장치에 있기 때문에
코드 (명령어)를 주기억장치에서 가져와서 CPU가 실행해야 한다.
하지만 위 그림에서 주기억장치가 CPU보다 속도가 느리다고 했다.
얼마나 느릴까?
평균적으로 메모리에 접근하는 것은 ~100 cycle 정도 걸린다고 생각해도 된다.
CPU에 비해 어마어마하게 느린 수준이다.
100 cycle이면 CPU는 100개의 명령어를 실행할 수 있다.
주기억장치에 접근하는 시간이 이렇게 오래 걸리게 되면
아무리 CPU 성능이 좋더라도
100 cycle 이상 걸리는 접근 시간 때문에 터무니없는 성능이 되어버린다.
물론, 메모리를 더 빠르게 하는 방법도 있다.
하지만 이 방법은 말처럼 쉽지 않다.
컴퓨터라는 분야가 해마다 엄청나게 발전하고 있는 상태지만,
무어의 법칙에 의하면
CPU는 해마다 60% 빨라지는 반면,
메모리는 해마다 7%만큼만 빨라진다.
따라서 매년 CPU와 메모리의 속도 격차는 50%씩 증가하고 있다.
결론적으로 말하자면,
메모리는 CPU가 발전하는 속도를 따라가지 못한다.
그래서 캐시가 사용된다.
이렇게 터무니없이 시간이 오래 걸리면
CPU의 모든 명령어마다 매번 메모리에 접근하기에는
성능이 너무 악화된다.
캐시는 메모리 (주기억장치) 보다 훨씬 빠르다.
캐시는 메모리와 CPU 사이의 속도차를 보완하기 위한 것이므로,
CPU와 메모리 사이에 다리 역할을 하며 둘을 이어준다.
캐시는 CPU가 메모리에 자주 찾고 접근하는 데이터를 저장하는 곳으로,
여러 번 접근하는 데이터의 경우
매번 메모리에 접근할 필요가 없도록 도와주는 것이다.
캐시 중에서도 L1, L2, L3 캐시가 있고,
뒤에 붙은 숫자가 작을수록 용량은 적고 크기가 빠르다.
캐시보다도 더 빠른 레지스터는 연산 중 임시 데이터를 저장하는 용도로,
레지스터 또한 CPU 안에 있다.
레지스터는 가장 작으면서도 가장 빠른 저장장치이다.
한 마디로 레지스터는 CPU가 명령어를 실행할 때 임시 데이터를 저장하는 저장소이다.
CPU가 예를 들어 다음 코드를 실행한다면:
a = 1;
b = 2;
for(i = 0; i < 100; i++){
c = a + b;
}
이런 경우에는 a와 b에 100번 접근하는 것을 피하기 위해
a와 b의 값은 캐시에 저장하고,
c = a + b를 계산할 때는 a와 b는 연산에 사용되므로
레지스터에 저장이 된다.
휴
드디어 메모리 계층 구조 설명은 끝났고
레지스터에 대한 설명을 하자
앞서 얘기했다시피 레지스터 파일은 저장장치이고
용량은 적지만 속도는 매우 빠른 녀석이다.
지난번 글에서 설명한 flip-flop의 내용이 그대로 사용되는데,
아래 글을 참고하면 이해가 더 빠를 것이다
순차회로, 클럭, 플립플롭 - 넌 누구니? – 하드웨어 시리즈 #3
이번에는 순차회로에 대해 알아보자 아래 글에서 조합회로와 순차회로가 무엇이고 어떻게 구별하는지 알아봤다. 조합회로는 뭐고 순차회로는 대체 뭘까 – 하드웨어 시리즈 #1 하드웨어를 배우
mountainhiker.tistory.com
사실 레지스터라는 것은 말이 거창해서 그렇지,
그냥 수많은 flip-flop을 나란히 연결한 것과 똑같다.
clock 신호가 들어오면 입력을 저장하고,
그렇지 않으면 아무것도 하지 않는다.
자, 나란히 연결한 flip-flop들을 레지스터라고 하자.
아키텍처마다 레지스터 파일의 입출력은 조금씩 다를 수 있지만
대체로 위 사진과 비슷하게 생겼다.
일단 위 사진으로 설명하자면
32-bit 크기의 레지스터가 32개 나란히 있다.
레지스터를 사용할 때는 항상
어떤 특정 레지스터의 값을 가져오거나
레지스터에 저장을 하게 되는데,
먼저 가져올 때를 가정하자.
mov eax, edx
왼쪽에서 source register address 1과 2로 어떤 레지스터의 값을 읽을건지 address를 지정한다.
(edx에 해당하는 bit를 설정)
총 레지스터가 2^5 = 32개이므로 5-bit 신호로 지정하면 된다.
address를 레지스터 파일에 공급해 주면
다음 클럭에서 source register data 1과 2로 지정한 데이터가 나온다.
그러면 레지스터에 저장하려고 할 때는 어떻게 할까?
mov eax, 1
destination register address로 어떤 레지스터에 저장을 할 건지 address를 지정한다.
(eax에 해당하는 bit를 설정)
그리고 저장하고자 하는 데이터 (0x0000_0001)을 write data로 공급한다.
그러면 다음 clock cycle에서 저장이 된다.
그럼 가운데 위에 있는 Write는 무엇일까?
레지스터를 읽는 행위는 프로그램의 동작에 특별한 문제를 일으키지는 않지만,
레지스터를 아무 때나 변조하는 것은 큰 문제를 불러일으킨다.
따라서 레지스터를 변경하는 명령어가 아닌 경우 (예: jmp, jle 등등)
Write = 0으로 하여 레지스터 파일 변경 권한을 없앤다.
이로써 destination register address와 write data에 남은 쓰레기 값을 다시 쓰지 않게 된다.
반면, 레지스터를 변경하는 명령어의 경우 (예: mov, add 등등)
Write = 1로 하여 레지스터 파일 변경을 허용한다.
정리하자면,
메모리의 발전 속도가 CPU의 발전속도를 따라가지 못해 격차가 커져
전체적인 컴퓨터의 성능 저하를 보완하기 위해 나온 것이 캐시이며,
레지스터는 CPU 안에 있는 저장 장치로,
연산에 사용되는 데이터를 저장하는 가장 작고 빠른 저장장치이다.
레지스터와 캐시 모두 CPU 안에 있으며,
수많은 레지스터들이 모인 것을 레지스터 파일이라고 한다.
그럼 이만~
* 글을 작성할 때 고려대학교 서태원 교수님의 저서
<원리부터 설계까지 컴퓨터구조 - RISC-V 중심으로>를 참고했습니다. *
'Hardware' 카테고리의 다른 글
순차회로, 클럭, 플립플롭 - 넌 누구니? – 하드웨어 시리즈 #3 (0) | 2023.02.15 |
---|---|
아니 그래서 조합회로엔 뭐뭐 있는데? – 하드웨어 시리즈 #2 (0) | 2023.02.13 |
조합회로는 뭐고 순차회로는 대체 뭘까 – 하드웨어 시리즈 #1 (0) | 2023.02.12 |