메모리의 범위와 종류
1.메인(Main) 메모리
메인 메모리인 램(RAM)은 정확하게 이야기 하자면 D램(D-RAM)계열의 메모리이다.
2.레지스터(Register)
CPU내부에 내장되어 있으며 연산을 위한 저장소의 역할을 한다.
3.캐쉬(Cache)
캐쉬는 D램보다 빠른 S램(S-RAM)으로 구성하는데 램이라는 단어는 이미 메인 메모리에서 사용되므로 그냥 캐쉬라고 표현한다. 캐쉬 메모리는 CPU에 가장 근접해 있는 메모리 이다.
(CPU 내부에 있는 것이 아니라 바로 옆에 있다는 것이다.)
4.하드 디스크(Hard Disk), 외의 저장 장치들
하드 디스크는 크고 작은 파일들을 저장하기 위한 용도로 사용되지만, 프로그램 실행에 있어서도 중요한 의미를 지닌다. 또한 SD카드, CD-ROM과 같은 I/O장치들도 메모리에 해당한다.
메모리 계층 구조
프로그램이 실행되는 동안 메모리의 역할은 데이터의 입력 및 출력이다.
메모리 사이의 가장 큰 차이점은 CPU로 부터의 거리이다.
레지스터는 CPU내부에 존재하는 메모리이다. CPU외부에서 가장 가까이 있는것이 캐쉬메모리이고, 그 다음이 메인메모리 이다. 가장 멀리있는 것이 하드디스크이다.
CPU와 가까이 있을 수록 속도가 빠르고, 멀리 있을 수록 속도가 느리다.
레지스터의 경우 CPU내부에 있으므로 접근에 있어서 별다른 절차가 필요없다. 그러나 메인 메모리에 접근하기 위해서는 몇몇 복잡한 과정을 거쳐야한다. 대표적인 것이 버스(BUS)인터페이스 컨트롤 이다. 데이터 입출력을 위해 버스를 거쳐야하기 때문에 그만큼 더 느리다.
하드디스크를 CPU가까이 가져간다면 속도도 빠르고 용량도 클것이다.
그러나 CPU근처로 대용량 메모리를 가져갈수록 기술적인 문제들도 발생하고 비용도 훨씬 많이 든다.
->하드디스크 용량을 수십기가바이트 늘리는 것보다 캐쉬 메모리 1M바이트 늘리는데 드는 비용이 훨씬 크다.
1.하드디스크에 있는 내용은 프로그램의 실행을 위해서 메인 메모리로 이동한다.
2.메인 메모리에 있는 데이터 일부도 실행을 위해서 L2캐쉬로 이동한다.
3.L2캐쉬에 있는 데이터 일부는 L1캐쉬로 이동을 하고, L1캐쉬에 있는 데이터 중에서 연산에 필요한 데이터가 레지스터로 이동한다.
모든 메모리의 역할이 피라미드 구조에서 자신보다 아래에 있는 메모리를 캐쉬(자주 사용되는 메모리의 일부를 저장해서 속도를 향상시키는것)하기 위해서 존재한다.
1.연산에 필요한 데이터가 레지스터에 존재하지 않는다면 L1캐쉬를 확인한다.
2.L1캐쉬가 가지고 있지 않는다면 L2캐쉬를 확인한다.
3.L2캐쉬에도 없다면 메인메모리를 확인한다.
4.메인 메모리에도 존재하지 않는다면 결국은 하드디스크에서 읽어들이게 된다.
실제로는 메인메모리를 제외한 L1캐쉬와 L2캐쉬에, 연산에 필요한 데이터가 존재할 확률이 90%이상 된다. 캐쉬는 속도를 많이 향상시킨다.
Level1 캐쉬와 Level2 캐쉬
L1캐쉬는 CPU내부가 아니라 시스템 보드(메인 보드)에 존재하는 메모리 였지만, 성능향상을 위해 CPU내부로 들어가게 됐다. 그리고 CPU외부에 또 다른 캐쉬가 등장했는데 이것이 L2 캐쉬이다.
시스템의 성능을 좌우하는 클럭의 속도는 항상 느린쪽에 맞춰지게 되어있다.
예를들어 CPU는 상당히 고속화 되었지만, 메인메모리의 처리속도는 CPU의 속도를 따라가지 못하고있다. CPU속도가 두배 빨라져도 주변장치의 속도가 그대로 라면, 결코 기대하는 만큼의 속도 향상을 경험할 수 없다.
ALU는 연산을 위해서 레지스터에 저장된 데이터를 가지고 와야하는데, 필요한 데이터가 존재하지 않을 경우 메인메모리에서 데이터를 읽어와야만 한다. 자주 사용되는 주소 번지의 데이터는 캐쉬 메모리에 저장해 두어 메인 메모리까지 가야만 하는 빈도수를 줄여준다.
필요로 하는 데이터가 캐쉬에 존재하지 않는다면 메인 메모리에서 데이터를 가져와야한다. 느린 메인메모리가 데이터를 전송해 줄 때까지 CPU는 쉬고 있어야만 한다. 여기가 '병목 현상'이 발생하는 부분이다.
병목현상을 최소화 하기 위해서는 캐쉬 사이즈를 키우면 된다. 그러나 이는 기술적으로 힘들기 때문에 캐쉬 메모리를 하나 더 설치한다.
L2캐쉬의 개입으로 병목현상의 주체가 L1캐쉬에서 L2캐쉬로 이동하였다. L2캐쉬는 CPU 가까이 존재하므로 당연히 메인메모리보다 접근이 빠르다. CPU입장에서는 클럭속도의 차이에 의해 발생하는 병목현상의 부담을 그만큼 줄인 것이다.
병목현상의 발생위치가 L1에서 L2로 이동했을 뿐 CPU의 처리속도가 빨라졌다고 말할 수 있겠는가?
물론 빨라졌다. L2캐쉬는 L1캐쉬보다 크기가 크게 구성되기 때문에 기존의 L1캐쉬보다 필요로 하는 데이터를 훨씬 더 많이 저장할 수 있다. 그렇기 때문에 병목현상이 줄어들고 CPU의 처리속도가 향상되었다.
'Programming > Windows System Programming' 카테고리의 다른 글
가상 메모리(Virtual Memory) (0) | 2020.08.08 |
---|---|
캐쉬(cache)와 캐쉬 알고리즘 (0) | 2020.08.07 |
쓰레드 풀링(Pooling) (0) | 2020.08.05 |
타이머(Timer) 기반 동기화 (0) | 2020.08.03 |
실행순서 동기화 - 이벤트 기반 동기화 (0) | 2020.08.01 |