오래 못 할 짓 하지 않기

컴구 기말 본문

2학년 2학기/컴퓨터 구조

컴구 기말

쫑알bot 2023. 12. 7. 21:00
728x90

챕터 5

 

  • DISK의 용량 / CPU의 속도를 가져오려고
    Cache를 만들었다.

 

  • (코드 주고) > 어떨 때 뭐가 유리함?
    - Temporal Locality: 변수 하나 만들어서 그거 계속 돌려먹을 때
    ex) a= b+1;
         d = 4*a +c;

    - Spatial Locality : 배열 사용할 때
    ex) for( int i=0; i<10000 ; i++){
         a[i] = i;
         }

  • 하나의 Block에 있는 거
    Valid bit
    Tag
    Data

    * 참고로 Tag 비트 수는 유동적이므로 계산하는 것도 할 줄 알아야한다

 

  • ●  Read Misses : 원하는 거 없음
    → CPU stall
    → Mem에서 필요한 데이터가 있는 block fetch
    → cache로 그 데이터를 옮긴다.
    → 다시 시작

 

 

    • Write through ( Dirty bit 필요 X ) 
      - 장점 : Miss인 상황에 작업이 빠르다.

       이유 : cache에 있는 값과 memory에 있는 값이 일치하므로,
       새로운 값을 가져와도 다시 업데이트 할 필요가 없다.( = 다시 돌려주면서 업데이트를 할 필요 X )

      - 단점 : Cache가 업데이트 될 때마다 memory에 접근해야 하므로,  시간이 더 걸린다.

 

    • Write back ( Dirty bit 필요 )
      - 장점 : 메모리에 쓰는 걸 반복하지 않아도 된다. 
      - 단점 : 굳이 꼽자면 Dirty bit를 보고 Miss가 나면 Update를 해야한다. 

Dirty bit

- 특징 : Dirty or clean을 확인한다.
- 용도 : 교체될 때 Update해야하는지 굳이 안 해도 되는지 판단하기 위함

 

 

 

 

이제 Performance측면으로 분석해보자

한 Block에 여러 word를 가져온다고 가정.

 

 

 

[ Miss 상황 ] 

Mem → Cache →  CPU 시간을 기다려야 한다. 

 

Performance를 줄이려면?
1. Miss 확률 ↓   ( 그럼 많이 가져와야하는데, Miss penalty가 커지고, spatial locality 저하 유발 )

2. Miss Penalty  ↓ 

 

 

Placements

 

1) Direct : Tag로 자신에게 맞는 칸에 mapped된다

 

Block(index)로 들어가서 Tag에 맞게 Mapped된다.

 

 

 

 

 

2) Fully associative : 빈칸이 있으면 그냥 아무렇게나 들어간다.

 

특징 : 아무 곳에나 저장 가능

          = 정보 찾으려면 오래 걸림 = 별로 유용하지 않음

 

> parallel하게 동시에  [ 찾으려는 데이터의 tag ]와 [ 주소를 나타내는 tag ] 여러 개 비교할 수 있도록 만들어야 한다!

 

 

 

3) Set associative : 위 2개가 섞인 느낌이다. Set는 태그로 들어가고, 그 안에서는 맘대로 들어감

 

set는 정해줄게 그 안에는 너가 알아서 들어가

 

●  장점 : Associative set의 개수가  늘어나면 miss날 확률이 줄어든다. 

●  단점 : hit인지 확인하는 데 오래걸림.
            ex) tag로 들어가서 다 찾아보고,  그 다음 tag에서 다 찾아보고...

 

 

* Replacement 방식에 따라  새로 들어오는 데이터가 어느 자리에 갈지 정해짐.

 

왼쪽이 Direct mapped / 오른쪽이 set associative

 

 

 

다 이렇게 표현 가능

 

 

 

Replacements

miss가 난 경우에 Fully나 set associative cache에서는 어떻게 해야할까 에 대한 대답

 

 

  1. 랜덤 : 새로운 애 들어와야 하니까 아무나 나가

  2. 선입선출 ( First In, First Out )  (사용된 시점에 집중)
    - 가장 오래동안 있었던 애를 내보냄
    - 이를 위해서는 언제 왔는지 알기 위한 Time Stamp 기능이 필요
    - Queue로 구현 가능

    *문제점 : 걔가 앞으로 가장 많이 쓰일 데이터라면??

  3. Least Recently Used (LRU)  (사용된 시점에 집중)
    - 가장 최근에 사용하지 않은 것  
    = 지금 기준 제일 옛날에 "사용" 한 것을 내보냄 

    - 쓰일 때마다 Time Stamp 필요하다 = Overhead가 심하다.

    FIFO와 공통점 : Time Stamp를 참고하여 내보낸다
                 차이점 : Time Stamp가 찍히는 시점이 다르다 ( 들어왔을 때 vs 사용될 때 )   

  4.  Least Frequently Used (LFU)       (사용된 횟수에 집중)

    - 가장 적게 쓰인(= reference된 ) 것 

      Reference될 때마다 count를 하고, Miss이고 데이터가 다 찼을 때 count값이 가장 적은 데이터를 내보냄

 

빈틈 : 들어온지 얼마 안 된 데이터는 상대적으로 count가 적을 수 밖에 없어서 얘네가 쫓겨날 수도 있음