Memory Hierarchy 메모리 계층구조
컴퓨터 메모리 설계에서 가장 중요한 목표는
용량(Capacity)가 크고 속도(Speed)가 빠르며 비용(Cost)이 적게 들어야한다.
메모리 계층 구조는 다양한 형태의 메모리를 조합해서 systemic한 방식으로 조합하는 것
다음은 계층 구조를 보여준다.
process 레벨에서 보면 register가 있다.
이것의 크기는 보통 최대 32개를 가지는데 명령의 크기 format에 좌우 받는다.
사이즈 자체가 작고 cpu내에서 구현되어서 비싸고 , cpu가 직접 접근할 수 있어서 빠르다.
CPU cache는 SRAM으로 만들어져서 DRAM보다 빠르지만 비싸고 용량이 작다
Level1 cache, Level2 cache, Level3 cache와 같이 구성 되어 있다.
우린 Level1 cache 만 중점으로 본다.
DRAM에 구현된 실제 Main Memory는 비교적? 적당히 빠르고, 평균적인 용량, 적절한 가격
SSD(Solid State Drive) flash memory, hard disk에 비해 비싸고 빠르다.
HDD(Hard disk)는 기계적으로 모터로 구동되기 때문에 매우 느리다.
대신 한 bit의 정보를 저장하는데 비용이 매우 싸고 용량을 매우 크게 가지고 간다.
위쪽으로 올라갈수록 속도(Speed)가 빠르고 비용(Cost)이 크다. 작다 휘발성?
아래쪽일수록 용량(Capacity)이 크다. 싸다 크다 비휘발성
MAID (Mashed Array of Identify) 서버급 대용량
/*이런 실제적인 예를 본다.
현재 sever급에서는 l4
1kb, 300ps 핸드폰이 더 빠르다
2013년 최신 자료
kilo 10^3 / ki 2^10
낮은 가격,가성비 이런 계층구조가 잘 동작하는 것은*/ ??
Principle of Locality 지역성의 원리
Program을 실행시킬 때 시간에 따른 access 주소를 표시한 것
프로그램이 집중적으로 접근하는 부분이 있다.
Temporal locality 시간적 지역성
최근에 access한 항목은 곧 다시 access 할 수 있다.
예) loop, induction variables?
Spatial locality 공간적 지역성
최근에 access한 항목 주변에 계속 접근할 수 있다.
예) sequential instruction, array data // 순차적으로 접급한다.
Taking Advantage of Locality
이런 지역성의 원리를 이용해서 메모리를 설계하면 성능을 높일 수 있다.
- Memory 계층구조
- 모든것이 disk에 저장되어있다
- 최근에 사용된(& 근처) data를 disk에서 DRAM으로 올린다.
: power를 키면 운영체제가 main memorry DRAM으로 올라온다.
: 프로그램을 클릭하면 dram으로 올라온다
- 최근에 사용한(& 근처) data를 DRAM에서 SRAM으로 복사
:이렇게 올라온것 중 자주 사용되는 것이 sram cache로 올라온다.
:이것은 CPU에 있고 block단위로 올라온다.
- 올라오는거 자체가 한번에 다 올라오는 것이 아니라 block, page단위로 일부분만 올라온다.
:mayhe 여러 words
- process는 가장 가까운 L1 cache Memory 에게 요청한다.
:있으면 heat, 빠르게 가져오고 /없으면 miss 이 경우 다음 단계에 요청해서 어딘가에 장착으로 하고 사용한다.
:이때 사용되는 비용을 miss penalyty라고 한다 miss ratio 10번중 한번이 miss이면 0.1
Memory Technology
메모리주소에 대한 상세한 내용
SRAM 전형적인 접근 속도는 0.5~2.5ns (10억 분의 1초)
DRAM은 50-60ns (가격이 싸다)
Flash memory 비교적 느리지만 비교적 싸다 --ssd
Magnetic disk //hhd
- DRAM의 셀은 capactiy를 이용해서 충/방전하는 방식으로 만든다.
한 bit의 정보를 저장하는데 간단하다.
- SRAM은 인버터를 사용해서 flip-flop을 만든다.
그래서 비싸고 항상 동작하는 상태로 읽고 쓸 수 있어서 빠르다.
DRAM Technology
DRAM에 bit를 저장하는 것을 2차원 array형태로 구성한다. 이런 2d array를 bank라고 한다.
여러 개의 row로 구성되어 있고 DRAM은 보통 하나의 row를 row buffer에 가져다 놓는다.
그리고 colum 주소를 바꿔서 DRAM내의 데이터에 접근한다.
bank 여러 개를 장착해서 동시에 접근할 수 있게 해서 속도를 높인다.
DDR(Double Date Rate) DRAM/ SDRAM
: Double Date Rate clock이 있어서 올라갈 때, 내려갈 때마다 access하는 개념이다.
(속도를 높이기 위해 DDR1, DDR2, DDR3, DDR4로 사용)
QDR(Quad Data Rate) DRAM
: DDR의 입력과 출력을 분리한다.
DRAM Generations
dram의 등장으로 큰 발전을 했다
속도가 빨라지면서 개선이 쉽지가 않다 왜냐하면 Capacitor 로 동작하기 때문에
CPU의 속도는 빠르게 진행되지만 DRAM의 속도는 못 따라간다.
CPU가 일을하려고 data를 가져가려고 하는데 DRAM이 안준다.
이것을 개선하기 위해서 만든 것이 cache! --> 계층원리로 SRAM에 가져다 두고 사용한다.
Flash stroge
두번 째 저장소로 사용한다.
power를 꺼도 data가 사라지지 않는다. Nonvolatile 비휘발성
data 저장 형태가 트랜지스터 하나가 한 bit를 저장한다. 빠르고 반도체여서 안정되어 있다.
HHD는 plate 위에 자성체를 발라서 head라는 것이 읽는다.
이 plate는 스핀들 모터로 동작하는데 head가 잘못해서 건드리면 망가진다.
그래서 flash strog는 roubust하다. 비싸긴 하다 ㅎ
크게 nor/ nand가있다
NOR flash : NOR gate와 같은 bit cell
Random하게 읽고 쓸수 있다.
기존의 rom을 대체해서 사용한다.
지울 때 block단위, 쓸 때 word단위
NAND flash : NAND gate와 같은 bit cell
읽고 쓸 때 block단위
기본적으로 HHD와 특성이 유사해서 이것으로 SSD를 만든다.
z.B) usb flash drive medisa stroge usim
횟수 제한이 있다. 근데 충분히 커서 신경안써도 된다.
Disk Storge
Nonvolatile, plate에 자성체를 붙여놓고 동그랗게 track을 만들어 놓는다. 그걸 또 짤라서 sector라고 하고 sector단위로 접근한다.
- ECC(Error correcting code) 데이터가 한비트 정도 에러가 날 경우 커버할 수 있다
spindle 모터가 plate동작시키고 거기에 arm과 head가 있어서 움직이면서 track의 데이터를 가져온다.
/*disk access ex
어느 위치를 읽어라
arm이 움직이고 sector가 오기에 기다리고
시간 계산 */
Average read time =
seek time + rotational latency + transfer time + controller delay
Cache Memory
cache memory는 메인 메모리와 processor 사이에 위차한다.
그래서 가장 cpu에 가깝다.
lw $t0, 0($t1)
cache가 없는 system의 동작
processor가 메모리에게 주소를 발생한다? 924
메모리가 924에서 값 99를 읽어서 processor에게 보낸다
processor가 이것을 t0에 저장한다.
cache가 있는 system의 동작
proceesosr가 cache에 주소를 발생시킨다 924
cache가 Main Memory 924에 해당하는 내용의 data가 cache에 있는지 확인
:있으면 hit 이것을 processor에게 전달하고 processor는 이것을 register에 저장
:없으면 miss가 나고 924를 실제 main memeoy에게 주고 main memory에서 99를 cache에 가져와서 cache는 processor에게 전달.(CPU에 저장)
processor는 t0에 저장
hit는 memory접근을 안해도 되서 빠르고
miss일때 두번 거치므로 miss penalty 발생하여 overhead가 된다.
datail
Tag는 cache에 어떤 main memory 주소의 내용이 있다라는 것을 저장한다 --> Tag
data가 cache에 없을 때 main memory에서 process로 주는데 이때 동시에 cache에 준다.
지역성의 원리로 조만간 또 이용할 것 같기 때문에 cache의 빈곳에 가져다 놓는다.
cache block을 word라 할 경우 그리고 이것이 align되어 있으면 주소가 4의 배수이다.
그러면 주소의 마지막 두 bit가 00이다. 그래서 00을 지우고 앞에 부분만 Tag로 저장한다.
- main memory에서 cahce로 올 때 block size단위로 오고 이것을 cache에서 line이라고 한다.
하나가 access되면 금방에 있는 것들이 access할 확률이 높기 때문에 금방에 있는 2^m(block 단위)개를 같이 가져온다.
그러면 Tag size는 m-bit로 줄어든다
- 우리가 cache를 동작시킬 때 처음에는 아무것도 없는데 process가 동작하면서 하나씩 채워진다
cache에 data가 있는지 알기 위해서 V (validate)를 둔다. V = 1 있다. V = 0 없다.
음 power를 키면 validate가 모두 0이다.
- 어떻게 mapping되어 있는가
: Direct mapped 하나가 access되면 금방에 있는 것들이 access할 확률이 높다. // one to many
: Associative :가는 곳이 한 곳이 아니고 여러 곳이다 //many to many
그래서 먼저 direct mapped cahe를 살펴보면 32byte로 main memroy 구성
cache가 8byte
00001, 01001, 10001 인 경우 001로 간다
규칙은 block address로 modulo를 취한다 1/8(cache의 개수)이때 나머지를 구한다.
주소의 나머지를 구하는 방법은 2^n이라하면 나머지는 비트의 아래3개
여기에 올수 있는 data는 4개중 하나이다. 이것을 확인하기 위해 몫을 tag에 둔다.
cpu가 준 주소를 가지고 어느 위치를 확인하고 valide를 확인하고 tag확인후 process에게 준다.
만약 cahce가 비어있으면 데이터를 넣고 tag를 넣고 valide변화
다른 데이터가 있었다면 데이터를 가져놓고 tag변화
Directed
1 word/block, cache단위 1K word (4kb)
1024개(word단위)
block offset == 00
[11-2] 10bit로 validate확인
comparator로 tag 확인 이결과로 validate확인 그거이 1이면 hit 그래서 process에게 전달
multi blo차 diread
4 word/block이 하나의 묶음, 캐시의 용량은1k word(4kb) -> 16b로 묶었다
cahce의 저장소 위치가 줄어든다 1024//4 à 256(index)
[11-4] 8개만 확인 à index로 ,, 상위20bit tag
그다음에 [3-2]로 4개 word중 확인 multiplexr (4*1)총 32개 (bit수)
spatial locality로 동작하는 것!
data를 memory에 쓰려고 하는데 hit이면 caceh를 업데이트한다.
cache가 update되어도 memory는 바뀌지 않는다, inconsistent!! …써야되는데
이것을 해결하기 위해서 방법 2!
1 wirte through:
cache가 update될때 즉시 memory도 update한다. --> cache를 쓰는 이유가 없다
cpi가 1이고 10프로의 명령어가 store라면, 그리고 쓰는데 100cycle이 걸리면
1+ 0.1 *100 = 11 성능이 많이 안좋아진다. 원래는 1
main memroy가 안정된다
solution: write buffer , processor가 main memory에 쓸 주소와 data를 가지고 있다. 이 주소를 이용해서 data를 대신 쓴다.
cpu는 직접 쓰지 않고 다른 것을 하기 때문에 성능이 좋아진다. write buffer가 꽉차면 processor도 기다린다. 이런 문제점을 해결하는게 2!
2. write-back:
쓸일이 있으면 chace를 update를 하고 dirty bit 넣고 consistency가 깨져있다고 알려준다. 그리고 자주 안쓰면 다른 cache로 대체할때 먼저 교체 이 경우도 write buffer사용 이건 좀 비싸고 성능을 올릴 수 있다.
cache의 도입 이유 memmory access접근을 줄이기 위해서!
캐시가 있을 때 성능을 보면
cpu time을 구성하는 것 program 실행 cycle, memory에 접근하는 stall cycle
stall cycle은 cache miss에 의해서 발생한다.
프로그램이 있었을 때 전체 : memory access * miss rate * miss penalty == miss* misspenalty !!!!!
(변형) miss rate = miss/(memory access)
'컴퓨터 구조' 카테고리의 다른 글
컴퓨터 구조 13장 - Parallel Processor (0) | 2020.06.17 |
---|---|
컴퓨터구조 12장 - Memory 2 : Virtual Memory (0) | 2020.06.17 |
컴퓨터구조 12장 - Memory 2 : Associative Caches (1) | 2020.06.17 |
컴퓨터 구조 7장 - Processor (2) | 2020.05.12 |
컴퓨터 구조 6장 - Processor (0) | 2020.05.12 |