캐시
속도가 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리
캐시는 반응 속도가 빠른 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
캐시 미스의 유형
- 강제적 미스 (Compulsory Miss)
- 데이터에 처음 접근할 때 발생하는 미스
- 캐시가 비어있을 때 불가피하게 발생
- 용량 미스 (Capacity Miss)
- 캐시 메모리의 용량이 부족하여 발생하는 미스
- 캐시 크기를 늘리는 것으로 해결 가능하지만, 비용과 복잡성 증가
- 충돌 미스 (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를 렌더링 함
출처
'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 |