가상 메모리

1. 메모리란?

  • 메모리란, 프로그램과 프로그램 수행에 필요한 데이터 및 코드를 저장하는 장치를 의미한다.
  • 메모리는 크게 주기억장치보조기억장치로 분류된다.
    • 주기억장치(내부 메모리) : DRAM(RAM,DDR4) 등의 메모리, CPU안에 있는 레지스터(Register)와 캐시(Cache) 등
    • 보조기억장치(외부 메모리) : SSD, HDD 등

2. 가상 메모리란?

  • 가상 메모리는 메모리가 실제 메모리보다 많이 보이게 하는 기술로, 어떤 프로세스가 실행될 때 메모리에 해당 프로세스 전체가 올라가지 않더라도 실행이 가능하다는 장점이 있다.

예로 애플리케이션이 실행될 때, 실행에 필요한 일부분문 메모리에 올려져 실행되며, 나머지 부분은 디스크에 저장되는데, 바로 여기서 디스크가 가상 메모리이다. 즉, RAM의 보조기억장치처럼 작동하는 것이다.

결국 빠르고 작은 기억장치(RAM)을 느리고 큰 기억장치(디스크)와 병합하여, 하나의 빠르고 큰 기억장치(즉, 가상메모리)처럼 동작하게 하는 것이다.

  • 가상 메모리를 구현하기 위해서는 컴퓨터가 특수한 메모리 관리 하드웨어를 갖추고 있어야 하는데 이것이 바로 MMU(Memory Management Unit)이다.

2_1. MMU

  • MMU는 가상 주소를 물리 주소로 변환한다.
  • MMU는 메로리를 보호하는 기능을 한다.
  • MMU를 사용한다면, CPU가 각 메모리에 접근하기 이전에 메모리 주소를 변역한다.

메모리를 일일이 가상 주소에서 물리 주소로 변환한다고 상상해보자. 그렇게 되면 작업량이 어마어마하게 많아지게 된다. 그러므로 MMU는 RAM을 여러 부분으로 나누어 각 페이지를 하나의 독립된 항목으로 처리하게 된다.

페이지 및 주소 변역 정보를 기억하는 작업이 가상 메모리를 구현하는 데 있어서 결정적인 절차라고 말할 수 있다.


페이징 기법

1. 페이징(Paging)

페이징은 프로세스가 사용하는 메모리 공간을 잘게 나누어서 비연속적으로 실제 메모리에 할당하는 메모리 관리 기법이다. 그리고 이 잘게 나눈 것의 단위가 페이지라는 것이다.

페이징 방식으로 메모리를 할당하게 된다면, 실제 프로세스가 실행될 때는 각각의 페이지들이 실제 메모리의 어디에 위치하는지 빠르게 알아야한다. 또한, 프로세스의 입장으로 보면 자신이 사용하고 있는 메모리 공간이 흩어져 있는 페이지들로 구성되는 것이 아니라 하나의 연속된 메모리공간으로 이해할 수 있어야지 프로그램이 효율적으로 실행할 수 있게 된다.

즉, 프로세스가 바라보는 메모리 주소 공간과 실제 메모리의 주소 공간을 논리 주소와 물리 주소라는 것으로 구분하고, 그들 사이의 변환을 통해서 메모리 참조를 효율적으로 하고자 하는 기법이다.

이처럼 페이징은 효율적인 메모리 할당과 프로세스의 효율적인 메모리 참조라는 두 가지의 메모리 관리를 모두 성공시킬 수 있기 때문에 실제 대부분의 운영체제에서 관리하는 기본적인 메모리 관리 기법이다.

2. 페이징의 필요 조건

  1. 논리 주소 공간과 물리 주소 공간의 분리 => 주소의 동적 재배치 허용
  2. 전용 하드웨어(MMU) => 논리 주소와 물리 주소의 변환

컴퓨터 시스템에 메모리 주소라는 개념을 프로세스의 논리 주소를 한 것과 실제 메모리의 물리 주소로 분리하여 동적으로 논리주소가 물리주소에 재배치되면서 할당되는 것을 허용해야 하며 모든 메모리 참조에서 주소변환이 필요하기 때문에 이것을 소프트웨어가 아닌 변환을 전용으로 해주는 MMU가 필요하게 된다.

3. 프레임과 페이지

프로세스가 바라보고 있는 메모리 공간 즉 논리 주소 공간이라는 것은, 일정한 크기의 페이지들로 나누어지게 되고 각각의 페이지들은 실제 메모리의 연속된 위치가 아닌 각각의 페이지 별로 임의의 위치에 저장하고 할당 될 수 있다. 그리고 페이지가 저장된 메모리의 위치 영역을 프레임이라고 한다.

그래서 실제 프레임의 크기와 페이지의 크기는 일치한다.

4. 페이징의 주소 표현

페이징 기법에 따라 메모리를 운용하면서 우리가 알고 있는 주소를 조금 다른 관점으로 바라보게 된다. 이전의 주소값이라는 것은 한 바이트의 위치를 나타내는 주소값이다.
하지만 페이징 기법에서는 실제 어느 논리 주소가 저장되어 있는 어떤 물리 주소를 알아야 한다.
즉, 이것들이 페이지 단위의 묶음으로 배치가 되기 때문에 먼저 페이지가 어디에 있는지를 알아야 한다.
그 다음, 그 안에서의 논리 주소의 실제 물리 주소 위치는 페이지 안에서의 위치와 이 프레임 안에서의 위치가 일치하게 된다.

그러므로 페이지가 어디에 있는가를 알아내는 것이 중요하다.

위의 그림은 논리주소의 구조이다.

예를 들어 페이지 크기가 4KB이고 메모리 크기가 256KB인 메모리 페이징 시스템이 있다고 가정해보자

페이지 크기가 4KB이므로 메모리 관련 개념에서 사용되는 단위인 바이트로 우선 변환해보자.
그럼 페이지는 2^12바이트임을 알 수 있다. 마찬가지로 메모리를 보면 메모리는 2^18바이트가 됨을 알 수 있다.

여기서 페이지 프레임 수는 메모리 전체 크기에 페이지가 최대 몇개 들어갈 수 있는지 알아내는 것이다. 즉, 2^18 / 2^12 = 2^6(64)개 이다.

메모리 주소를 모두 표한하기 위해서는 메모리가 2^18임을 알고 있고, 결국 비트가 18개 있어야 2^18을 만족할 수 있게 된다. 따라서 이 메모리 주소를 해결하는 데 필요한 비트 수는 18비트이다.

5. 페이징의 특징

  1. 사용자/ 프로세스의 편의성 제공 : 연속된 논리 주소 공간을 독립적으로 사용한다.
  1. 프레임 단위의 비연속적 메모리 할당 : 동적 메모리 할당에 따른 문제가 없다 => 외부 단편화가 없다.
  1. 내부 단편화 : 페이지 크기보다 작은 메모리를 요청하는 경우 발생한다. 즉, 페이지 크기가 작으면 내부 단편화가 감소하지만 그만큼 페이지 테이블의 크기가 증가하게 된다.
  1. 프레임 테이블(Frame Table) : 프로세스 마다 각각 다른 페이지 테이블을 갖고 있다. 그래서 운영체제는 실제로 어떤 프레임이 어떤 프로세스의 어떤 메모리에 할당되어있는지 정보를 쉽게 찾아내기 위해 프레임 테이블을 관리한다. 즉, 어떤 프로세스의 어떤 프레임이 사용되고 사용되지 않느냐를 빠르게 확인 가능하다
  1. 페이징과 컨텍스트 스위칭 : 페이지 테이블을 재설정 하기 위해 문맥 교환 시간이 증가한다. 각 프로세스마다 페이지 테이블이 있고 이 페이지 테이블은 메모리에 저장이 되어 있지만 어떤 프로세스를 실행할 때 이 페이지 테이블을 사용하고, 다른 프로세스일 땐 다른 페이지 테이블을 사용하면서 메모리에서 다른 페이지 테이블 이미지를 가져와 재설정하게 되어 문맥 교환 시간이 발생한다.
  1. 공유 페이지(Shared Page) : 각 프로세스마다 다른 논리 공간을 갖고 있지만 그 다른 프로세스들의 특정 페이지가 실제 물리 메모리에는 같은 프레임으로 연결되도록 페이이지 테이블 정보를 갖고 있게 된다면, 서로 다른 프로세스이지만 동일한 메모리를 사용할 수 있다. 만약 메모리 침범 제약만 관리하게 된다면 프로세스 내에 메모리 공유가 좀 더 간단하게 이루어질 수 있다는 장점이 생긴다.

세그멘테이션 기법

가상 메모리 관리 기법 중 하나로 가상 메모리를 같은 크기의 블록으로 분할하는 페이징 기법과 달리 세그멘테이션 기법은 가상 메모리를 서로 크기가 다른 논리적 단위인 세그먼트(Segment)로 분할하고 메모리를 할당하는 기법이다.

1. 특징

  • 세그먼트들의 크기가 서로 다르기 때문에 메모리를 페이징 기법에서 처럼 미리 분할해 둘 수 없고, 메모리에 적재될 때 빈 공간을 찾아 할당하는 사용자 관점의 가상 메모리 관리 기법이다.
  • 마이크로프로세서는 세그먼트 테이블을 참조하여 해당 세그먼트의 시작주소와 더해져서 실제적인 물리적 위치로 변환해준다

2. 세그먼트

  • 세그먼트는 논리적 의미에 부합하도록 서로 크기가 다르며 각각의 세그먼트들은 연속적인 공간에 저장되어있다.
  • 세그먼트 가상 주소는 v = (s,d) 로 표현되며, s는 세그먼트 번호를 d는 블록 내 세그먼트의 변위를 나타낸다.
  • 전체 세그먼트가 하나의 단위로 보조기억장치에서 메모리로의 연속적인 가용 공간에 적재되며 최초 적합 등의 방법으로 주기억장치를 할당한다.

3. 세그먼트 테이블

  • 페이징 기법에 페이지 테이블이 있는 것처럼, 세그멘테이션 기법에는 세그먼트 테이블이 사용된다. 세그먼트 테이블은 사용자가 정의한 주소를 실제 주소로 맵핑하는 정보를 저장하고 있으며, 각 세그먼트 항목별 Base(세그먼트 시작 주소)/Limit(세그먼트 길이)의 정보를 갖고 있다.

4. 세그멘테이션 기법의 장/단점

장점

하나의 세그먼트 단위로 통제가 가능하다

단점

외부 단편화가 생길 수 있다 => 서로 다른 크기의 세그먼트들에 대해 필요 시에 메모리에 올리고, 필요하지 않을 경우 내리 작업을 반복할 수 있다.


캐시 메모리 매핑 기법

1. 직접매핑(Direct Mapping)

  • 메모리 주소와 캐시의 순서를 일치시킨다. 메모리가 1~100까지 있고 캐시가 1~10까지 있다면 1~10까지의 메모리는 캐시의 1에 위치하고 11~20까지의 메모리는 캐시의 2에 위치시키는 것이다. 구현이 정말 간단하지만 저 규칙을 만족시켜서 캐시를 넣다 보면 캐시가 효율적이지 않게 자꾸 교체되어야 하는 일이 생긴다. 그래서 LRU 기법을 쓴다.

예를 들면 30~40에 해당하는 값을 자꾸 불러다 사용해야 하는데 이를 저장할 캐시 공간은 3 하나 뿐이므로 매번 캐시 교체가 일어나게 된다. 즉 적중률이 낮고 성능이 낮은 단순한 방식이다.

2. 연관매핑(Associative Mapping)

  • 순서를 일치시키지 않는다. 필요한 메모리값을 캐시의 어디든 편하게 저장 될 수 있다. 당연히 찾는 과정은 태그마다 비교해야 하기 때문에 복잡하고 느릴 수 있지만 정말 필요한 캐시들 위주로 저장할 수 있기 때문에 적중률은 높다. 캐시가 일반 메모리보다 속도가 훨씬 빠르므로 캐시의 검색량을 신경쓰는 것 보단 적중률이 높은게 성능이 더 좋다.

3. 직접연관매핑(Set Associative Mapping)

  • 연관매핑에 직접매핑을 합쳐 놓은 방식이다. 순서를 일치시키고 편하게 저장하되, 일정 그룹을 두어 그 그룹 내에서 편하게 저장시키는 것이다. 예를 들면 메모리가 1~100까지 있고 캐시가 1~10까지 있다면 캐시 1~5에는 1~50의 데이터를 무작위로 저장시키는 것이다. 블록화가 되어 있기 때문에 검색은 좀 더 효율적으로 되고 직접매핑처럼 저장위치에 대한 큰 제약이 있는건 아니기 때문에 적중률이 많이 떨어지지도 않는다.
profile
개발을 꿈꾸는 초짜

0개의 댓글