Notice
Recent Posts
Recent Comments
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

SYDev

[컴퓨터 구조] Lecture 17: Memory Hierarchy - Part1 본문

3학년 1학기 전공/컴퓨터 구조

[컴퓨터 구조] Lecture 17: Memory Hierarchy - Part1

시데브 2024. 6. 3. 03:04
경희대학교 김정욱 교수님의 컴퓨터 구조 강의 내용을 기반으로 한 정리글

 

ROM vs. RAM

ROM(Read Only Memory)

  • 읽을 수만 있는 메모리
  • Non-vollatile memory(비휘발성 메모리): 전원이 꺼져도 영구정으로 파일을 저장
  • Mask ROM: 반도체 생산 공정인 마스킹 단계에서, 고정된 데이터 회로 패턴으로 생산하는 방식

 

RAM(Random Access Memory)

  • 일시적 메모리
  • Read-write memory: 읽고 쓰기 가능
  • Volatile memory: 일시적으로 파일을 저장한다 -> 컴퓨터가 작동중일때
  • ex) DRAM, SRAM

 

SRAM vs. DRAM

SRAM(Static Random Access Memory)

  • cache memory(캐시 메모리)
  • 한 비트 표현을 위해 6개 이상의 트랜지스터 필요: DRAM에 비해 집적도가 낮고, 소비 전력이 큼
  • 플립플롭 소자로 구성: 전원이 연결된 동안 내용 계속 유지
  • 속도가 빠름: SRAM은 capacitor 사용 X -> refresh(충전) 필요 없음

 

-> 두 입력 값은 서로 다른 값을 가진다.

-> Set이 1이면 플립플롭에 의해서 1 유지

-> Reset이 1이면 플립플롭에 의해서 0 유지

 

DRAM(Dynamic Random Access Memory)

  • 커패시터 사용 -> 시간 지나면 스스로 방전 -> 전원이 계속 공급되더라도, 커패시터가 주기적으로 재충전되어야 기억된 내용 유지
  • 충전이 필요하므로, SRAM보다 상대적으로 느림
  • 회로가 비교적 간단하고 가격이 저렴
  • 집적도가 높음 ->  대용량의 기억장치에 주로 사용
  • 전원이 꺼지면 자료 계속 보존 불가능
  SRAM DRAM
구조적 특징 플립플롭 커패시터
휘발성/비휘발성 휘발성 휘발성
용량 작다 크다
가격 비싸다 저렴하다
속도 빠르다 느리다
재충전 여부 재충전 필요 X 재충전 필요 O

 

Memory Hierarche

메모리 계층 구조

 

Principle of Locality(국소성의 원리)

Temporal locality

  • 최근에 접근한 적이 있는 item -> 또 접근할 가능성이 높음

Spatial locality

  • 접근된 아이템에 가까운 주소의 아이템에 접근할 가능성이 높음
  • 메모리가 잘 정리되어있다는 가정

 

Block

  • 복사해오는 정보의 최소 단위

 

데이터가 upper leveld에 존재

  • hit: upper level(cache)에 존재하면 hit이라 함
  • Hit rate(hit ratio): cache가 적중되는 비율 -> 메모리 계층 구조의 성능 척도
  • Hit time: 원하는 것이 cache에 존재하는지 확인하는 시간

 

 

데이터가 upper level에 존재하지 않는 경우

  • miss: 한 번도 부른 적이 없거나, 부른 적이 있는데 캐시 용량이 작아서 지워진 데이터 -> hit되지 못하면 miss라 함
  • Miss rate(miss ratio): upper level에서 cache가 적중되지 않은 비율 -> miss ratio = 1 - hit ratio
  • Miss penalty: lower level에서 cache로 block을 교체하는 시간 + cache에서 processor로 block을 전달해주는 시간

 

Cache Memory

Cache

  • 메모리 계층 구조에서 CPU에 가장 가까운 단계

 

Direct-mapped cache

  • 각 메모리의 위치캐시의 정확히 한 위치에 매핑되는 구조
  • modulo 연산을 통해서 위치 계산

 

-> memory의 위치는 5bit인 것에 비해, cache는 3비트

-> memory의 위치에 대해 3비트(2^3 = 8) modulo연산

-> 29는 11101 mod 1000 = 101

-> 5는 00101 mode 1000 = 101

 

1. 우리가 원하는 data item이 cache에 존재하는지 아는 방법

  • cache에 valide bit 추가
  • valid bit: entry가 유효한 주소(valid address)를 담고 있는지 확인하는 지표
  • initial valid bit value: 0
  • cached에 데이터가 저장돼있으면 valid bit = 1

2. valid bit가 1이면, 그것을 어떻게 찾을 것인가

  • cache에 tag를 설정
  • tag: 주소 정보를 포함 -> 요청된 word에 적합한 cache의 word를 판별하기 위한 정보

 

Accessing a Cache

 

Data Field

  • Data field에는 우리가 원하는 데이터가 저장됨!! not address(ex: 10110)

10110 요청

miss -> cache로 가져온 이후 index110: v = Y(1), tag(10), Data

 

00110 요청

v = Y -> but, tag(10)가 requested data의 tag(00)와 일치하지 않음 -> switch(10110 -> 00110): tag와 data 교체

 

1 word block

  • address(32-bit ) = Tag(20-bit) + Cache index(10-bit) + Byte offset(2-bit) 
  • byte offset? 주소는 4의 배수이기 때문

  1. index를 이용
  2. 해당 index의 block에 valid bit(1 or 0) + tag field의 일치 여부(1 or 0) -> and gate
  3. 둘 다 1이면 hit

 

Larger block size

  • 접근하려는 블록에 여러 개의 워드 존재 -> block size가 1보다 큰 경우
  • 주소: Tag(32 - n - m - 2 bit) + Cache Size(n bit) + Block Offset(m bit) + Offset(2 bit)
  • 메모리의 주소를 이용하여 cache memory에 접근
  • cache size: 2^n개의 index 존재, Block Offset: 2^m개의 words 가짐

-> 만약 캐시가 64개의 블록을 사용하고, 한 블록 당 16byte를 저장한다면? -> 16 byte = 4 words = 2^2 words 

-> 2^(m+2) = 16 ->> m은 2

-> 2로 byte addressing, cache size(index) n은 6, block offset m은 2(block의 단위!!!!), 남은 field는 tag

 

주소 구조에서 Cache size와 Block Offset의 위치 

  • 현재 구조는 Block Offset에 Byte addressing이 적용된 형태 -> 4가 곱해짐
  • 만약 cache size와 block offset의 위치가 바뀌면 -> offset + cache size만큼 block offset(block size)가 커짐 
  • 원래는 0, 4, 8, 12 단위로 움직일 것을, 0, 32, 64, 96 단위로 움직이게 될 수 있음 -> 근처에 위치한 주소를 찾아야 하는 spatial locality가 깨짐

1. Cache size

  • 1 block size: 4word = 4 * 2^2 byte = 2^4 byte
  • cache data size 16KiB = 2^4 * 2^10 byte
  • cache data에서 Block의 개수(Number of Blocks) = cache data size / 1 block size = 2^10
  • cache는 2^10개의 block를 가지므로, index 비트 = 10

2. Tag size

  • 4-word blocks -> block offset = 4 = 2^2, word offset = 4 = 2^2
  • Tag size = 32 - (index 비트 + block offset + word offset) = 32 - ( 10 + 2 + 2 ) = 18

3. Total cache size

  • Total cache size: block의 개수 * (block size + tag size + valid field size) = 2^10 * (2^4*2^3 + 18 + 1) = 2^10 * 147 = 147 KiBits -> 18.4 KiB

-> 캐시의 크기는 저장하고자하는 데이터 크기의 1.15배 정도 

 

-> Larger block size에서 메모리가 캐시 데이터를 읽는 방법

-> 16개의 32bits짜리 각 word를 mux에 입력 + block offset의 형태에 따라 

-> 16개의 input 중 하나를 골라 Data로 읽음

 

  • cache의 총 block 개수: 64
  • 1개의 block size: 16
  • main memory의 주소: 1200

(Block address) modulo (Number of blocks in the cache)

1. Block address

  • Block address: Byte address / Btyes per block = 1200 / 16 = 75

2. 75 modulo 64 = 11

  • block address가 75가 나오는 1200 ~ 1215는 모두 같은 cache memory 위치에 저장될 것

 

Miss Rate vs. Block Size

  • block size가 커질 수록 -> spatial locality에 의해 miss rates는 감소한다.
  • 그러나, 일정 구간부터는 miss rates 증가 -> why? -> cache size가 고정이라는 것은 block size * Indexes가 서로 반비례 관계라는 것 -> block size가 커지면 Indexes가 감소 -> 다양한 block을 가져오지 못함
  • cache size가 클 때는? -> 어차피 indexes가 반으로 줄어도, 원래 빈 공간이었을 확률 이 높음 -> 따라서 성능의 차이 X
  • cache size가 커질 수록 -> index 개수가 많아짐 -> miss rates 감소

 

Handling Cache Misses

  1. PC에서 요청한 값을 memory에 요청
  2. 해당 값을 memory가 읽는 동안 기다림
  3. Writing -> cache entry의 일부로 data를 cache memory에 putting -> tag field -> valid bit on
  4. cache memory에 저장된 값을 cpu에 전달

 

Handling Writes

  • sw를 수행했을 때, cache memory와 main memory 사이에 차이가 발생(inconsistent) -> cache memory의 바뀐 값을 memory로 옮겨야 한다.

 

1. Write-through

  • cache memory에 sw하자마자(main memory와의 차이가 생기기 전에) -> main memory도 업데이트해주는 것
  • main-cache 간의 consistent를 항상 유지한다는 장점
  • 좋은 성능을 보이지 못한다.

 

2. Write-through - Use Write buffer

  • cache memory에 sw가 적용되면, 해당 값을 write buffer로 전달 -> write buffer에 차곡차곡 쌓다가 일정 순간에 -> main memory로 업데이트
  • write buffer가 가득 차고, processor가 wirte 해야하는 상황이면 -> write buffer가 empty 상태가 될 때까지 stall

 

Write-back

  • block이 교체될 때 -> main memory로 입력 
  • Dirty bit: data가 modified인지 not modified인지 알려주는 indicator(1bit)
  • 매번 업데이트되는 것이 아니라 -> 교체될 때만 main memory에 접근 -> 메모리 접근 효율을 향상시킴