
레지스터와 HDD의 접근 속도는 1억배 차이다. 하지만 속도가 빠를수록 가격이 비싸므로, 빠른 저장공간의 용량은 작게 둔다.
따라서 자주 쓸 데이터만 골라서 위쪽 계층에 놔둬야 성능이 좋아진다.
그러므로 자주 쓸 데이터를 예측하는 것이 중요하다.
실제 프로그램의 메모리 접근은 예측 가능한 패턴을 보인다. 프로그램은 랜덤하게 메모리를 사용하지 않는다.
자바에서 ArrayList 순회가 LinkedList보다 훨씬 빠른 이유
배열 : 메모리에 연속으로 놓여서 (공간 지역성 ↑) 캐시 라인 하나를 끌어오면 옆 원소들이 딸려옴
연결 리스트 : 노드가 힙 여기저기 흩어져서 매 접근이 캐시 미스가 됨
알고리즘 복잡도가 같아도 실측에서 성능이 갈린다.
프로그램에서 쓰는 주소는 논리/가상 주소로, 물리 메모리의 실제 위치가 아니다.
이 둘을 잇는 작업을 주소 바인딩이라고 한다.
CPU 안의 하드웨어로, 프로그램이 만든 논리 주소를 물리 주소로 실시간 변환한다.
메모리를 연속으로 할당한다고 가정할때, 원리는 아래와 같다.
물리 주소 = 물리 시작 주소 + 논리 주소
CPU가 논리 주소 d를 냈을때
1. MMU가 한계 레지스터와 비교하여, d가 크기를 넘으면 남의 영역이니 트랩
2. 통과하면 재배치 레지스터를 더해 물리 주소를 만들어 메모리에 접근한다
페이징의 페이지 테이블은 이 원리를 페이지 단위로 구현한 것이다.