- 2022.06.03 숙제2022년 06월 04일
- 디지털 블리자드
- 작성자
- 2022.06.04.오전09:40
과제: cache, cache hit, cache miss, byte padding에 대해서 정리하세요!
cache 란?
캐시는 컴퓨터 과학에서 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킵니다.
캐시는 캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용합니다.
캐시에 데이터를 미리 복사해 놓으면 계산이나 접근 시간 없이 더 빠른 속도로 데이터에 접근할 수 있습니다.
캐시는 시스템의 효율성을 위해 여러 분야에서 두루 쓰이고 있습니다.Cache hit 란?
CPU가 메모리 참조를 할 경우 가장 먼저 탐색하는 곳이 캐시메모리입니다.
CPU가 값을 가져오려고 할 때 Cache에 해당하는 값이 있다면 Memory까지 가지 않고 Cache까지만 가서 값을 가져올 수 있습니다.
찾고자 하는 데이터가 캐시메모리에서 발변되었다면 이 경우를 캐시 히트(Cache Hit)이라고 합니다.Cache Miss
반대의 경우로 CPU가 데이터 값을 가져오려고 할 때, Cache에 해당하는 값이 없다면 Memory까지 가서 값을 가져와야 합니다.
해당 데이터가 없어서 DRAM에 접근해야 한다면 이 경우를 캐시 미스(Cache miss)라고 합니다.
캐시미스의 유형에는 3가지가 있습니다.
-Compulsory miss (Cold miss)
해당 메모리 주소를 처음 불렀기 때문에 나는 미스입니다.
예를 들어 프로그램을 새로 켜거나 하는 경우 발생합니다.
전체 컴퓨터 이용 시간에 비하면 굉장히 드물게 나는 미스 유형이라 전체적인 성능에 영향을 미치는 정도는 작습니다.
-Conflict miss
캐시 메모리에 A 데이터와 B 데이터를 저장해야 하는데, A와 B가 같은 캐시 메모리 주소에 할당되어서 발생하는 캐시 미스입니다.
-Capacity miss
캐시 메모리에 공간이 부족해서 나는 캐시 미스입니다.
위의 conflict miss는 캐시에 공간이 남아도는데도 불구하고 주소 할당 때문에 나는 미스지만, capacity miss는 주소 할당이 잘 되어있더라도 공간이 부족하면 나는 미스입니다.
캐시 공간이 작아서 벌어지는 일이므로 캐시 크기를 키우면 해결되지만, 캐시 크기를 키우면 캐시 접근속도가 느려지고 파워를 많이 먹는다는 단점이 생깁니다.
C++은 케시미스가 많이 나는 언어입니다.
따라서 캐시가 많은 CPU를 사용할 수록 유리합니다.바이트 패딩이란?
바이트 패딩(Byte Padding)이란 클래스(구조체)에 바이트를 추가해 CPU 접근에 부하를 덜어주는 기법입니다.
클래스나 구조체에 패딩 바이트를 추가하여 CPU 접근을 더 용이하게 해 주는 것을 말합니다.
자칫 공간 낭비일 수도 있는 불필요한 패딩 공간을 확보하면서 메모리의 크기를 맞추는 이유는 캐시 hit 비율을 높이고 CPU의 연산 횟수를 줄이기 위해서입니다.
예를 들어보겠습니다.
struct example {
int a; // 4byte
char b; // 1byte
char c; // 1byte
double d; // 8byte
short e; // 2byte
};
64비트 CPU는 한번에 8바이트를 읽을 수 있습니다.출처 - https://coding-factory.tistory.com/670의 미이지를 가져와서 수작업으로 변경함
64비트 CPU를 예로 들면 위와 같이 읽게 되는데 바이트 페딩을 사용하지 않으면 위처럼 double 데이터가 잘리게 됩니다.
이렇게 되면 끊어진 double 데이터를 연산할때 2번씩 처리하게 됩니다.
위의 상황을 방지하기 위해 패딩 바이트가 들어가게 됩니다.출처 - https://coding-factory.tistory.com/670의 미이지를 가져와서 수작업으로 변경함 위와 같이 패딩 바이트를 추가하여 한 번의 연산에 하나의 값이 들어가게 되고 메모리는 더 사용하나 CPU는 한 번의 동작만 하면 되기에 연산이 보다 빠르게 처리가 됩니다.
struct example {
double d; // 8byte
int a; // 4byte
short e; // 2byte
char b; // 1byte
char c; // 1byte
};
어떠한 상황에서든 메모리는 효율적으로 사용하는 것이 좋습니다.
개발자라면 패딩 바이트는 최소한으로 생성되도록 유도하는 것이 필요합니다.
char형은 1byte이기에 어디든지 붙을 수 있어 상관이 없지만 double형과 같은 큰 byte를 소모하는 자료형이라면 될 수 있으면 가장 위에 선언해주어 불필요한 메모리 낭비를 줄이는 것이 좋습니다.출처 - https://coding-factory.tistory.com/670의 미이지를 가져와서 수작업으로 변경함 ETC
bool타입은 실질적으로 1bit의 데이터만 저장 가능합니다.
그러나 메모리주소가 1byte 단위로 구성되어있기 때문에 1byte를 차지하게 됩니다.참고문헌 (출처)
https://ko.wikipedia.org/wiki/%EC%BA%90%EC%8B%9C
https://namu.wiki/w/%EC%BA%90%EC%8B%9C%20%EB%A9%94%EB%AA%A8%EB%A6%AC
http://keepcalmswag.blogspot.com/2018/06/cache.html
https://velog.io/@ryalya/iOS-CS-Study-Cache-Memory%EB%9E%80
https://velog.io/@gyrbs22/%EC%A0%84%EC%82%B0%ED%95%99-Cache-%EB%A9%94%EB%AA%A8%EB%A6%AC
https://supercoding.tistory.com/37
https://coding-factory.tistory.com/670'과제(숙제)' 카테고리의 다른 글
2022.06.21 과제 (0) 2022.06.22 2022.06.10 숙제 (0) 2022.06.12 2022.06.08 숙제 (0) 2022.06.09 2022.06.07 숙제 (0) 2022.06.08 2022.06.02 숙제 (0) 2022.06.02 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)