일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- exception
- 자바
- hibernate
- FunctionalInterfaces
- JPA
- springwebmvc
- ApplicationContext
- ORM
- 토비의스프링3.1
- AutoConfiguration
- Kotlin for Java Developers
- gradle
- Immutable
- DispatcherServlet
- 프록시
- 토비의스프링
- 클린코드
- beanfactory
- springboot
- String
- 컴퓨터시스템
- IOC
- DesignPattern
- 링커
- 링킹
- java
- Spring
- 빌드툴
- lambda
- 메이븐
- Today
- Total
엔지니어로 가는 길
메모리의 계층구조와 캐시 그리고 지역성 본문
우리는 편의상 메모리를 단순히 바이트들의 선형 배열로 여기고, CPU가 각 메모리 위치에 상수 시간 안에 접근할 수 있다고 생각한다. 하지만 실제 메모리는 조금 복잡하다.
메모리 계층구조
메모리는 다음과 같이 계층구조를 갖는다.
메모리는 왜 계층구조일까? 우리는 속도가 빠르면서 용량이 큰 메모리를 원한다. 속도와 용량은 trade-off 관계에 있다. 속도를 빠르게 하면 용량이 떨어지기 마련이고, 용량을 키우면 속도가 떨어지기 마련이다. 그러나 계층구조를 이용하면 속도도 빠르고 용량도 큰 마법같은 메모리를 사용하는 것 같은 착각을 얻을 수 있다. 이게 어떻게 가능한걸까? 먼저 캐시와 지역성을 이해해야 한다.
캐시
'캐싱한다'는 말이 있다. 이 말은 무언가를 저장한다는 말이고, 그 무언가는 당연히 앞으로 또 찾을 가능성이 높은 것을 말한다. 이런 맥락에서 캐시를 이해해볼 수 있을 것 같다. 캐시는 메모리처럼 무언가를 저장하는 공간인데, 그 무언가란 앞으로 또 찾을 가능성이 높은 것이다.
예를 들어 레지스터와 메인메모리, 로컬 디스크가 있다고 해보자. 로컬 디스크에 있는 데이터 중 앞으로 찾을 가능성이 높은 데이터를 메인 메모리에 저장하고, 메인 메모리에 있는 데이터 중 앞으로 찾을 가능성이 높은 데이터를 레지스터에 저장한다. 이때 메인 메모리는 로컬 디스크를 위해 캐시 메모리라고 볼 수 있고, 레지스터는 메인 메모리를 위한 캐시 메모리라고 볼 수 있다. 일반화하면 메모리 계층구조에서 레벨 k에 있는 보다 빠르고 더 작은 저장장치는 레벨 k+1에 있는 더 크고 더 느린 저장장치를 위한 캐시 서비스를 제공한다.
이것만으로는 어딘가 부족하다. 아무리 캐싱이 되었다고 하더라도 처음에 살펴본 그림에서 피라미드의 가장 밑 메모리에만 있는 데이터가 필요하다면? 캐싱은 아무 소용 없고 피라미드 가장 밑 메모리의 속도를 따라 결국 속도도 느리지 않을까? 모든 데이터에 접근할 확률이 동일하다면 캐싱은 쓸모 없을 것이다. 하지만 컴퓨터 프로그램은 지역성이라는 특성을 띤다.
지역성
시간적 지역성과 공간적 지역성이 있다.
좋은 시간적 지역성을 갖는다: 접근한 데이터에 조만간 접근할 확률이 크다.
좋은 공간적 지역성을 갖는다: 접근한 데이터 근처에 있는 데이터에 접근할 확률이 크다.
간단히 이야기해서 모든 데이터에 접근할 확률은 동일하지 않고, 따라서 이 특성을 잘 이용하여 캐싱한다면 피라미드의 아래쪽에 위치한 메모리에 접근하는 횟수보다 위쪽에 접근하는 횟수가 많아서 전체적으로 빠른 속도를 얻을 수 있다.
메모리는 계층구조를 이루고 있고, 계층구조의 핵심은 캐싱이며, 캐싱이 가능한 이유는 프로그램이 지역성을 띠기 때문이다. 덕분에 우리는 속도가 빠르고 용량도 큰 메모리를 쓰는 것 같은 착각을 느낄 수 있다. 속도는 피라미드 위의 메모리에 근접하고, 용량은 피라미드 아래의 메모리에 근접하다.
참고: 컴퓨터 시스템 3판
'프로그래밍 > 전공서적' 카테고리의 다른 글
(C언어)프로그램이 실행되는 과정을 살펴보자 (0) | 2020.08.23 |
---|---|
[Linking] 정적 링킹과 동적 링킹의 차이 (0) | 2020.01.05 |
[Linking] 링커 / 링킹이란 무엇인가 (0) | 2020.01.04 |