컴퓨터 과학(CS)

메모리 관리 페이징

마달랭 2024. 9. 12. 17:59

개요

운영체제가 물리적 메모리와 가상 메모리를 관리하는 기법 중 하나이다.

페이징을 통해 프로그램이 실제로 사용 가능한 물리적 메모리보다 더 많은 메모리를 사용하는 것처럼 동작할 수 있다.

이를 통해 메모리 사용의 효율성을 높이고, 다수의 프로그램이 동시에 실행될 수 있게 도와준다.

 

 

페이징의 개념

페이징은 가상 메모리와 물리적 메모리를 일정한 크기의 블록으로 나누는 기법이다.

 

  • 가상 메모리: 프로그램이 참조하는 메모리 공간
  • 물리적 메모리: 실제 하드웨어에 있는 메모리 (RAM)

 

가상 메모리는 페이지라는 고정 크기 블록으로 나누어지고, 물리적 메모리도 같은 크기의 프레임으로 나누어진다.

페이지와 프레임의 크기는 보통 4KB, 8KB와 같은 값으로 설정된다.

 

*고정 크기 블록

가상 메모리의 블록은 가상 메모리 공간에서 일정 크기의 연속된 데이터 덩어리를 뜻하며 곧 페이지를 의미한다.

운영체제는 프로그램이 요청하는 가상 주소 공간을 여러 개의 페이지로 나눈다.

프로그램이 실행될 때, 전체 프로그램이 한 번에 물리적 메모리에 올라가는 것이 아니라, 필요한 페이지들만 물리적 메모리로 적재된다.

 

*프레임

프레임은 물리적 메모리를 일정한 크기로 나눈 블록이다.

물리 메모리의 프레임 크기는 가상 메모리의 페이지 크기와 동일해야 한다. 

이는 가상 메모리 페이지와 물리적 메모리 프레임이 일대일로 매핑될 수 있도록 하기 위함이다.

프로그램이 가상 메모리에서 요청한 페이지는 물리적 메모리의 특정 프레임에 적재된다.

이때, 페이지가 저장되는 프레임 위치는 항상 연속적일 필요는 없으며, 운영체제가 빈 프레임을 찾아서 페이지를 할당한다.

 

 

페이징 동작 방식

운영체제는 프로그램이 사용하는 가상 메모리의 페이지들을 물리적 메모리의 프레임에 매핑하여 관리한다.

이를 위해 페이지 테이블이 사용되며, 페이지 테이블은 다음과 같은 작업을한다.

 

  • 가상 메모리의 각 페이지가 물리적 메모리의 어떤 프레임에 위치하는지 기록
  • 만약 페이지가 물리적 메모리에 없을 경우, 페이지 폴트를 발생시키고, 디스크에서 해당 페이지를 가져온다.

*페이지 폴트

페이지 폴트는 프로그램이 접근하려는 가상 주소에 해당하는 페이지가 현재 물리적 메모리에 없는 경우 발생한다.

이때 운영체제는 하드디스크의 스왑 영역에서 해당 페이지를 가져와 물리적 메모리의 빈 프레임에 로드하고, 페이지 테이블을 업데이트한다.

 

 

 

*스왑 영역

물리적 메모리(RAM)가 부족할 때, 운영체제가 일시적으로 데이터를 저장하기 위해 사용하는 하드디스크의 공간

스왑 영역은 주로 메모리의 연장선으로 사용되며, RAM을 보조하는 역할

 

시스템에서 실행 중인 프로그램들이 사용하는 메모리가 RAM 용량을 초과할 경우,  운영체제는 자주 사용되지 않는 데이터를 스왑 영역으로 옮긴다.

이를 통해 RAM의 공간을 확보하여 새롭게 필요한 데이터를 로드할 수 있게 한다.

 

 

페이지 테이블

페이지 테이블은 가상 메모리 주소와 물리적 메모리 주소 간의 매핑 정보를 저장하는 데이터 구조이다.

운영체제는 페이지 테이블을 사용하여 가상 메모리 주소를 물리적 메모리 주소로 변환한다.

 

각 프로세스는 고유한 페이지 테이블을 가지고 있다.

페이지 테이블의 항목은 페이지 번호와 프레임 번호로 이루어져 있다.

CPU가 가상 주소를 참조할 때, 페이지 테이블을 통해 해당 가상 주소의 페이지가 물리적 메모리의 어느 프레임에 저장되어 있는지 확인한다.

 

페이지 테이블의 구조:

  • 프레임 번호: 해당 페이지가 물리 메모리의 어느 프레임에 있는지 나타낸다.
  • 유효 비트(Valid Bit): 해당 페이지가 물리적 메모리에 적재되어 있는지를 나타낸다. 1이면 적재되어 있고, 0이면 물리 메모리에 없음을 뜻함
  • 페이지 보호 정보: 해당 페이지의 접근 권한(읽기, 쓰기, 실행 등)을 관리한다.

프로그램이 사용하는 가상 메모리 공간은 매우 클 수 있기 때문에, 페이지 테이블의 크기도 매우 커질 수 있다.

이를 해결하기 위해 다단계 페이지 테이블, TLB와 같은 최적화 기법이 사용된다.

 

*다단계 페이지 테이블

메모리를 절약하기 위한 기법이다.

페이지 테이블을 한 번에 모두 메모리에 로드하면 비효율적이기 때문에 이를 여러 단계로 나눠 관리한다.

상위 페이지 테이블, 하위 페이지 테이블, 오프셋이 저장된 테이블로 나누어 지며

예를 들어 32비트의 페이지 테이블이 있을때 10비트를 상위 페이지로, 10비트를 하위 페이지로, 나머지 12비트를 오프셋 주소 저장 페이지로 할당한다.

상위 테이블에서 하위 페이지 테이블을 참조하고 하위 페이지에서 오프셋을 참조하여 물리 메모리 주소를 참조한다.

 

결국 메모리를 절약하기 위해 사용하는 것 같은데 이해가 잘 가지 않는 부분이 있어 GPT에 물어본 일부 내용을 하기에 공유한다.

더보기

Q : 다단계 페이지 테이블이 잘 이해가 안가 결국 프로세스를 진행하면서 모든 페이지 테이블을 한번에 메모리에 로드하는게 비효율 적이라 일부만 올리는 것 같은데 그럼 현재 로드되지 않은 데이터 들은 하드 디스크에 존재할 것이고 그럼 필요한 메모리 값을 참조하려고 했을때 존재하지 않을 확률이 더 높은거 아니야? 그럼 결국 현재 다단계 페이지 테이블에 로드되지 않은 메모리를 참조하고자 할때 페이지 폴트가 날 것이고 결국 메모리 성능을 올리기 위해 시간 성능을 포기하는 건가?

 

A : 네, 당신이 말씀하신 대로 다단계 페이지 테이블은 메모리 사용의 효율성을 높이기 위해 설계된 것이지만, 이로 인해 페이지 폴트가 발생할 확률이 높아질 수 있습니다.

다단계 페이지 테이블은 페이지 테이블을 여러 단계로 나누어 관리합니다. 이렇게 하면 페이지 테이블 자체가 메모리에 완전히 로드되지 않고, 필요한 페이지 테이블의 일부만 메모리에 로드됩니다. 이는 메모리의 효율성을 높이고, 메모리 공간을 절약하는 데 도움이 됩니다.

하지만, 페이지 테이블의 상위 단계가 메모리에 로드되지 않았을 경우, 해당 상위 단계가 하드 디스크에 저장되어 있을 수 있습니다. 프로세스가 이 상위 페이지 테이블을 참조하려고 할 때, 해당 페이지가 메모리에 없으면 페이지 폴트가 발생하게 됩니다. 따라서, 페이지 폴트가 발생하는 빈도는 다단계 페이지 테이블의 계층 구조와 현재 메모리에 로드된 페이지의 상태에 크게 의존합니다.

결국, 다단계 페이지 테이블은 메모리 사용의 효율성을 높이는 데 중점을 두지만, 페이지 폴트가 발생할 확률이 높아질 수 있습니다. 이는 메모리 사용의 효율성과 성능 사이의 균형을 맞추는 문제로 볼 수 있습니다. 다단계 페이지 테이블 구조는 메모리 효율성을 높이면서도, 페이지 폴트로 인한 성능 저하를 최소화하기 위해 페이지 폴트 처리와 캐시 메커니즘을 최적화하는 방법들을 함께 고려해야 합니다.

 

*TLB

가상 주소를 물리 주소로 변환할 때, 페이지 테이블에서 필요한 정보를 캐시하는 역할

페이지 테이블은 가상 주소와 물리 주소 간의 매핑 정보를 저장하지만, 페이지 테이블을 직접 조회하는 것은 시간이 오래 걸릴 수 있다.

TLB는 이 매핑 정보를 메모리의 빠른 접근이 가능한 캐시 영역에 저장하여, 주소 변환 과정을 가속화한다.

 

TLB의 구조 : 

 

  • TLB 엔트리: TLB는 여러 개의 엔트리(혹은 슬롯)로 구성되어 있으며, 각 엔트리는 가상 페이지 번호와 해당 물리 페이지 번호의 매핑 정보를 포함한다.
  • 태그와 데이터: 각 TLB 엔트리는 태그(가상 페이지 번호)와 데이터(물리 페이지 번호)로 이루어져 있다. 태그는 검색 시 사용되며, 데이터는 변환된 물리 주소를 포함한다.
  • 실제로 map(key:value)와는 다르지만 유사하게 볼 수 있을 듯 하다
  • TLB의 key = 가상 페이지 번호, value = 물리 페이지 번호

 

TLB의 동작 방식 : 

  1. 로세스가 메모리 접근을 시도할 때, 가상 주소가 TLB에서 먼저 검색된다.
  2. 만약 TLB에 해당 가상 주소가 있으면(TLB 히트), 물리 주소를 빠르게 얻을 수 있다.
  3. TLB에 필요한 정보가 없으면(TLB 미스), 페이지 테이블을 조회하여 물리 주소를 찾는다.
  4. 이 과정에서 페이지 테이블이 메모리에서 검색되고, 변환된 주소는 TLB에 저장된다.

TLB 업데이트 : 

  • TLB는 페이지 테이블의 변경 사항에 따라 업데이트된다.
  • 새로운 페이지가 메모리에 로드되거나 페이지가 변경될 때, TLB 엔트리도 함께 갱신된다.

 

 

주소 변환

CPU가 명령어를 실행할 때 참조하는 주소는 가상 주소이다, 이를 물리적 주소로 변환하는 과정은 아래와 같다.

 

  • 페이지 번호: 가상 주소의 상위 비트로 페이지 테이블에서 참조할 항목 결정
  • 오프셋: 가상 주소의 하위 비트로 해당 페이지 내에서의 위치를 나타냄

 

 

  • 가상 주소의 페이지 번호를 사용해 페이지 테이블을 참조하여 물리적 메모리의 프레임 번호를 얻는다.
  • 물리적 프레임 번호에 오프셋을 더해 최종 물리적 주소를 계산한다.

예를 들어, 프로그램이 0x0012A000이라는 가상 주소를 참조한다고 가정해 보자

  1. 이 가상 주소는 페이지 번호 0x0012와 페이지 오프셋 0xA000으로 나뉜다.
  2. 페이지 테이블에서 페이지 번호 0x0012에 대응하는 프레임 번호를 찾아낸다.
  3. 이 프레임 번호가 0x15라고 한다면, 물리 주소는 프레임 번호 0x15와 오프셋 0xA000을 결합하여 계산된다.
  4. 최종 물리 주소는 0x15A000이 된다.

 

 

 

페이징의 장점

 

  • 메모리 효율성: 프로그램 전체가 물리적 메모리에 적재될 필요 없이 필요한 페이지만 적재되므로 물리적 메모리를 효율적으로 사용할 수 있다.
  • 다중 프로세스 지원: 여러 프로그램이 동시에 실행되더라도 각 프로그램은 자신의 가상 메모리 공간을 사용하므로 충돌이 없다.
  • 메모리 보호: 각 프로세스는 자신만의 페이지 테이블을 가지며, 다른 프로세스의 메모리에 접근할 수 없도록 보호됨

 

 

페이징의 단점

 

 

  • 페이지 폴트 비용: 페이지 폴트가 발생하면 디스크에서 페이지를 읽어와야 하는데, 이 과정은 매우 느리다.
  • 내부 단편화: 페이지 크기와 실제로 필요한 메모리 양이 일치하지 않을 때, 일부 메모리 공간이 낭비될 수 있다.

 

 

 

페이지 교체 알고리즘

물리적 메모리가 가득 찼을 때 새로운 페이지를 로드해야 한다면, 어떤 페이지를 제거할지 결정하는 페이지 교체 알고리즘이 필요하다.

대표적인 알고리즘은 다음과 같다.

 

  • FIFO(First In, First Out): 가장 먼저 메모리에 들어온 페이지를 교체
  • LRU(Least Recently Used): 가장 오랫동안 사용되지 않은 페이지를 교체
  • LFU(Least Frequently Used): 가장 적게 사용된 페이지를 교체

 

 

728x90

'컴퓨터 과학(CS)' 카테고리의 다른 글

네트워크 DNS  (0) 2024.10.08
네트워크 대역폭  (3) 2024.09.30
프로세스 (process)  (0) 2024.08.28
멀티 쓰레딩 (Multi-threading)  (0) 2024.08.28
메모리  (0) 2024.08.16