오래 못 할 짓 하지 않기
[ 컴퓨터 구조 ] 21. Direct ( cache ) 본문
대부분의 프로그램은 Memory 에 data를 access하는 데에 시간을 대부분을 쓴다.
따라서, 메모리에 접근하는 시간이 Performance에 큰 영향을 끼침
+ 우리는 크고 빠른 데이터를 원한다.
하지만 큰 데이터는 속도가 느리고
빠른 데이터는 작을 수밖에 없다.
" Smaller is faster "
아래로 갈수록 데이터의 크기는 ↑ , 속도는 ↓
이상적인 메모리는 SRAM의 aceess 속도 + Disk의 용량이다.
해결법
계층 구조를 나눈다. (= 우선 순위를 나눈다)
- CPU에서 멀어지면 접근하는 시간이 길어지기 때문에
우선 순위별로 CPU와 가깝게 배치한다.
Locality
1. temporal locality : 방금 썻던 놈을 곧 다시 쓰는 경우.
ex) a = b + c;
d = 2*a + 1;
교수님이 들어주신 예시
Precessor = 학생
Main Mem= 도서관 책장
Cache Mem = 컴구 책 모아놓은 책장
컴구 책을 학생들이 자주 보고싶은데 도서관 너무 안쪽 책장에 책들이 있음.
교수님이 특별히 건의해서 이번학기 컴구에 쓰는 책들을 입구에 따로 배치해둠.
접근하기 쉬워짐.
다음 학기되면 그 학기에 듣는 수업으로 책들을 교체함
2. spatial locality : 방금 썼던 데이터 근처의 데이터를 곧 사용할 경우 .
주로 배열에서 쓰인다.
a[1]을 가져와도 곧 a[2]를 쓸 기미가 보이는 경우를 말한다.
Locality 특징
1. 메모리 계층구조를 사용했음
2. 모든 데이터를 Disk에 일단 저장
1) recently accessed items + nearby items 를 disk에서 DRAM으로 복사한다.
disk → DRAM
2) More recently accessed items + More nearby items 들을 DRAM에서 SRAM(cache)로 옮긴다.
= 자주 쓰는 건 CPU랑 가깝게 해서 더 빨리 왔다갔다 하게
계층 구조는 2단계로 나눌 수 있다
Upper / Lower
● Block : Data 묶음의 최소 단위
cache로 가져올 땐 내가 필요한 데이터 하나만 쏙 빼오는 게 아니라
그 주변 데이터까지 block 단위로 한 번에 가져온다.
cache(upper level) 안에, 내가 찾으려고 하는 데이터의 유무에 따라
● hit : 있
● miss : 없
→ 우리가 원하는 데이터가 있는 Data block을 Upper(=cache)로 가져와야 한다.
→ CPU stalls 해야함
→ 시간 소모 심함 = performance 감소.
그럼에도 이렇게 계층 구조를 가지는 이유는
locality가 있기 때문에 이렇게 해보니 성능이 좋았어서.
요약
Cache
Cache에 접근할 때 생각할 수 있는 문제가 2개 있음
1) Cache에 원하는 data가 있는지 어떻게 알 수 있냐?
2) 있으면, 어떻게 찾을 수 있냐?
Block size = 1 word
Direct Mapped
Lower level의 data들은 Cache에서 정해진 하나의 location에만 저장될 수 있다.
그래서 때에 따라서는 lower level 데이터들끼리 Cache location을 공유하는 경우도 있음.
Lower lv에서 끝 주소 3비트로 방을 구분한다고 한다.
101 로 끝나는 애들은 다 같은 방으로 들어감.
101은 방을 가는데 쓰이고 , 그 앞 2비트는 Tag로 각 데이터를 구분하기 위해서 쓰인다.
ex) 학교 도서관으로 예를 들면
학교 도서관 책상에 앉을 때,
학번을 8로 나누어 나머지가 1이면 1번자리, 2면 2번자리...
Valid bit : 현재 Cache에 있는 값이 Mem에서 가져온 valid한 값인지
이전에 쓰다 남은 찌꺼기인지 판단하는 Valid bit
데이터가 cache에 저장되는 단계
내가 직접 해보기
Cache 내부 분석
총 32비트가 있는데,
● Cache는 1024words를 가질 수 있고, 이를 indexing하기 위해 필요한 비트 수 = 10bits
● 데이터는 byte 단위로 있는데 block(word) 단위로 가져오기 때문에 2비트는 그냥 버린다 = 2bits
● 32비트 - index용 비트 - byte -> word 하면서 없어지는 비트
= 32 - 10 - 2 = 20
●Valid 판단 비트 = 1bits
Data = 32비트 (주소로 가져오는 거니까)
Tag = 20비트
Index = 10비트
Valid 판단 = 1비트
word - byte = 2비트
마지막에 1024 * (30 + 20 +1 )인 이유
1024 자리가 있고, 각 자리마다 [ 데이터 + tag + valid ] 칸이 있음
Hits vs Misses
● Read hits : 원하는 거 있음
● Read Misses : 원하는 거 없음
→ CPU stall
→ Mem에서 필요한 데이터가 있는 block fetch
→ cache로 그 데이터를 옮긴다.
→ 다시 시작
[ Inst mem + Data mem ] 은 [ Inst cache + Data cache ]로 대체될 수 있다.
● Inst cache 에서 misses 인 경우 분석
1. mem에 PC-4 를 보낸다 ( 없는 거 확인하기 전에 PC+4를 했으니까 )
2. CPU stall 하고, 필요한 Inst가 있는 mem을 읽는다
3. cache에 저장, valid bit 세팅.
4. 다시 시작
● Data cache 에서 misses 인 경우 분석 (Inst cache 에서 1빼고 한다 생각하면 됨)
1. CPU stall 하고, 필요한 Data가 있는 mem을 읽는다
2. cache에 저장, valid bit 세팅.
3. 다시 시작
● 여기서 들 수 있는 의문
Cach에서는 tag만 다르지 같은 location으로 가면 자리를 공유할 수도 있음.
이런 경우에 1) 데이터를 새로 넣으면 원래 있던 block은 어떻게 할거임?
2) 메모리에 다시 돌려놓을지 아니면 버릴지
Cache에 write하는 경우
두 가지 방법이 있다.
1. Write through
: Data 가 업데이트 된다 → [ Cache의 해당 block에 업데이트 + Main mem에서 해당 block에 업데이트 ]
장점 : Miss인 상황에 작업이 빠르다.
이유 : cache에 있는 값과 memory에 있는 값이 일치하므로,
새로운 값을 가져와도 다시 업데이트 할 필요가 없다.( = 다시 돌려주면서 업데이트를 할 필요 X )
단점 : Cache가 업데이트 될 때마다 memory에 접근해야 하므로, 시간이 더 걸린다.
함해봐
2. Write back
: Data 가 업데이트 된다 → [ Cache의 해당 block에민 업데이트 ]
+ Main mem에 update는 cache에 다른 block이 들어와서 교체될 때만
● 특징 : Dirty or clean을 확인한다.
● 용도 : 교체될 때 Update해야하는지 굳이 안 해도 되는지 판단하기 위함
- Dirty : Dirty bit =1
= Cache block이 cache에 들어온 뒤에 값이 update된 적 있음.
= Mem에도 Update 해야함
- Clean : Dirty bit =0
= Cache block이 cache에 들어온 뒤에 값이 update된 적 없음.
= Mem에 Update 할 필요 X
Write through : Write back
장단점
- Write Through:
장점 : Miss가 나도 값이 일치하기 때문에 새로 업데이트 X
단점 : 매 업데이트마다 시간이 좀 더 걸림
- Write Back :
장점 : 메모리에 쓰는 걸 반복하지 않아도 된다.
단점 : 굳이 꼽자면 Dirty bit를 보고 Miss가 나면 Update를 해야한다.
(출처)
한동대학교 용환기교수님 - 컴퓨터구조
'2학년 2학기 > 컴퓨터 구조' 카테고리의 다른 글
[ 컴퓨터 구조 ] 23. Virtual memory (0) | 2023.11.27 |
---|---|
[ 컴퓨터 구조 ] 22. Cache performance (0) | 2023.11.26 |
[ 컴퓨터 구조 ] 12주차 makeup 문제 (0) | 2023.11.16 |
[ 컴퓨터 구조 ] 20. RISC : CISC (0) | 2023.11.13 |
[ 컴퓨터 구조 ] 19. Performance (0) | 2023.11.12 |