안녕하세요?
오늘은 프로세스 메모리 관리 기법인 페이징에 대해서 알아볼건데요.
바로 알아봅시다 ㄱㄱ싱
페이징(Paging)
페이징(Paging)은 운영체제의 가상 메모리 시스템에서 사용하는 메모리 관리 기법중 하나로, 메모리를 일정한 크기로 나눈 단위인 페이지와 프레임을 통해 하는 메모리를 관리하는 방식입니다. 페이지와 프레임은 페이지 테이블을 통해 매핑하여 사용합니다. 이로 인해 메모리 단편화 문제를 줄이고, 프로세스가 사용하는 메모리 영역을 효율적으로 관리할 수 있습니다.
이제 페이징 기법에 대해서 알아보겠습니다.
페이지(Pages)와 프레임(Frame)
페이징은 메모리를 일정한 크기로 나눈 메모리의 단위입니다.
페이지와 프레임은 다음과 같은 특징을 가지고 있습니다.
참고 사이트: 페이지 (컴퓨터 메모리) - 위키백과, 우리 모두의 백과사전
페이지
페이지(Page)는 가상 메모리를 효율적으로 관리하기 위해 일정한 크기로 나눈 메모리의 단위 입니다.
특징
가상 메모리에서 각각의 페이지는 연속된 가상 주소 공간을 가지고 있습니다.
페이지의 크기는 주로 4KB (외에 8KB, 16KB), 2MB (큰 페이지) 등으로 고정되어 있습니다.
CPU가 메모리에 접근할 때 페이지 단위로 물리 메모리와 디스크를 교체하며 사용합니다.
각 페이지는 속성을 가질 수 있습니다.
프레임
프레임(Frame)은 물리 메모리를 일정한 크기로 나눈 메모리의 단위 입니다.
특징
프레임은 실제 메모리상의 위치를 나타냅니다.
프레임은 페이지를 통해 매핑되기 때문에 페이지와 크기가 동일합니다.
페이지 테이블(Pages Table)
페이지 테이블은(Page Table)은 페이지와 프레임을 매핑하여 가상 주소를 물리 주소로 변환 하기 위해 만든 테이블(자료구조)입니다. 페이지 테이블은 페이지 테이블 엔트리라는 항목을 통해 필요한 매핑 정보를 저장하고 있습니다.
참고 사이트: 페이지 테이블 - 위키백과, 우리 모두의 백과사전
페이지 테이블 엔트리(Pages Table Entry)
페이지 테이블 엔트리는 페이지의 가상 주소와 프레임 주소간의 매핑정보를 보유하고 있습니다. 또한 플래그 비트를 통해 수정 여부, 액세스 권한 등의 속성을 부여할 수 있습니다.
페이지 테이블 엔트리는 다음과 같은 항목을 포함하고 있습니다.
페이지번호(Page Number) :
가상 주소 공간에서 페이지의 위치를 나타내는 번호 입니다. (가상 주소를 페이지 크기(예: 4KB)로 나눈 값)
가상 주소를 물리 주소로 변환할 때, 페이지 테이블에서 가상 주소와 물리 메모리 간의 매핑을 찾기 위한 키(key) 역할 을 합니다.
프레임 번호(Frame Number) :
가상 메모리의 페이지가 매핑된 물리 메모리의 프레임 번호 를 나타냅니다.
가상 주소의 페이지 번호를 물리 주소의 프레임 번호로 변환하는 데 사용됩니다.
유효 비트(Present or Valid Bit) :
현재 페이지가 물리 메모리에 적재되어 있는지 여부 를 나타냅니다.
유효 비트가 0이면 해당 페이지가 디스크(가상 메모리)로 스왑되어 있다는 의미입니다. 이 경우 페이지 폴트가 발생하여 해당 페이지를 물리 메모리로 로드하게 됩니다.
1 (유효): 해당 페이지가 현재 물리 메모리에 있음을 의미합니다.
0 (무효): 해당 페이지가 현재 물리 메모리에 존재하지 않고, 디스크의 스왑 영역에 있음을 의미합니다.
수정 비트(Dirty Bit) :
페이지가 마지막으로 물리 메모리에 적재된 이후 수정되었는지 를 나타냅니다.
수정 비트가 1로 설정된 경우, 페이지가 스왑 아웃될 때 디스크에 변경된 내용을 다시 저장해야 합니다.
접근 비트(Accessed Bit) :
페이지가 최근에 접근되었는지 를 나타냅니다.
운영체제가 페이지 교체 알고리즘을 사용할 때 **LRU(Least Recently Used)**와 같은 방식으로 자주 사용되지 않는 페이지를 선택하는 데 유용합니다.
읽기/쓰기/실행 권한(Read/Write/Execute Permissions) :
페이지의 접근 권한을 정의합니다.
특정 페이지에 대해 읽기, 쓰기, 실행 권한을 각각 설정하여 메모리 보호를 구현할 수 있습니다. 예를 들어, 코드 페이지는 읽기와 실행 권한만 허용하고 쓰기는 금지할 수 있습니다.
페이지 폴트(Pages Fault)
페이지 폴트는 데이터의 가상주소를 통한 물리 메모리에 접근하려 했으나, 물리 메모리가 존재하지 않는 경우 를 말합니다. "이러면 에러가 나야하는거 아니냐?" 하실 수도 있습니다. 하지만 이건 당연히 일어나야 현상입니다.
대체 어떻게 에러가 아닌 걸까요. 한번 알아봅시다.
페이지 폴트가 생기는 이유
페이지 폴트가 생기는 이유는 앞서 설명한 물리 메모리와 가상 메모리의 특성 때문입니다.
OS는 물리 메모리의 부족한 용량을 보완하기 위해 가상 메모리라는 시스템을 통해 메모리를 관리합니다.
물리 메모리는 사용자가 필요로 하는 메모리를 실질적으로 사용하는 공간입니다.
가상 메모리는 사용자가 당장 필요하지 않은 메모리를 외장 디스크(HDD, SSD)에 메모리 정보를 저장해놓습니다.
예시를 한번 들어보겠습니다.
페이지 A, B, C 3개가 있습니다. 근데 RAM의 용량이 부족해 2개의 페이지까지만 RAM에 할당할 수 있습니다.
때문에 RAM에 A, B의 메모리가 올라와있고, 가상 메모리에 C를 저장하고 있다고 가정해보겠습니다.
프로세스가 페이지C에 있는 데이터를 필요로 하고, 페이지A가 필요가 없어졌습니다.
하지만 페이지C는 RAM에 올라와있지 않기 때문에 페이지 폴트 가 발생합니다.
이 때, OS는 스와핑(Swaping)을 통해 페이지 A를 디스크로 내보내고, 페이지C를 디스크에서 메모리로 불러옵니다.
페이지 폴트는 이 과정을 통해 처리됩니다.
스와핑(Swapping)
스와핑은 사용하지 않는 페이지를 물리 메모리(RAM)에서 가상 메모리 공간(디스크)으로 내보내고, 필요한 페이지를 물리 메모리로 불러오는 과정 을 말합니다.
물리 메모리로 로드하는 경우를 스왑 인(Swap In) 이라고 하고,
스왑 영역으로 내보내는 경우를 스왑 아웃(Swap Out) 이라고 합니다.
스와핑이 발생하는 경우
스와핑이 발생하는 경우는 일반적으로 다음과 같습니다.
컴퓨터의 물리 메모리가 부족 하면, 사용되지 않는 페이지를 디스크의 스왑 영역(swap space)으로 옮겨 물리 메모리의 공간을 확보합니다.
사용자가 특정 데이터를 요청 할 때, 해당 페이지가 물리 메모리에 없는 경우 이를 디스크에서 다시 불러와 메모리에 적재합니다.
스와핑의 과정
스와핑이 일어나는 과정은 일반적으로 다음과 같습니다.
제거할 페이지 선택 :
운영체제는 메모리에서 제거할 페이지를 선택합니다. 보통 최근에 사용되지 않은 페이지 가 선택되며, 이를 위해 LRU(Least Recently Used) 등의 페이지 교체 알고리즘을 사용합니다.
해당 페이지를 스왑 영역으로 이동 :
선택된 페이지를 스왑 영역으로 이동 시키며, 해당 페이지가 저장된 디스크 위치를 기록합니다.
동시에 페이지 테이블의 해당 페이지 항목(유효 비트)을 수정하 여 이 페이지가 스왑 영역에 있음을 표시합니다.
필요한 페이지를 로드
필요한 페이지를 물리 메모리로 로드 합니다.
이 때도 페이지 테이블의 해당 페이지 항목(유효 비트)을 수정하여 이 페이지가 물리 메모리 영역에 있음을 표시합니다.
이 과정에서 물리 메모리와 디스크 간의 데이터 이동이 발생하는데, 이에 대한 단점도 있습니다.
스와핑의 장단점
스와핑을 통해 얻을 수 있는 장단점은 다음과 같습니다.
●장점
메모리를 효율적으로 사용할 수 있습니다.
물리 메모리의 제약 없이 여러 프로세스를 동시에 실행할 수 있게 합니다.
용량이 큰 프로그램의 메모리 요구량을 수용할 수 있게 해줍니다.
●단점
가상 메모리의 스왑 영역은 보조 기억 장치에 존재하기 때문에 접근 속도가 매우 느립니다. 때문에 스와핑이 자주 발생하면 성능 저하가 발생할 수 있습니다.
때문에 빈번한 스와핑은 디스크 입출력 비용을 증가 시키며, 심한 경우 스래싱(thrashing)이라는 현상이 발생할 수 있습니다. (RAM의 용량이 요구량보다 적을 경우 발생합니다,)
스래싱(Thrashing)
스래싱은 페이지 교체가 너무 빈번해지면서 CPU가 실제 연산보다는 페이지 교체 작업에 대부분의 시간을 소비할 때 발생 합니다.
페이지 폴트가 자주 발생할 경우 스와핑이 자주 발생하게 되는데, 이 때 프로세스의 작업 시간을 대부분 스왑 작업에 사용하여 실질적인 프로세스의 연산에 필요한 자원이 거의 할당되지 않습니다. 결국 연산이 거의 이루어지지 않기 때문에 시스템 전체 성능이 크게 저하됩니다.
때문에 스래싱이 발생하면 CPU 사용률이 떨어지고, 전체 시스템의 처리 성능이 낮아집니다.
페이의 내부 단편화에 대해
운영체제는 외부 단편화 현상을 막기 위해 페이징 기법을 사용해서 효율적으로 메모리를 사용하도록 설계되어 있는걸 알았습니다. 하지만 페이지도 결국 메모리를 고정된 크기로 나눈 단위이기 때문에, 페이지 내에서의 내부 단편화가 생길 수 있습니다.
예를 들어, 페이지 크기가 4KB인 시스템에서 어떤 데이터가 6KB의 메모리를 필요로 한다면, 두 개의 페이지(총 8KB)가 할당됩니다. 이 경우 마지막 페이지의 남는 2KB는 사용되지 않는 메모리 공간이 되어 내부 단편화가 발생합니다.
아래 사진은 내부 단편화에 대해 간단하게 보여줍니다.
사진처럼 페이지중 일부 공간은 사용하지 않을 수 있다.
내부 단편화의 특징
내부 단편화의 특징은 다음과 같습니다.
크기가 클수록 내부 단편화 증가 : 페이지 크기가 클수록 남는 공간이 더 많아질 수 있습니다. 따라서 4KB 페이지보다는 8KB 페이지 크기를 사용할 때 더 큰 내부 단편화가 발생할 가능성이 있습니다.
프로세스와 페이지 크기 불일치 : 각 프로세스의 메모리 요구량이 페이지 크기와 맞지 않을 때, 할당된 마지막 페이지의 남은 부분이 내부 단편화를 일으킵니다.
내부 단편화 해결 방법
내부 단편화를 해결할 수 있는 방법이 있습니다. 바로 페이지 크기를 작게 설정하는 것인데요. 페이지의 크기를 줄이면 얻을 수 있는 장단점이 있습니다.
장점 : 페이지 크기를 줄임으로써 미사용 공간의 낭비가 적어져 내부 단편화가 줄어듭니다.
단점 : 페이지가 많아지면 페이지 테이블의 크기도 함께 증가하므로 성능상 오버헤드가 커질 수 있습니다.