캐시메모리

2022. 12. 10. 21:06카테고리 없음

사전적의미: 물건을 일시적으로 저장

보관하기 위해 사용하는 곳

기술적의미: 자주 필요한 데이터나 값의 복사본을 일시적으로 저장, 보관하기 위해 사용하는곳

 

캐시: 컴픁터 과학에서 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 캐시는 캐시의 접근시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용한다.

캐시에 데이터를 미리 복사해 놓으면 계산이나 접근 시간 없이 더 빠른 속도로 데이터에 접근 할 수있다.

 

캐싱: 이러한 캐시라는 작업을 하는 행위(행동)이다.

컴퓨터 분야에서 다양하게 사용된다, cpu 성능 향상, 메모리 웹 페이지를  동작시키는 분야까지 가리지 않고 사용된다.

 

 

cpu 와 메모리간 성능 차이

 

1)cpu는 데이터 처리 위해 메모리와 끊임없이 데이터를 주고받는 구조

2)메모리가 cpu의 데이터 처리 속도를 쫓아가지 못한다.

3) cpu가 메모리를 기다려야 하는 병목 현상 발생

 

cache Memory: 크기는 작지만 속도가 빠르다, 재사용 가능성이 높은 데이터 복사본 저장 해둔 후 cpu가 요청하는 데이터를 바로바로 전달

 

 

 

캐싱은 메모리 계층 구조의 핵심

: 레지스터가 캐시메모리를 캐싱하고, 캐시메모리가 램을 캐싱하고, 메인메모리도 하드디스크를 캐싱한다.

캐싱을 이용하여 빠르고 작은 메모리와 크고 느린 메모리를 조합해서 크고 빠른 메모리 처럼 만든다.

 

 

Q.재사용성이 큰지 알 수있는 방법?

데이터 지역성의 원리

 

1) 시간 지역성:

-특정 데이터가 한번 접근되었을 경우, 가까운 미래에 또한번 데이터에 접근할 가능성이 높은것

-메모리상의 같은 주소에 여러차례 읽기 쓰기를 수행할 경우 상대적으로 작은 크기의 캐시를 사용해도 

효율성이 높다.

 

 

2) 공간 지역성: 

-특정 데이터와 가까운 주소와 순서대로 접근되는 경우 

-한메모리 주소에 접근할때 그 주소뿐 아니라 해당 블록을 전부 캐시에 가져옴

-이때 메모리 주소를 오름차순이나 내림차순으로 접근 한다면, 캐시에 이미 저장된 같은 블록의 데이터를 접근하게 되므로 캐시의 효율성이 크게 향상될 수 있다.

public class ArrayEx01 {
	public static void main(String[] args) {
		String[] beer = {"Kloud", "Cass", "Asahi", "Guinness", "Heineken"};
		    // 인덱스 번호 :   0  ,    1   ,   2   ,     3      ,     4
		System.out.println(beer[0]); // Kloud
		System.out.println(beer[1]); // Cass
		System.out.println(beer[2]); // Asahi
		System.out.println(beer[3]); // Guinness
		System.out.println(beer[4]); // Heineken
	}
}

 

공간지역성과 + 시간지역성 

for(int i ; i<3 ; i ++){
data[i+1] = data[i]+1;

}

-변수 i를 선언후 재접근 : 시간 지역성

-data[0] 에 접근 -> data[1]에 접근->data[2]의 접근 연속적으로 : 공간지역성 

 

*캐시메모리가 해당 데이터를 가지고 있다면 : 캐시히트 (적중)
*해당 데이터가 없어서 메인 메모리에서 가져와야 한다면 : 캐시미스 

 

 

캐시 메모리 쓰기 정책과 캐시 일관성 

cpu에서 데이터를 읽는 동작이 아니라  입력하는 동작이 발생하고, 데이터를 변경할 주소가 캐싱된 상태라면 메모리의 데이터가 업데이트 되는 대신 캐시의 데이터가 업데이트 된다.

따라서 , 메인 메모리를 업데이트 해주어야 하는데 , 이 메인 메모리를 업데이트 하는 시점에 따라 정책이 두가지로 나뉜다.

write Back 정책은 

속도는 빠르지만 캐시와 메모리가 서로 값이 다른 경우가 발생할 수 있다, 데이터가 변경됐는지 확인하기 위해 캐시 블록마다, dirty비트를 추가해야 하며, 데이터가 변경되면 1로 변경 , 이후 해당 블록이 교체 될때 drity비트가 1이라면 메모리의 데이터를 변경하는 방식이다.

 

결론:

 

캐싱- 캐시에 데이터나 계산된 결과 값의 복사본을 저장해 둠으로써 전체적인 처리 속도를 향상 시킨다.

-데이터에 직접적으로 접근하는데 걸리는 시간이 오래 걸릴때

-필요한 값을 얻기 위해 계산하는 과정을 생략하고 싶을때

-반복적으로 동일한 결과를 돌려주는 경우 (이미지나, 썸네일등)

 

캐싱은 복사본을 이용하는 것이다 

 

복사본과 원본이 달라지는 경우가 생길수 있으니 일관성 유지에 유의 하자.

 

캐싱을 이용한  프로그램

 

1)데이터 베이스

:쿼리를 실행하여 하드디스크에서 데이터를 읽고 쓰는 것은 시간이 오래 걸리는 작업

데이터 베이스는 쓰기보다는 읽기만으로도  데이터가 많다, 자주 요청 받는 쿼릐의 결과를 캐싱해 두면 효율이 오른다.

따라서 데이터 베이스 자체에서 별도의 캐시를 운영한다

 

2)CDN(Content Delivery Network)

:유튜브 의 메인 서버는 미국에 있다. 

한국과 미국을 잇는 국제 인터넷 회선은 비싸고 용량을 늘리기 어렵다. 

구글은 각 통신사 마다 google golbal cache를 두어 인기있는 유튜브 동영상을 미국 서버까지 접속할 필요없이 

국내 서버에서 처리하도록 함

비싼 국제 회선 비용이 절감 되고 버퍼링도 준다 , 또한 고화질로 시청가능

 

이처럼 세계각지에 캐시서버를 두어 전송속도를 높이고 부하를 분산하는 시스템 이다.

 

3) 웹캐시

: 네트워크를 통해 데이터를 가져오는 것은 하드디스크 보다도 느릴때가 많다.

그래서 웹브라우저는 웹페이지에 접속할때 HTML,CSS,자바스크립트, 이미지등을 하드 디스크나 메모리에 캐싱해 두었다가 다음번에 다시 접속할때 재활용 한다.

 

4)프록시 서버

:클라이언트에서 자주 요청받는 내용은 웹서버로 전달하지 않고, 웹서버 앞단의 프록시 서버에서 캐싱해둔 데이터를 바로 제공한다.

 

5)Redis

: 웹,NOSQL DBMS의 일종 , 웹서비스에서 캐싱을 위해 많이 쓴다.