IT보안 학습

메모리 시스템 총정리

김구티2 2023. 12. 14. 21:56

1. 메모리 계층구조(Memory Hierarchy)의 개념

크기, 속도, 가격당 성능에 따라 분류된 기억장치를 계층적으로 구성함으로써 평균 기억장치 엑세스 속도는 높이고, 가격 대니 성능도 적절히 유지하기 위한 설계 아키텍처라 볼 수 있다.

 

1.1 메모리 계층구조의 필요성

메모리 계층 구조는 컴퓨터에서 사용 가능한 메모리를 최적화하는 데에 도움이 된다. 앞서 말했듯, 메모리는 여러 수준이 있으며, 크기, 비용, 속도가 다르다. 데이터 엑세스는 모든 유형의 메모리에서 결코 유사하지 않으며, 일부에선 더 빠르게 엑세스하고, 다른 쪽에선 더 느리게 엑세스하기도 한다. 그렇기에 성능을 위해 속도와 크기의 상호보완을 위해 고안된 구조라고 볼 수 있다.

 

1.2 메모리 계층구조 설계

고속의 CPU와 저속의 보조기억장치 사이에 캐시와 주기억장치를 배치하여 성능 차이를 극복하고, 빠르지만 고가인 SDRAM의 서용량을 줄여 가격 경쟁력을 확보할 수 있다. 상위 계층으로 갈수록 기억장치 용량은 감소하고, 비트당 기억장치 비용은 커지며, 기억장치 속도도 증가한다.

 

ㄱ. 레지스터

레지스터는 CPU에 위치한 작은 고속 메모리 장치이다. 가장 자주 사용되는 데이터와 지침을 저장하는 데 사용된다. 레지스터는 가장 빠른 엑세스 시간과 가장 작은 저장 용량을 갖고 있다.

 

ㄴ. 캐시 메모리

캐시 메모리는 CPU 가까이에 위치한 작고 빠른 메모리 장치다. 자주 사용되는 데이터와 최근 주 메모리에서 엑세스한 명령어를 저장한다. 캐시 메모리는 자주 사용하는 데이터에 대한 빠른 접근을 CPU에 제공함으로써 데이터 접근에 걸리는 시간을 최소화하도록 설계된 것이다.

 

ㄷ. 메인 메모리

RAM(Random Access Memory)이라고도 알려진 메인 메모리는 컴퓨터 시스템의 기본적인 메모리라 할 수 있다. 캐시 메모리에 비해 저장 용량은 크지만 속도는 느리다. 현재 CPU에서 사용 중인 데이터와 명령어를 저장하는 데 사용된다.

메인 메모리는 크게 2가지 종류로 구분할 수 있는데, 정적 RAM과 동적 RAM이 그 대상이다.

정적 RAM은 바이너리 정보를 플립플롭에 저장하며, 전원이 공급될 때까지 정보가 유효한 상태로 유지된다. 접근 시간이 더 빠르며, 캐시 메모리 구현에 사용되곤 한다. 그에 반해 동적 RAM은 2진 정보를 커패시터에 전하로 저장한다. SRAM에 비해 단위 면적 당 더 많은 메모리 셀을 포함한다.

 

ㄹ. 보조 저장소

하드 디스크 드라이브(HDD), 솔리드 스테이트 드라이브(SSD)와 같은 보조기억 장치는 메인 메모리보다 저장용량이 더 큰 비휘발성 메모리 장치다. 현재 CPU에서 사용하지 않는 데이터와 명령을 저장하는 데 사용된다. 보조 스토리지는 엑세스 시간이 가장 느리고, 일반적으로 메모리 계층구조에서 가장 저렴한 메모리 유형이라 할 수 있다.


ㅁ. 자기 디스크

자기 디스크는 금속, 플라스틱 또는 자성 재료로 제작된 단순한 원형 플레이트이다. 자기 디스크는 컴퓨터 내부에서 고속으로 작동되며 사용성이 높다.

ㅂ. 자기 테이프

자기 테이프는 단순히 플라스틱 필름으로 덮인 자기 기록 장치라 할 수 있다. 일반적으로 데이터 백업에 사용되며, 컴퓨터 엑세스 시간이 더 느리기 때문에 접근에 더욱 긴 시간이 요구된다.

 

위에 6가지에 대해 서술했으나, 시스템 메모리 표준을 고려한다면 4개만 기억해두면 된다. 레지스터 - 캐시 - 메인 메모리 - 보조 메모리 순으로 말이다. 다른 계층과 달리, 보조 메모리의 경우 실행되기 위해서는 프로그램이나 데이터가 메인 메모리에 옮겨져야 한다는 것만 기억하고 있어도 충분할 것이다.

 

2. 캐시 메모리(Cache Memory)의 개념

캐시 메모리는 CPU와 메인 메모리의 속도 차이를 극복하기 위해 CPU와 메인 메모리 사이에 존재하는 고속의 버퍼 메모리라고 할 수 있다. 이러한 고속의 메모리를 사용하여 CPU가 작업을 빠르게 처리할 수 있는 것이다.

 

2.1 캐시 메모리의 사상(Mapping) 방식

캐시 메모리의 사상 방식은 크게 직접 사상, 연관 사상, 집합 연관 사상으로 구분된다.

 

ㄱ. 직접 사상(Direct Mapping)

직접 사상은 메인 메모리를 여러 구역으로 분할하여 캐시 슬롯과 매핑하는 방식이다. 이때 메인 메모리의 각 블록을 하나의 특정 캐시에만 매핑하는 것이다. 각 구성요소에 할당되는 비트 수는 캐시, 메인 메모리 및 블록의 크기에 따라 다르다.

 

직접 사상의 장점으로는 매핑 절차가 단순하고 신속하다는 것이며, 그렇기에 전력 소비도 덜할 것이다. 에너지 효율이 좋다는 의미로 해석되니, 전력이 제한된 시스템에서는 이 방식이 유리할 수 있을 것이다. 한편, 단점으로는 높은 캐시 미스율이 발생한다는 것이다. 그렇게 같은 블록에 사상되는 데이터 캐시 적재 시에는 교체가 발생한다. 결국 최대 단점은 비효율성이라고 말할 수 있겠다. 대체 배치가 허용되지 않는 유연성의 부족이 계속 발목을 잡고 있으며, 고르지 않은 엑세스 분포의 가능성도 크기 때문이다.

 

ㄴ. 연관 사상(Associate Mapping)

 

메인 메모리의 각 블록이 캐시의 어느 슬롯이는 적재 가능한 방식이다. 직접 사상에 존재하는 단점을 일부 극복하는 데에 도움이 되기도 한다. 연관 사상에서는 비어 있는 라인과 매핑할 수 있는 메인 메모리의 메모리 블록과 같은 배치 제한이 없다.

 

지역성 높은 접근 시 캐시 적중률이 높으며, 속도도 빠르고 구현이 용이하다는 장점이 있다. 그러나 데이터와 주소를 함께 저장해야 하기 때문에 비용이 많이 들어간다는 단점이 발생한다.

 

ㄷ. 집합 연관사상(Set Associate Mapping)

 

직접 사상과 연관 사상을 절충한 것으로, 캐시와 메모리가 M대 1로 대응한다. 여기서 캐시는 여러 세트로 구성되며, 각 세트는 여러 블록으로 구성된다.

 

성능에 있어서 앞의 두 사상보다 더 나은 것을 제공한다. 그도 그럴 것이, 집합 연관사상은 사실상의 하이브리드 버전으로, 직접 사상과 연관 사상의 장점을 수용했기 때문이다. 그러나 그렇다면 반대의 급부도 커지기 마련이다. 세트 크기가 증가하면 비용도 그에 따라 증가하므로, 집합 연관사상은 구축에 있어 가장 비싼 비용이 들어간다고 볼 수 있다.

 

3. 캐시 메모리 관리 방식

CPU는 캐시 메모리에 접근하여 연산에 필요한 명령과 데이터를 읽어 들인다. 만약, CPU가 캐시 메모리에 접근할 때 원하는 데이터가 없다면, 캐시 메모리는 메인 메모리에 접근하여 데이터를 캐시 메모리에 올려야 한다. 즉, 캐시 메모리 관리라는 것은 CPU가 원하는 데이터가 캐시 메모리에 있을 수 있도록 만드는 것을 의미하는 것이다.

 

3.1 캐시 메모리 교체 알고리즘의 종류

종류 설명 특징
Random 교체될 페이지를 임의로 선정한다. 오버헤드가 적다.
FIFO(First In First Out) 캐시에서 가장 먼저 들어온, 바꿔 말하면, 가장 오래 있었던 페이지를 교체한다. 자주 사용되는 페이지가 교체될 가능성이 있다.
LFU(Least Frequently Used) 사용 횟수가 가장 적은 페이지를 교체한다. 최근 적재된 페이지가 교체될 가능성이 크다.
LRU(Least Recently Used) 가장 오랫동안 사용되지 않은 페이지를 교체한다. 타임 스탬핑에 의한 오버헤드가 존재한다.
Optimal 향후 가장 참조되지 않을 페이지를 교체한다. 현실적으로 실현 가능성이 없다.
NUR(Not Used Recently) 참조 비트와 수정 비트로 미사용 페이지를 교체한다. 최근 사용되지 않은 페이지를 교체한다.
SCR(Second Chance Replacement) 최초 참조 비트를 1로 셋팅하고, 이미 1인 경우에는 0으로 셋팅한다. 그래서 0인 경우에는 교체한다. 이름대로, 기회를 한 번 더 주는 방식이다.

 

위의 표에서 각 알고리즘의 문제를 몇 기술했는데, 페이지 교체를 하다보면 문제가 생길 수 있다. 첫째로는 Page Fault가 발생할 수 있다. 기억장치에 적재되지 않은 페이지를 사용하려 할 때 발생하는 문제이다. 그리고 Thrashing이 발생할 수 있는데, 페이지 부재가 너무 빈번하게 바생하여 CPU가 프로세스 수행보다 페이지 교체에 더 많은 시간을 소요하는 비정상적인 현상을 말한다. 배보다 배꼽이 큰 경우라 할 수 있다.

 

그렇다면 그런 문제를 어떻게 관리해야 할까? 첫째로 Load Control이 있다. 일정 시간 동안 새로운 프로세서가 생성되는 것을 지연시켜 트레싱 현상을 감소시키는 것이다. 결국 미봉책에 불과한 방식이긴 하나, 단순한 방식이 효과적으로 쓰일 때가 있는 것이라 생각한다. 둘째로는 Locality가 있다. 시간과 공간 지역성을 집중적으로 참조하는 것이다. 균일하게 참조하는 것이 아닌, 특정 영역을 집중적으로 참조한다는 것이다. 물론, 그 특정 영역이라 함은 아무렇게나 선정하는 것이 아닌, CPU가 메모리로부터 데이터를 불러옴에 있어서 가장 효과적인 영역을 말하는 것이다. 최근에 이미 사용되었던 영역 같은 곳 말이다. 세번째 방법으로 Working Set이 있는데, 일정 시간 동안 참조되는 페이지 집합(Working set)을 메인 메모리에 유지하는 것이다. 이것도 따지고 보면 Locality의 활용이라고 볼 수 있기도 하다. 마지막으로, Page Fault Frequency(PFF)가 있다. 프로세스의 Page Fault 빈도에 따라 Residence Set을 조정하는 것이다. PFF가 높으면 Residence Set의 크기를 늘리고, PFF가 낮으면 감소시키는 것이다.

 

4. 캐시 메모리 일관성(Cache Coherence)

멀티프로세서 환경에서 각 프로세서가 캐시를 보유하며 캐시에 로드된 데이터를 변경한 경우, 메인 메모리 장치의 데이터와 동일하게 유지되는 메커니즘이다.

 

그렇다면 캐시 불일치 발생 원인은 무엇일까? 우선, CPU가 캐시와 메모리에 데이터를 기록하는 방식은 Write-through와 Wirte-back의 두 종류가 있다. Write-through는 캐시와 메모리를 일괄 수정하는 방식이고, Write-back은 캐시를 먼저 수정하고, 차후에 메모리를 일괄 수정하는 방식이다. 그럼 Write-back은 캐시 불일치가 발생할 수 밖에 없다는 게 바로 이해가 갈 것이다. 수정하는 데 있어서 시간적 차이가 발생하니 말이다. 그러면 Write-through는 일괄 수정하는데 대체 왜 불일치가 발생할까? 그 이유는 캐시 = 메인 메모리가 아니기 때문이다. 캐시는 프로세서에 따라 여러 개로 나뉘는 개념이다. 프로세서 P1, P2, P3가 있다고 가정하자. 그에 따른 캐시는 전부 100의 값을 유지하고 있다. 메인 메모리도 100의 값을 가지고 있다. 그런데 P1의 X값이 110으로 바뀐다면, Write-through의 일괄 수정 원칙에 따라 메인 메모리의 값도 110으로 바뀌게 된다. 그러면 P1과 메인 메모리의 값은 110으로 일치하는데, P2, P3는 100을 유지하고 있으니 결과적으로 불일치가 발생하는 것이다.

 

5. 가상 메모리 시스템

가상 메모리라는 것은 메인 메모리의 용량이 너무 적기 때문에 보조 메모리를 마치 메인 메모리처럼 사용하여 메인 메모리의 공간을 확대하는 기억장치 관리 방법이다. 물리적 메모리의 한계를 논리적 메모리로 극복한다고 볼 수 있다. 이때 가상 메모리를 사용하기 위해 Virtual Address Space를 사용한다.

 

5.1 가상 메모리 관리 단위

구분 페이징 기법 세그먼트 기법
개념 가상 기억장치 상에서 동일한 크기의 최소 논리 분할 단위로 나눈 것이다. 사용자 주소 공간을 용도별로 논리적 단위로 나눈 것이다.
할당 고정 분할 가변 분할
적재 요구 페이지만 일부 적재한다. 프로그램 전체를 적재한다.
관점 메모리 관리 측면에서 실행한다. 파일 관리 측면에서 실행한다.
장점 요구 페이지만 적재한다.
외부 단편화를 해결한다.
교체시간을 최소로 한다.
사용자 관점에서 실행한다.
개발/프로그래밍이 용이하다.
내부 단편화를 해결한다
코드, 데이터 공유에 용이하다.
단점 *내부 단편화가 발생한다.
스레싱, 잦은 디스크 I/O를 유발한다.
*외부 단편화가 크게 발생한다.
메인 메모리가 커야 하는 조건이 있다.

* 내부 단편화: 블록의 크기가 프로세스의 크기보다 커서 메모리가 남지만, 다른 프로세스가 그것을 사용할 수 없는 상태를 말한다. 100의 크기를 갖고 있는 블록에 50인 프로세스가 할당될 경우, 50이 남게 된다. 하지만 이어서 기다리는 프로세스가 50을 초과하는 경우, 여기에는 빈 공간이 남음에도 할당이 안되는 것이다.

* 외부 단편화: 남아있는 메모리의 크기가 실행하고자 하는 프로세스보다 크지만, 연속적이지 않은 공간에 존재해서 할당할 수 없는 상태를 말한다. 예를들어, 50 사이즈의 블록이 3개가 연속으로 있다고 가정하자. 그런데 프로세스 A가 가운데 50에 적재된 것이다. 그렇다면 50, A, 50으로 남는 상황인데, 여기서 프로세스 B가 80이라고 한다면, 할당이 불가해지는 것이다. 분명 남은 블록의 크기는 총 100인데도 말이다.

5.2 가상 메모리 관리 정책

종류 설명 기법의 유형
할당 기법
(Allocation)
프로세스에게 할당되는 메모리 블록의 단위를 결정한다. 고정 할당, 가변 할당, 페이징, 세그먼트
호출 기법
(Fetch Policy)
보조 메모리에서 메인 메모리로 적재할 시점을 결정한다. *Demand Fetch, Pre Fetch
배치 기법
(Placement)
요구된 페이지를 메인 메모리의 어느 곳에 적재할 것인지를 결정한다. *First Fit, Best Fit, Worst Fit, Next Fit
교체 기법
(Replacement)
메인 메모리 공간 부족 시 교체 대상을 결정한다. Random, FIFO, LRU, LFU, NUR, SCR, Optimal

* Demand Fetch: 필요 시 캐시를 인출하는 방식 / Pre Fetch: 예상되는 블록을 미리 패치해 두는 방식

* First Fit: 최초 적합으로, 가장 최초로 탐색하는 메모리 공간에 할당한다. 그게 불가하다면 할당 가능한 공간 중 가장 최초로 탐색한 공간에 할당한다. / Best Fit: 최적 적합으로, 모든 빈 공간을 확인 후, 프로세스를 할당했을 때 가장 남는 공간이 적은 곳에 할당한다. 따라서 외부 단편화를 가장 억제하는 방식이다. / Worst Fit: 최악 적합으로, 모든 빈 공간 중에서 가장 큰 공간에 할당한다. Best Fit의 대척점에 있다고 볼 수 있다. / Next Fit: 다음 적합으로, 이는 First Fit의 수정된 버전이다. 보통 Fit을 시작하면 처음부터 탐색을 시작한다. 하지만 Next Fit은 이름에서도 알 수 있듯, 이전의 탐색에서 중단된 시점부터 탐색을 시작한다. 그래서 그 다음 시점부터 First Fit을 수행하는 것이다. Next Fit을 사용하면 항상 공간의 앞 부분에만 할당이 몰리는 것을 방지할 수 있을 것이다.

 

5.3 할당 정책(Allocation Policy)

구분 종류 설명
연속 할당 고정 분할 고정된 크기의 단위로 메모리를 할당한다.
내부 단편화가 발생한다.
가변 분할 할당 단위를 요청마다 다른 크기로 할당한다.
외부 단편화가 발생한다.
비연속 할당 Paging 가상 메모리 블록을 페이지 단위 관리, TLB와 MMU, Page table로 관리한다.
Segmentation 가변 크기인 세그먼트로 분할하여 Segment table로 관리한다.

 

6. 가상 메모리 관리 기법

ㄱ. 페이징 메모리 관리 기법

논리주소의 고정된 페이지라고 불리는 블록들로 분할 관리하는 기법이다. 각각의 페이지는 물리 메모리의 프레임과 매핑하며, 페이지를 가리키는 논리주소에서 프레임을 가리키는 물리주소로 변환한다.

 

가상 메모리는 먼저 TLB(Translation Look a side Buffer)라는 메모리에서 가상 메모리와 메인 메모리를 매핑한다. TLB는 MMU(Main Memory Unit) 하드웨어 내에 있기 때문에 빠르게 매핑이 가능하다. 하지만 TLB 내에 매핑 정보가 없으면, Page table에서 매핑을 수행하고 Real Address와 매핑해서 메인 메모리를 참조해야 한다.

 

여기서 TLB는 페이지 테이블 접근에 따른 지연 문제를 해결하기 위한 변환 버퍼이다. 가장 최근에 사용된 페이지 테이블 항목을 유지하고, 메인 메모리의 캐시 메모리와 유사하게 관리된다고 볼 수 있다. MMU는 메인 메모리와 캐시의 메모리 주소를 변환하는 역할을 수행한다. 캐시의 통제 아래에서 관리되며, 캐시에 먼저 사용된 후 메모리에 쓰여진다.

 

ㄴ. Segmentation 메모리 관리 기법

메모리는 세그먼트 세트로 나눠 관리하는 방식이다. 세그먼트는 해당 세그먼트의 시작 주소인 베이스 어드레스와 세그먼트의 크기를 지정하는 길이 값으로 구성된다. 주소 지정은 세그먼트의 베이스 어드레스를 지시하는 Segment selector와 세그먼트 내의 Offest 값을 통해 지정한다. 가상 메모리 주소는 세그먼트 번호와 Offset 값으로 구성되며, Segment table에서 베이스 세그먼트의 주소를 획득하고 Offset과 결합하여 물리 메모리 주소를 산출하는 것이다.

 

세그먼트는 가변 공간을 할당하기 때문에 계산을 통해서 주소를 매핑한다. Virtual Address는 Segment table 주소를 매핑하고 메인 메모리와 매핑한다.

 

ㄷ. Paged Segmentation 관리 기법

이름에서 알 수 있듯, 페이지와 세그먼트의 개념을 섞은 기법이다. 페이지들로 세그먼트를 구성하고, 세그먼트 표 참조 후 페이지 표를 참조한다. 논리주소는 세그먼트 번호, 페이지 번호, Offest으로 구성된다. 이 기법을 사용할 경우, 외부 단편화는 제거되지만, 내부 단편화는 여전히 발생할 가능성이 있다.

728x90