티스토리 뷰
1. 페이징 기법은 외부 단편화 문제를 해결한다.
페이징(paging) 기법은 프로세스의 논리 주소 공간은 페이지(page)라는 일관된 크기로 나누고 물리 주소 공간을 페이지와 동일한 크기인 프레임(frame)으로 나눈다. 프레임에는 페이지가 적재된다. 페이징 기법은 프로세스의 논리 주소 공간을 일관된 크기의 페이지로 나누기 때문에 메모리에 빈 공간이 발생하지 않는다. 따라서 외부 단편화가 발생하지 않는다.
가상 메모리 기법이란 프로세스의 일부만 메모리에 적재하여 실제 메모리보다 더 큰 프로세스를 실행할 수 있도록 하는 메모리 관리 기법이다. 보조기억장치의 일부를 메모리처럼 사용하거나 실행에 필요한 프로세스의 일부만 메모리에 적재하여 메모리보다 더 큰 프로세스를 실행할 수 있다.
페이징 기법에서도 스와핑이 사용될 수 있다. 프로세스 자체가 스왑 인/스왑 아웃 되는 것이 아닌 페이지 단위로 스왑 인/스왑 아웃이 발생하는 것이다. 이는 프로세스를 실행하기 위해 프로세스 자체를 메모리에 적재할 필요가 없다는 것을 의미한다. 따라서 CPU 입장에서는 논리 메모리의 크기가 실제 메모리보다 클 수 있는 것이다.
2. 페이지 테이블
페이징 기법은 외부 단편화 문제를 해결하기 위해 프로세스의 논리 주소 공간을 페이지로 나누고 물리 메모리에 프레임 단위로 적재하는 방식이었다. 페이지는 물리 메모리에 순차적으로 적재되지 않기 때문에 운영체제가 페이지를 실행하기 위해서 어떤 프레임을 실행해야 하는지 알 수 없다.
이러한 문제를 해결하기 위해 페이지와 프레임을 짝을 지어주는 페이지 테이블(page table)을 사용한다. 페이지 테이블에는 페이지 번호와 프레임 번호가 짝지어 저장되어 있다. CPU는 페이지 테이블을 참고하여 실행할 페이지가 적재된 프레임의 위치를 알 수 있다. 참고로 페이지 테이블은 프로세스마다 생성된다.
페이지 테이블에는 페이지 번호와 프레임 번호뿐만 아니라 4개의 비트 정보를 포함한다.
- 유효 비트
- CPU가 페이지에 접근할 수 있는지 여부를 나타낸다. CPU는 메모리에 적재된 페이지에는 접근할 수 있으나 보조기억장치에 적재된 페이지에는 접근할 수 없다.
- 메모리에 적재된 페이지라면 유효 비트가 1이고 보조기억장치에 적재된 페이지는 0이다.
- CPU가 보조기억장치에 적재된 페이지에 접근을 시도하면 페이지 폴트(page fault) 예외가 발생한다.
- 보호 비트
- 페이지를 보호하기 위해 사용되는 비트이다. 읽기(Read), 쓰기(Write) 그리고 실행(Execute)를 나타낸다.
- ex. 100 : 읽기만 가능, 110 : 일기 및 쓰기만 가능, 111 : 일기, 쓰기, 실행 모두 가능
- 참조 비트
- CPU가 페이지에 접근한 적이 있는지의 여부를 나타내는 비트이다.
- 페이지가 메모리에 적재된 후 CPU에 의해 접근된 적이 있다면 1이 저장되고 적재된 이후 한 번도 없다면 0이 저장된다.
- 수정 비트
- 해당 페이지에 데이터를 쓴 적이 있는지 여부를 나타내는 비트이다.
- CPU에 의해 데이터가 변경된 적이 있다면 1을 저장하고 한 번도 없다면 0을 저장한다.
2-1. 페이지 테이블은 물리 메모리에 저장된다.
프로세스마다 생성되는 페이지 테이블은 물리 메모리에 저장될 수 있다. CPU는 프로세스를 실행하기 위해 페이지 테이블을 사용하게 되는데, 이 페이지 테이블을 참조하기 위해서 페이지 테이블이 저장된 물리 메모리 위치를 알아야 한다. 페이지 테이블의 시작 주소는 CPU의 PTBR(Page Table Base Register)에 저장되어 있다. 이 레지스터를 통해 페이지 테이블의 시작 위치를 알아내어 페이지 테이블에서 필요한 정보를 얻는다.
페이지 테이블은 메모리에 “저장될 수 있다.”고 설명하였다. CPU는 프로세스를 실행하기 위해 페이지 테이블을 사용해야 하는데, 이 페이지 테이블은 물리 메모리에 저장된다. 프로세스가 많아질수록 물리 메모리에 저장되는 페이지 테이블이 많아지기 때문에 메모리 용량을 많이 차지하게 되고, 프로세스를 실행할 때마다 물리 메모리에 접근해야 하는 비효율적인 상황이 발생한다. 운영체제가 두 문제를 어떻게 해결했는지 2-2에서 알아본다.
2-2. 페이지 테이블의 문제점 해결하기
프로세스가 실행되기 위해 물리 메모리에 두 번 접근해야 한다.
- 페이지 테이블이 저장된 물리 메모리의 주소를 알아야 한다.
- 페이지 테이블로부터 페이지가 적재된 프레임 위치를 알아내어 물리 메모리에 적재된 프레임에 접근한다.
1번 과정이 없었다면 프레임에 바로 접근할 수 있다. 운영체제는 TLB(Translation Look-Aside Buffer)라는 페이지 테이블의 캐시 메모리를 사용한다. TLB는 페이지 테이블의 캐시 메모리이므로 자주 접근되는 페이지가 저장된다.
CPU는 먼저 TLB에 접근하여 실행할 프로세스의 페이지가 있는지 확인한다. 이때, 페이지가 존재하는 것을 TLB히트라고 한다. TLB 히트가 발생하면 페이지 테이블을 추가로 조회할 필요 없이 TLB에 저장된 정보를 기반으로 프레임에 접근한다. 따라서 물리 메모리를 한 번만 접근하여 프로세스를 실행할 수 있다. 반면에 TLB에 페이지가 존재하지 않는 것을 TLB 미스라고 한다. TLB 미스가 발생하면 페이지가 적재된 프레임의 위치를 알아야하므로 물리 메모리에 저장된 페이지 테이블에 추가로 접근한다. 이 경우에는 프로세스를 실행하기 위해 두 번의 물리 메모리 접근이 필요하다.
프로세스의 크기가 커질수록 페이지 테이블의 크기도 함께 증가한다. 페이지 테이블의 모든 정보를 물리 메모리에 적재하는 것은 메모리 낭비로 이어질 수 있다. 이러한 문제를 해결하기 위해 계층적 페이징을 사용한다. 계층적 페이징은 페이지 테이블을 여러 단계로 나누어 구성하는 방식으로, 하나의 큰 페이지 테이블을 여러 개로 분할하고, Outer 페이지 테이블이 각 하위 페이지 테이블을 참조하는 구조다. 이 방식에서는 Outer 페이지 테이블만 물리 메모리에 저장하고 나머지 하위 페이지 테이블들은 보조기억장치에 저장한다.
3. 페이징 기법은 내부 단편화를 발생시킨다.
페이징 기법은 프로세스의 논리 주소 공간을 일관된 크기의 페이지로 나누어 저장하기 때문에 외부 단편화는 해결할 수 있었다. 그러나 프로세스가 여러 개의 페이지로 나누어질 때, 페이지에 일부분 남는 공간이 생길 수 있다. 예를 들어, 프로세스의 크기가 34KB이고 페이지 크기가 10KB라고 가정한다. 이때 프로세스는 4개의 페이지로 나누어 지는데 각 페이지에 담긴 프로세스의 크기는 는 10KB, 10KB, 10KB, 4KB이다. 마지막 페이지는 6KB 메모리 공간이 남는데 다른 프로세스가 사용할 수 없는 공간이기 때문에 메모리 낭비로 이어진다.
이처럼 프로세스의 논리 주소 공간을 페이지로 나누었을 때 페이지에 남는 공간이 생기는 문제를 내부 단편화라고 한다.
참고
https://m.yes24.com/Goods/Detail/130179291