"캐시에 저장된 값을 불러옵니다"
컴퓨터를 하다보면 캐시와 관련된 메세지를 종종 만나게 됩니다.
캐시는 일종의 임시저장소로써
컴퓨터의 속도를 더욱 빠르게 만들어주는 역할을 합니다.
이 캐시는 왜 쓰게 되었을까요??
여러분들이 컴퓨터를 살 때
메모리 용량이 많으면 좋다고 합니다.
그런데, 어떤 메모리용량이 많아야할까요??
위의 그림은 메모리 계층구조에 대한 그림입니다.
위로 갈수록 빠르고 비싼 메모리입니다.
우리가 통상적으로 영화같은 대용량 파일은 하드에 저장하고
실행시에 RAM에 일정량의 데이터를 복사해 임시저장하고,
필요시에 CPU에 전달에 연산을 처리합니다.
그런데, 여기서 문제가 생깁니다.
하드디스크는 속도가 느립니다.
그럼 하드에 저장된 프로그램을 계속 넣었다 빼면 엄청 시간이 오래 걸리는건가?
그렇다고 메인메모리,CPU레지스터쪽을 늘리는데에는 비용에 문제가 생기고...
이렇게 나오게 된 것이 바로 캐시입니다.
캐시는 자주 사용되는 데이터를 임시저장합니다.
만약 여러분이 A라는 영화를 자주 실행했다면
A를 캐시에 저장해서
나중에 실행할 때 하드를 접근하지 않고 빠르게 캐시에서 꺼내쓸 수 있도록 도와줍니다.
이렇게 자주쓰이는 메모리를 반복해서 쓰는 걸
"참조 지역성"(locality of reference)라고 부릅니다.
가장 기본적인 캐시구조를 보겠습니다.
"direct-mapped cache"라고 부르는 구조로
캐시메모리의 가상주소에
실제 메모리 주소를 직접 연결하는 구조입니다.
캐시에는 하드디스크의 저장된 데이터를
'임시저장'합니다.
그 임시저장한 캐시의 주소를 '가상주소'라고 부르고
실제 메모리의 주소와 직접 매핑합니다.
하지만 여기서 문제가 있습니다.
"만약 캐시의 가상주소가 실제주소랑 다르다면??"
"캐시에 저장된 정보랑 실제정보랑 다르면??"
이를 위해서
Valid bit와 Tag가 있습니다.
Valid bit는 현재 캐시에 데이터가 있는지를 체크하여
만약 없다면 cache에 새로운 정보를 저장하고 1로 표시합니다.
tag는 블록의 주소를 저장하여
찾을려는 메모리가 캐시의 정보가 일치하는지 확인합니다.
명령어가 캐시를 볼 때
캐시랑 일치하면 캐시 hit
그렇지 않으면 캐시 miss라고 부릅니다.
위의 경우는 해당 캐시 인덱스에 접근하고
vaild bit가 1로 데이터가 있다고 표시되어있지만
Tag bit가 캐시와 달라 miss라고 표시한 경우입니다.
https://www.youtube.com/watch?v=RqKeEIbcnS8
해당 영상을 참고하여 어떤 식으로
hit와 miss가 이뤄지는지 볼까요?
아직 캐시에 아무것도 저장되지 않은 상태입니다.
첫번째 명령어대로 캐시블럭 set인 11번째로 가면
캐시에 아무것도 저장이 안 되있는 걸 볼 수 있습니다.
캐시와 일치하는 것이 없으니
캐시 miss입니다.
이후, 해당 11번지 주소에
tag를 저장하고 Vaild bit를 1로 표시합니다.
두번째 명령어의 set으로 가면
아직 캐시 블록에 저장되어있는게 없었으므로 miss입니다.
그 후, 해당 캐시에 해당 값을 저장합니다.
그 다음 명령어대로
해당 캐시로 접근합니다.
캐시에 값이 저장되어있고
tag도 일치합니다.
따라서 캐시 hit입니다.
그 다음 명령어도 캐시블록에 값이 존재합니다.
하지만 명령어의 tag와 캐시에 저장된 태그가 다릅니다.
서로의 tag가 다르기 때문에 캐시 miss입니다.
miss가 된 후에는
해당 캐시 블록 tag값에 새로운 tag값을 갱신해줍니다.
Direct mapped 방식으로
실제 물리주소와 1:1 매핑을 할 경우,
캐시의 용량이 제한적이고
매핑할 수 있는 물리주소가 한계가 있었습니다..
그래서 나온 연결방법으로
fully associative 와 set associative가 있습니다.
fully associative방식에서는
캐시의 어떤 블록이든간에
데이터를 집어넣을 수 있습니다.
즉, 블록번호에 관계없이
캐시를 저장합니다.
그 덕분에 1:1로 맵핑했을 때와 달리
캐시 정보가 많이 저장될 수 있어
cache miss가 상대적으로 적어집니다.
하지만 캐시의 데이터를 살필 때
모든 캐시 데이터를 전부 다 살펴야해서
탐색속도가 높아지는 단점이 있습니다.
set associative는 direct와 fully의 장점을 절충한 방식입니다.
캐시의 구역을 set으로 당어리로 나눠서
자료를 저장하는 방식입니다.
Set Tag로 캐시를 탐색하는 방식으로
먼저 주어진 set번호를 찾아가
해당 tag값이 있는지 여부를 살펴보고
cache hit인지 miss인지를 판단합니다.
이 방식은 set을 덩어리로 나눴기 때문에
fully보다 탐색시간이 줄어들었으며
캐시를 덩어리로 저장하기 때문에
블록 하나하나 저장하는 direct보다
캐시 미스가 줄어드는 장점이 있습니다.
캐시의 원리는 가상화로 어이집니다.
그림처럼 가상머신을 사용하는 경우를 살펴보겠습니다.
프로그램을 개발하다보면
여러 대의 컴퓨터로 시뮬레이션을 돌려야하거나
다른 환경에서 프로그램이 작동되는지 확인해야합니다.
컴퓨터를 여러대 구매하는 방법이 가장 간단하지만
현실적으로 비용부담이 너무 크다는 단점이 따릅니다.
이런 점을 해결하기 위해
가상화라는 개념이 등장했습니다.
이 가상화는 컴퓨터 하드디스크에서
여유공간을 CPU처럼 사용하여
논리적으로 여러 대의 컴퓨터를 사용하도록 만드는 기술입니다.
이때에 캐시에서 물리-가상주소를 연결한것처럼
가상화를 수행할 때 실제주소와 가상 CPU주소를 연결하여
가상머신을 만들 수 있습니다.
https://www.baeldung.com/cs/cache-direct-mapping
숭실대학교 박민호 교수님 강의자료
Computer Organization and Design RISC-V edition
[MIL] 프로그래머스 데브코스 리눅스 &커널 전문가 과정 1달 회고록 (2) | 2023.11.21 |
---|---|
프로세스 vs 쓰레드, 뭐가 다르고 어떻게 활용될까?? (0) | 2023.11.02 |
컴퓨터 파이프라이닝이란 무엇이고 어떻게 활용될까?? (1) | 2023.10.20 |
CPU Clock은 무엇이고 어떻게 활용될까? (0) | 2023.10.12 |
메모리와 명령어의 상호작용, 왜 알아야할까?? (1) | 2023.10.10 |
댓글 영역