cache lab에서 csim.c를 통해 cache의 동작 방식을 시뮬레이션해보자!
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의 정보를 추출하자
- 가장 오른쪽 bit인 블럭(b)을 없애고(b만큼 오른쪽으로 shift) tag가 남아있기 때문에 set mask를 씌워서 set의 위치를 찾는다.
- address를 s+b bit만큼 오른쪽으로 shift하면 tag가 나온다.
먼저 cache hit가 발생하는 경우를 알아보자
- cache[set_index]에 있는 line을 모두 찾아본다
- 현재 line의 valid가 0인 경우 넘어간다
- 현재 line에 정보가 있다면 tag를 확인해본다
- tag가 같다면 hit_count를 증가시키고 사용한 시점을 업데이트 하기 위해서 lru변수에 현재 lru_counter를 입력하고 lru_counter를 증가시킨다.
- return
// cacheAccess() #2
cache miss, eviction이 발생하는 경우를 알아보자
cache hit가 발생하지 않았다면 cache miss 가 발생했다는 뜻이다. -> cache miss++
이제 LRU replacement policy에 따라서 사용한지 가장 오래된 line을 찾아보자
lru값이 작다는 말은 사용한지 오래되었다는 뜻이다.
- 사용한지 가장 오래된 line이 이미 사용중이라면 교체해야 한다. -> eviction++
- 찾은 line의 위치에 새로운 정보를 입력한다.
'CS > SystemSoftware' 카테고리의 다른 글
SystemSoftware - Cache Memory #3 (0) | 2021.06.16 |
---|---|
SystemSoftware - Exceptional Control Flow #3 (0) | 2021.06.09 |
SystemSoftware - Cache Memory #2 (0) | 2021.06.06 |
SystemSoftware - Cache Memory #1 (1) | 2021.06.06 |
SystemSoftware - Creating Processes #2 (0) | 2021.06.06 |