캐시히트와 캐시미스

2024. 10. 30. 23:31·Computer Science/Operating System
캐시
속도가 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리

 

캐시는 반응 속도가 빠른 SRAM(Static Random Access Memory)으로 주소가 키(Key)로 주어지면 해당 공간에 즉시 접근할 수 있음

이러한 특성은 DRAM(Dynamic Random Access Memory)도 동일하지만 하드웨어 설계상 DRAM은 SRAM보다 느림

  • DRAM은 행과 열을 순차적으로 활성화하여 데이터에 접근하며 이 과정에서 추가적인 지연이 발생하기 때문

 

캐시를 설정할 때는 자주 사용하는 데이터를 기반으로 설정함

이 때 지역성을 기반으로 설정되는데, 시간 지역성과 공간 지역성으로 나뉨

 

int[] arr = new int[10];

for(int i=0; i<10; i+=1){ // 시간지역성
	arr[i] = i; //공간지역성
}
  • 시간 지역성(temporal locality)
    • 최근 접근한 데이터에 다시 접근하는 경향 
    • 반복문에 사용하는 조건 변수처럼 한번 참조된 데이터는 잠시후 또 참조될 가능성이 높음
  • 공간 지역성(spatial locality)
    • 최근 접근한 데이터의 주변 공간에 다시 접근하는 경향
    • arr[0], arr[1]과 같은 연속 접근 시, 참조된 데이터 근처에 있는 데이터가 잠시후 또 사용될 가능성이 높음
      • 배열의 요소들이 메모리 공간에 연속적으로 할당되기 때문

 

캐시 히트와 캐시 미스
  • 캐시 히트(Cache Hit)
    • CPU가 요청한 데이터가 캐시 메모리에 있는 경우
    • 빠르게 데이터를 가져올 수 있어 시스템 성능 향상
  • 캐시 미스(Cache Miss)
    • CPU가 요청한 데이터가 캐시 메모리에 없는 경우
    • 주 메모리(RAM)에서 데이터를 가져와야 하므로 지연 발생
캐시 미스는 같은 캐시 저장장치 내에서도 일어날 수 있음
L1 -> L2 -> L3 -> DRAM

 

캐시 미스의 유형

  1. 강제적 미스 (Compulsory Miss)
    • 데이터에 처음 접근할 때 발생하는 미스
    • 캐시가 비어있을 때 불가피하게 발생
  2. 용량 미스 (Capacity Miss)
    • 캐시 메모리의 용량이 부족하여 발생하는 미스
    • 캐시 크기를 늘리는 것으로 해결 가능하지만, 비용과 복잡성 증가
  3. 충돌 미스 (Conflict Miss)
    • 캐시의 매핑 방식 때문에 발생하는 미스
    • 직접 매핑 캐시에서 주로 발생하며, 연관 매핑이나 세트 연관 매핑으로 완화할 수 있음

 

간단한 실습

// npm install node-cache express

const express = require('express');
const NodeCache = require('node-cache');

// Express 애플리케이션 생성
const app = express();

// Node Cache 모듈의 새 인스턴스 생성
const cache = new NodeCache();

// 샘플 JSON 객체 정의
const obj = {
    "userId" : 1,
    "id" : 1,
    "title" : "test",
    "completed" : false
}

// '/test' 경로에 대한 GET 라우트 생성
app.get('/test', (req, res) => {
    // 캐시에서 'test' 키의 값 가져오기
    const value = cache.get('test');

    // 캐시에 'test' 키의 값이 있으면
    if(value){
        console.log('캐시 히트. 캐시된 값을 반환합니다.');
        // 캐시된 값 반환
        return res.send(value);
    } else {
        console.log('캐시 미스. 데이터베이스에서 데이터를 가져와 캐시에 저장합니다.');
        // 데이터 가져오는 지연 시간 시뮬레이션
        setTimeout(() => {
            // 'test' 키에 객체 값 설정
            cache.set('test', obj);
            // 객체 반환
            return res.json(obj);
        }, 2000)
    }
});

// 3000번 포트에서 서버 실행
app.listen(3000, () => {
    console.log('Cache server running on port 3000 :: http://127.0.0.1:3000/test')
})

 

처음 접속

  • 캐시에 test 키의 값이 없음
  • 캐시에 key: test / value: obj를 할당
  • 2초 후에 obj가 렌더링 됨

재접속

  • test 키의 값인 obj를 렌더링 함

출처

https://parksb.github.io/article/29.html

https://inyongs.tistory.com/134

'Computer Science > Operating System' 카테고리의 다른 글

캐시매핑  (0) 2024.10.31
PCB와 Context Switching  (2) 2024.10.23
메모리 계층 구조  (0) 2024.10.10
컨텍스트 스위칭(context switching)  (0) 2024.09.20
프로세스와 스레드  (0) 2024.09.19
'Computer Science/Operating System' 카테고리의 다른 글
  • 캐시매핑
  • PCB와 Context Switching
  • 메모리 계층 구조
  • 컨텍스트 스위칭(context switching)
mint723dev
mint723dev
mint723dev 님의 블로그 입니다.
  • mint723dev
    mint723dev 님의 블로그
    mint723dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (89)
      • Computer Science (16)
        • Computer Architecture (0)
        • Data Structure (2)
        • Database (4)
        • Network (4)
        • Operating System (6)
        • Software Engineering (0)
      • Java (6)
      • 자료 구조 (0)
      • 코딩테스트 (63)
        • LeetCode (1)
        • 프로그래머스 (29)
        • 백준 (33)
      • Spring (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    탐욕법
    DP
    JVM
    오블완
    DFS
    티스토리챌린지
    deque
    BFS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
mint723dev
캐시히트와 캐시미스
상단으로

티스토리툴바