1. 메모리 계층(Memory Hierarchy)

: 컴퓨터를 구입할 때 CPU가 가장 중요시 되고 성능의 기준처럼 느껴지곤한다.

: 하지만, 개발자의 관점에서는 메모리가 가장 중요한 요소이다.

: 제한된 환경에서(CPU속도는 이미 결정되었다고 가정한다) 가장 높은 성능을 낼 수 있도록 하기 위해서는 메모리의 특성을 잘 파악하고 있어야 하기 때문이다.

* 메모리의 범위와 종류

: 컴퓨터를 구성하는 요소 중 임시적이든, 영구적이든 조금이라도 저장기능을 가지고 있으면 메모리 범위에 포함된다.

- 메인 메모리

: RAM 이다. 정확히는 D-RAM 계열의 메모리이다. 메인메모리가 반드시 램이어야할 이유는 없다. 보통 RAM을 사용하기 때문에 일반적인 의미에서 메인메모리가 RAM을 뜻한다

- 레지스터(Register)

: CPU안에 내장되어 연산을 위한 저장소를 제공한다.

- 캐쉬(Cache)

: 캐쉬는 D-RAM 보다 빠른 S-RAM으로 구성하는데, RAM과 구별하기 위해 보통 Cashe라고 표현한다. 

: CPU와 RAM사이에서 중간 저장소 역할을 하는 메모리이다.

: 요즘 캐쉬가 CPU에 내장되어있다고 표현하기도 하는데, 캐쉬 메모리는 원래 CPU의 일부로 존재하는 메모리 개념이 아니다. CPU에 근접해 있는 메모리 개념이다.

: CPU와 같이 올려져 디자인되는 것 뿐이다.

- 하드디스크(Hard Disk)와 이외의 저장 장치들

: 하드 디스크와 SD카드, CD-ROM과 같은 I/O 장치들도 메모리에 해당한다.

: 프로그래머가 개발하는 데 있어서 Register, Cashe, main memory, hard disk 뿐만아니라 I/O장치들과의 입출력 타이밍 및 대기시간 들을 가장 중요한 요소로 생각하고 항상 고민해야 한다.

* 메모리 계층 구조(Memory Hierarchy)

: 프로그램이 실행되는 동안 메모리가 하는 역할은 데이터의 입력 및 출력이다. 기본적인 역할은 모든 메모리가 동일하다.

: 가장 큰 차이점은 CPU기준으로 얼마나 떨어져 있느냐이다. 레지스터는 CPU와 가깝다 못해 안에 있는 메모리고, 그다음으로 캐쉬, 메인메모리, 하드디스크 순서가 된다.

: CPU와 가까이 있는 것이 가장 빠르고 멀리 있을 수록 속도가 느리다. Register에는 별다른 절차 없이 접근할 수 있지만, 메인 메모리에 접근하기 위해서는 복잡한 과정을 거쳐야 한다. Bus Interface Control 을 지나는 등의 과정이다.

: 메모리의 계층이 나뉘는 것은 기술과 비용때문이다. 

: 결국 모든 메모리의 역할은 자신 아래 계층에 대한 캐쉬(자주 사용되는 메모리의 일부를 저장해서 속도를 향상시키는 것)의 의미에서 존재하는 것으로 이해해야 한다.

: 이것이 비 효율적이게 보이겠지만, 실제로는 L1캐쉬와 L2 캐쉬에 연산에 필요한 데이터가 존재할 확률이 90% 이상 된다고 한다. 캐쉬가 속도를 아주 많이 향상시키는 셈이다.


Tip Level 1 캐쉬와 Level2 캐쉬

: 시스템의 성능을 좌우하는 클럭속도는 항상 느린쪽에 맞춰지게 된다. CPU가 아무리 좋아져도 Main Memory의 속도는 이를 따라가지 못하였고, CPU의 연산처리 속도가 두배 빨라졌다고 해도 주변장치의 속도가 그대로라면, 기대하는 만큼 속도 향상을 이룰 수 없다.

: CPU가 연산을 하기 위해서는 Main Memory 에서 피 연산자에 해당하는 데이터를 가져와야 하는데, 그 연산 결과를 메모리에 저장해야 다음 작업을 할 수 있다. I/O에 굉장한 시간이 소모되게 되고, 메모리가 중요하다는 이유가 여기 있다.

: 따라서 CPU가 Main Memory 의 병목현상 때문에 쉬고 있는 것을 줄이기 위해, L1 캐쉬를 두게 되었고 L1캐쉬의 용량적 한계때문에 하나 더 두어 L2 캐쉬가 있게 되었다. 


2. 캐쉬(cache)와 캐쉬 알고리즘

* 컴퓨터 프로그램의 일반적인 특성

: Temporal Locality(템퍼럴 로컬리티)란, 프로그램 실행 시 한번 접근이 이뤄진 주소의 메모리 영역은 자주 접근하게 된다는 프로그램 특성을 표현할 때 사용한다.

: Spatial Locality(스페이셜 로컬리티)란, 프로그램 실행 시 접근하는 메모리 영역은 이미 접근이 이루어진 영역이 근처일 확률이 높다는 프로그램 성격을 표현할 때 사용한다.

: 파워 개발자는 이런 식으로 캐쉬의 도움을 받을 수 있도록 프로그램을 구현하며 이를 캐쉬 프랜들리 코드(Cache Friendly Code)라고 한다.

* 캐쉬 알고리즘

: ALU 연산 과정에서 필요한 데이터가 있다면 Register로 가져와야하는데 이때 L1캐쉬에 데이터가 존재할 경우 이를 가리켜 캐쉬 힛(Cache Hit)라고 하며, 존재하지 않을 경우 캐쉬 미스(Cache Miss)라고 한다. 

: 캐쉬 미스가 발생했을 경우 L2 캐쉬 혹은 메인 메모리에서 데이터를 가져오게 되는데, 이때 해당하는 데이터 뿐만아니라, 데이터가 속해있는 하나의 블록을 모두 가져온다. 이는 블록 단위로 전송을 해서 스페이셜 로컬리티(Spatial Locality)의 특성을 성능 향상에 십분 활용하는 것이다.

: 아래 단계에 있는 메모리 일 수록, 블록 단위를 크게 잡아서 접근 횟수를 줄여 느린 속도에 대한 성능 향상을 도모한다.

: 캐쉬 미스가 발생했을 경우 데이터를 가져오게 되는데, 보통 캐쉬는 메모리를 꽉 채워 놓아 데이터 소유 확률을 높인다. 그렇기 때문에 캐쉬는 블록 교체 알고리즘에 대해 캐쉬 교체 정책(Cache's Replacement Policy)에 따르게 된다. 대학의 운영체제 수업에서 언급되는게 LRU(Least-Recently Used)알고리즘이며 가장 오래전에 참조된 블록을 밀어내는 알고리즘인데 실제로는 캐쉬 정책에 따라 조금씩 차이를 보인다.

* 캐쉬 프렌들리 코드(Cache Friendly Code) 작성 기법

: 가능한 템퍼럴 로컬리티와 스페이셜 로컬리티의 특성을 만족시키는 방향으로 가야 한다.

3. 가상 메모리 (Virtual Memory)

* 물리 주소(Physical Address)

: 실제 물리적인 메인 메모리의 주소 범위에 주소를 할당하는 것을 물리적 주소 지정(Physical Addressing)이라고 하고, 메인 메모리 크기에 따라서 지정 가능한 주소의 범위가 결정된다. 

: 주소범위에 제한이 생긴다는 것은 프로그램 개발에 있어서 엄청난 제약사항이다.

* 가상 주소 (Virtual Address) 시스템 1

: 실제 물리적인 공간은 할당할 수 있는 메모리 크기에 비해 턱없이 부족하다. 따라서 실제 존재하지 않는 가상의 주소를 지정하는 것을 가상 주소 지정(Virtual Addressing)이라 하며, 이러한 메모리 공간을 가상 메모리 공간(Virtual Address Space)라고 한다.

: 하드디스크가 메인 메모리의 역할을 못하라는 법은 없다. 더군다나 조금 느리지만, 용량이 많은 상황에서 메모리 공간을 할당해 준다고해서 문제될 것은 없다.

: 이렇게 되면 둘이상의 프로세스들에게도 4G이상의 메모리 공간 할당이 가능하다.

: 두가지 문제점만 고려하자

1. 선 할당으로 인한 부담

: 실제로 사용할지도 안할지도 모르는 프로세스에게 미리 많은 메모리를 할당한다는 것은 메모리와 시간 낭비이다.

2. 느린 속도의 개선 필요성

: 하드디스크는 너무 느리다

: 대부부분의 시스템에서 Paging(페이징) 이라는 기법을 사용한다.

: 아래 상황은 16bit 시스템에 16K 메인메모리, 프로세스별 64K메모리 할당을 가정한다.

: MMU(Memory Management Unit)은 16K밖에 존재하지 않는 메모리를 64K바이트가 존재하는 것처럼 CPU가 느끼도록 컨트롤 한다.

: 실제로 CPU와 함께 하나로 패키징 되는 장치이고 CPU는 메모리에 직접 접근하지 않고, MMU를 통해 요청한다.

: CPU가 20바이트 할당만 요청해도 MMU는 메모리 할당 단위에 따라 예를들어 4K단위로 할당하여 연산을 줄이고 속도를 빠르게 한다.

: 이러한 메모리 할당 단위, 즉 블럭을 페이지 프레임(Page Frame) 혹은 페이지(Page) 라고 하고 스페이셜 로컬리티의 특성을 위해 이용한다.

: 가상의 메모리에서 물리 메모리로 한 페이지씩 가져온다고 생각한다.

: 페이지 크기를 4K 바이트로 정하는 경우 64K 바이트 메모리 공간에서 얻는 페이지는 16개이다. 페이지 테이블을 통해 해당 페이지의 물리 주소를 찾아낼 수 있다. 예를 들어 상위 4비트는 몇번째 테이블인지, 하위 12비트는 해당 테이블의 어느 주소인지를 나타낸다.

* 가상주소(Virtual Address) 시스템 2

: 물리 메모리의 한계를 하드디스크를 통해 해결할 수 있다.

: 스왑 파일 (Swap File)이라는 개념을 도입해서 램(RAM)에 해당하는 메인 메모리를 하드디스크로까지 확장 한다.

: 가상 메모리에서 메모리의 할당과 주소 변환에 대한 내용들만 MMU가 처리한다.



뇌를 자극하는 윈도우즈 시스템 프로그래밍
국내도서
저자 : 윤성우
출판 : 한빛미디어 2007.03.30
상세보기


+ Recent posts