CS/SystemSoftware

Cache Lab csim.c #1

Henu 2021. 6. 7. 16:50
cache lab에서 csim.c를 통해 cache의 동작 방식을 시뮬레이션해보자!

 

 

 

SystemSoftware - Cache Memory #1

cache memory에 대해서 알아보자 Locality Temporal locality(시간 지역성) : 최근에 접근했던 data나 명령이 가까운 미래에 다시 사용될 가능성이 높다. (마지막으로 사용된 시간이 오래될수록 다시 사용될

hyeo-noo.tistory.com

 

cache lab을 하기 위해서 반드시 이해해야 할 개념이 있다.

  • cache에 접근하기 위한 address bit의 구조
  • cache 메모리 자체의 구조
  • cache에 data를 mapping 하는 방식

해당 개념에 대해서 알쏭달쏭하다면 위 링크를 통해서 이해하고 오자!


cache lab tar 파일을 압축해제하고

./csim-ref

명령을 쳐보면 아래와 같이 나온다.

 

 

우리의 csim파일이 위와 같은 명령어를 통해 s, E, b 값과 입력으로 쓰일 파일명을 입력받음을 알 수 있다.

s, E, b 값과 파일명을 변수에 저장하는 작업은 main함수에 작성이 되어있으므로 간단히 이해하고 넘어가자.


 

 

trace폴더로 이동해서

vi yi.trace 

명령어를 쳐보면 파일에 위와 같이 써 있음을 알 수 있다.

 

 L  10,1   :   주소 10에 있는 정보를 2^1byte(블럭의 크기)만큼 load하라는 의미이다

 

M : 데이터를 수정하라는 의미이다.

 

**주의** 

데이터 수정은 cache에서 데이터를 읽어들이고, 다시 cache에 접근해 데이터를 저장하는 작업이다.

따라서 cache에 2번 접근함을 이해하자.

 

S : 데이터를 저장하라는 의미이다


// replayTrace() - 함수명 변경 금지. 

 

trace_fn은 main함수에서 입력받은 입력파일이 있는 파일명이다.

EOF가 발생하기 전까지 명령어, 주소, 블럭의 크기를 변수에 받고

명령에 따라서 cacheAccess 함수를 실행한다.

(수정 명령이 들어온 경우는 cache에 2번 접근함)


// cacheAccess() #1

 

참고

address의 정보를 추출하자

  1. 가장 오른쪽 bit인 블럭(b)을 없애고(b만큼 오른쪽으로 shift) tag가 남아있기 때문에 set mask를 씌워서 set의 위치를 찾는다.
  2. address를 s+b bit만큼 오른쪽으로 shift하면 tag가 나온다.

 

 

먼저 cache hit가 발생하는 경우를 알아보자

  •  cache[set_index]에 있는 line을 모두 찾아본다
    1. 현재 line의 valid가 0인 경우 넘어간다
    2. 현재 line에 정보가 있다면 tag를 확인해본다
    3. tag가 같다면 hit_count를 증가시키고 사용한 시점을 업데이트 하기 위해서 lru변수에 현재 lru_counter를 입력하고 lru_counter를 증가시킨다.
    4. return

// cacheAccess() #2

 

cache miss, eviction이 발생하는 경우를 알아보자

 

cache hit가 발생하지 않았다면 cache miss 가 발생했다는 뜻이다. -> cache miss++

 

이제 LRU replacement policy에 따라서 사용한지 가장 오래된 line을 찾아보자

lru값이 작다는 말은 사용한지 오래되었다는 뜻이다.

 

  1. 사용한지 가장 오래된 line이 이미 사용중이라면 교체해야 한다. -> eviction++
  2. 찾은 line의 위치에 새로운 정보를 입력한다.