Paging
페이징이란 프로세스가 할당받은 메모리 공간을 동일한 페이지 단위로 나누어 연속되지 않는 서로 다른 위치에 저장하는 물리적 메모리 관리 기법을 의미한다.
페이징 기법에서는 주소 바인딩을 위해 모든 프로세스가 각각의 주소 변환을 위한 페이지 테이블을 갖는다.
내부 단편화 문제가 발생할 가능성이 있으며, 외부 단편화 문제는 발생하지 않는다.
페이징 메모리 단편화 문제 (Memory Fragmentation)
메모리 단편화 문제란 물리적 메모리 공간이 나눠져서 메모리가 충분히 존재함에도 할당이 불가능한 상태를 말한다.
페이징 기법은 논리적 주소와 물리적 주소가 같은 크기의 페이지로 나누기 때문에 외부 단편화의 문제는 없지만, 빈 공간이 남을 수 있어서 내부 단편화의 문제 가능성이 있다.
Segmentation
세그멘테이션 기법은 프로세스가 할당받은 메모리 공간을 논리적 세그먼트 단위로 나누어, 연속되지 않는 물리 메모리 공간에 할당될 수 있도록하는 메모리 관리 기법을 말한다.
일반적으로 프로세스의 영역인 Code, Data, Heap, Stack 등의 기능 단위로 세그먼트를 정의하는 경우가 많으며, 세그먼트 테이블을 통해 주소 바인딩 기법을 사용한다.
페이징 기법과는 다르게 각 세그먼트의 크기가 다르기 때문에 세그먼트 테이블 안에 시작 주소와 끝 주소가 포함되어 있다.
세그멘테이션 메모리 단편화
세그먼트 크기만큼 메모리에 할당하므로 내부 단편화의 문제가 발생하지 않지만, 외부 단편화 문제가 발생할 가능성이 있다.
이를 해결하기 위해서 paged segmentation 기법을 사용한다. 이 기법은 Segment의 크기로 나눈 후, 각 세그먼트를 Page의 배수가 되도록 만든다.
가상 메모리
가상 메모리(Virtual Memory)란 프로세스 전체가 메모리에 올라오지 않더라도, 실행이 가능하게 만드는 기법이다. 이 기법을 사용하면 사용자 프로그램이 물리적 메모리보다 커져도 실행이 가능하다는 장점이 있다. 가상 메모리는 가상 주소와 실제 주소가 매핑되어 있고, 프로세스의 주소 정보가 들어 있는 페이지 테이블로 관리되며 속도 향상을 위해 TLB를 사용한다.
실제 사용하고 있는 운영체제에서는 가상메모리 기법을 사용한다. 운영체제는 프로그램의 논리적 주소 영역에서 필요한 부분만 물리적 메모리에 적재하고, 직접적으로 필요하지 않은 메모리 공간은 디스크 (Swap 영역)에 저장하게 된다.
Demand Paging
요구 페이징(Demand Paging)은 당장 사용될 주소 공간을 Page 단위로 메모리에 적재하는 방법을 의미한다. 여기서 중요한 점은 당장 실행할 페이지이며, 이 부분만 메모리에 적재하기 때문에 메모리 사용량이 감소하고, 입출력 오버헤드를 감소시킬 수 있다. 요구 페이징 기법에는 유효/무효 비트를 두어 페이지가 메모리에 존재하는지 여부를 표시한다.
Page Fault
CPU가 무효 비트로 표시된 페이지에 엑세스하는 상황을 Page Fault라고 한다. CPU가 무효 Page에 접근하면 MMU가 page fault trap을 발생시켜 처리한다.
스레싱은 메모리의 페이지 폴트율이 높은 것을 의미하며, 이는 컴퓨터의 심각한 성능 저하를 초래한다.
Page fault trap 방식
- CPU가 페이지 N을 참조
- Page table에서 페이지 N이 무효 상태임을 확인
- MMU에서 Page fault trap 발생
- 디스크에서 페이지 N을 빈 프레임에 적재하고 page table을 업데이트 (무효 -> 유효)
Page 교체 알고리즘
Page fault가 발생하면, 요청된 page를 디스크에서 메모리로 가져온다. 이 때, 물리적 메모리에 공간이 부족하다면 메모리에 있는 page를 디스크로 옮겨서 공간을 확보해야 한다. 이것을 페이지 교체라고 하고, 교체를 하는 알고리즘들이 여럿 존재한다.
FIFO 알고리즘 : 메모리에 올라온지 가장 오래된 page를 교체
최적 페이지 교체 알고리즘 : 가장 오랫동안 사용되지 않을 page를 찾아 교체 (실제 사용 X)
LRU(Least Recently Used) : 가장 오랫동안 사용되지 않은 page 교체 - 페이지별 스택과 계수기를 두어 판별
NUR(Not Used Recently) : LRU에서 발전한 알고리즘으로 시계모양으로 페이지를 두어 0과 1 비트로 만든다. 1은 최근에 참조한 페이지고, 0은 참조하지 않은 페이지로 두어 시계 방향으로 돌면서 0을 찾은 순간 교체하고 1로 바꾸는 알고리즘
LFU(Least Frequently Used) : 참조 횟수가 가장 적은 page 교체
용어 정리
- 물리적 주소 (Physical Address) : 프로세스가 실제로 적재되는 메모리 위치
- 논리적 주소 (Logical Address) : 프로세스가 메모리에 적재될 위치를 지정하기 위한 주소 (각 프로세스마다 0번지부터 시작)
- 주소 바인딩 (Address Binding) : CPU가 기계 명령을 수행하기 위해 프로세스의 논리적 주소가 실제 물리적 주소의 매핑 위치를 찾아오는 과정
- 내부 단편화 : 프로세스가 필요한 양보다 더 큰 메모리가 할당되어 메모리 공간이 낭비되는 문제
- 외부 단편화 : 메모리상의 비어있는 공간의 크기가 작아서 빈 공간임에도 사용되지 못하는 문제
- MMU (Memory Managenete Unit) : 가상 주소를 물리 메모리 주소로 변환해주는 하드웨어 장치
- TLB : 메모리와 CPU 사이에 주소 변환을 위한 캐시로, 페이지 테이블에 있는 리스트를 보관하여 CPU가 페이지 테이블 까지 가지 않도록 중간에서 처리해주는 캐시 계층
- 스와핑 : 페이지 폴트가 발생하는 것을 방지하기 위해 안쓰는 영역을 디스크로 옮기고, 사용할 때 램으로 가져와서 램을 효율적으로 관리하는 방식