티스토리 뷰
http://www.parkoz.com/zboard/view.php?id=my_tips&page=1&sn1=&divpage=1&sn=off&ss=on&sc=off&keyword=%C4%B3%BD%AC&select_arrange=headnum&desc=asc&no=998
캐시 메모리가 무엇인지는 다 아시므로 일단 기본적인 캐시 메모리의 형태를 놓고 설명에 들어갑니다.
위의 그림에서 설명의 편의를 위해 메인 메모리의 크기가 32 이고 캐시 메모리의 크기가 4 라고 가정하였습니다.
1) 메인 메모리의 주소는 총 5비트 이고, 캐시 메모리는 2비트로 나타낼 수 있습니다.
2) 메인 메모리 주소의 하위 2비트는 자기가 갈 캐시 메모리의 번지가 됩니다.
3) 나머지 3비트는 Tag로 사용하는데, Tag는 같은 캐시 방에 들어갈 수 있는 메인 메모리의 번지가 여러 개이기 때문에 실제로 CPU가 요구한 메모리 번지의 데이터가 맞는지를 구분하는 용도로 사용됩니다. 글자 그대로 꼬리표이지요.
00110 번지의 데이터가 필요할 경우의 동작 순서
1) 제일 뒤의 두자리 “10”에 해당하는 캐시 번지로 간다.
2) 꼬리표(tag)가 “001” 인지 본다.
3) 맞으면 그 데이터를 읽어간다. (cache hit, 적중)
4) 아니면 주 메모리에서 데이터를 읽고, 동시에 캐시에도 데이터를 저장한다. (cache miss, 실패)
캐시 메모리를 이용할 경우의 속도
평균 접근 시간(Acess time) = 적중률 * 캐시 접근시간 + (1-적중률) * 메인 메모리 접근 시간
조건: 캐시 접근시간 << 메인 메모리 접근 시간
위의 식에서, 적중률을 높이면 평균 접근 시간이 내려갈 것(속도가 빨라질 것)이라고 예상할 수 있습니다.
당연한 이야기이죠? 그렇다면, 적중률을 높이려면?
가장 먼저 떠오르는 것이 캐시의 크기를 무작정 늘리는 방법입니다.
그러나, 가장 비현실적인 방법이지요. 차라리 캐시 메모리를 메인으로 쓰고 말지요..^^
그래서, 사람들이 여러가지로 궁리를 해 봅니다.
너 자신(CPU)을 알라 ~
앗 그렇습니다. CPU는 완전히 무작위로 메모리를 읽는게 아니고, 특정 패턴이 있었던 것입니다. 무엇이냐,
1) 넓게 퍼져있지 않고, 일정 범위 내에서 집중/반복해서 읽는 경향이 있다.
2) 방금전에 읽었던 데이터가 오래전에 읽었던 것보다 다시 읽을 확률이 높다.
블록 단위로 읽기
기본형과 같이 하나의 캐시 메모리 번지에 1개의 데이터가 아닌 여러 개의 데이터를 넣는 방식입니다. 하나의 번지가 읽히면 주변 번지도 읽혀질 가능성이 높다는 가정이 있다면 이방법에 의해 적중률이 올라갈 것입니다.
하나의 블록에 보통 4개의 데이터를 한꺼번에 넣습니다.
하나의 방에 여러 개의 블록을 넣기
캐시 메모리의 같은 번지에 해당하는 데이터 여러 개가 번갈아가며 자주 쓰여진다면 어떻게 될까요?
그때마다 캐시 내용이 계속 바뀌게 되고 당연히 효율이 떨어지겠죠?
하나의 방에 여러 개를 넣을 수 있게하면 위의 현상은 줄어들고, 효율이 늘어날 것입니다.
그 대신에 꼬리표를 여러 개 가진 녀석들이 하나의 방에 들어와 있으니, 꼬리표 검색할 때 시간이 많이 걸리거나 회로가 복잡해지겠네요..
하나의 방에 2개의 블록을 넣는 경우를 Associativity가 2way이다 라고 표현합니다.
당연히 4개를 넣으면, 4way가 되구요.
그리고, 같은 방안에서 다른 꼬리표를 가지는 데이타들이 있다보니 방이 꽉찬 상태에서 새로운 데이터가 들어왔을 때 기존 멤버 중에 누구를 쫓아내느냐에 대한 규칙을 정해야합니다.
이 규칙에는 여러가지가 있지만, 가장 널리 쓰이는 방식이 LRU(Least Recently Used) 방식입니다.
가장 오랫동안 사용되지 않은 녀석이 먼저 쫓겨나는 것입니다.
쓰기 정책
캐시는 읽기 동작을 빠르게 해주는 역할을 하지만 캐시와 메인 메모리에 같은 데이터가 있을 때 CPU가 쓰기 동작을 할 수 있는 방법은 두가지가 있을 수 있습니다.
Write through : 메인 메모리와 캐시를 항상 동시에 쓴다.
Write back : 캐시에 우선적으로 쓰고, 메인 메모리는 캐시가 바뀔 때에만 쓴다.
Write through 방식은 캐시와 메인 메모리의 데이터가 항상 같으므로 특별히 신경쓸 일이 없습니다.
그러나, 메인 메모리에 접근하는 횟수가 많아진다는 단점이 있습니다.
반대로, Write back 방식은 메인 메모리에 접근하는 횟수가 적지만, 메모리를 이용하는 모든 장치가 반드시 캐시를 통해야 한다는 단점이 있습니다. 회로가 복잡해진다는 이야기이지요.
명령어와 데이터의 분리
L1 캐시에서 볼 수 있는 형태죠?
명령어와 데이터를 따로 분리하면 적중률은 약간 낮아진다고 합니다.
그러나, 분기 예측 알고리즘 같은 고급스러운 기능을 돌릴 수 있다는 강점이 있다네요.
다 단계 캐시
요즘의 CPU에서 일반적으로 사용하는 방법입니다. 여기서도 둘 (L1,L2)사이의 관계에 따라 두가지 종류가 있습니다.
Inclusive : 두 캐시에 데이터가 모두 존재함. (인텔 방식)
exclusive : 둘 중 하나의 캐시에만 데이터가 존재함. (AMD 방식)
이 부분의 상세한 내용은 이미 파코즈에 올라와 있으므로 (링크1 참고) 생략합니다.
'Board' 카테고리의 다른 글
내 휴대전화 '중고폰' 아닐까 (0) | 2007.08.30 |
---|---|
[통신관련] dns 서버 바꾸기 (필터링을 피하기 위한) (0) | 2007.08.30 |
Rev 1.00 (0) | 2007.08.30 |
[C언어] Visual C++ 로, 파일의 CRC32 값 구하기 (0) | 2007.08.30 |
SATA HDD의 NCQ지원(AHCI) 활성화 방법 (0) | 2007.08.30 |
- Total
- Today
- Yesterday
- server
- 윈도우
- 오라클
- MySQL
- 리눅스
- user
- select
- 데이터
- Toad
- 백업
- tomcat
- eclipse
- IP
- delete
- apache
- DATABASE
- java
- Shell
- Windows
- Oracle
- 파일
- 테이블
- DB
- table
- Linux
- mssql
- sql
- 서버
- 자동차
- 설정
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |