메모리 관리 기법인 페이징의 생겨난 이유와 작동 원리를 알아보자
메모리 연속 할당 문제
- 외부 단편화 말고도, 물리 메모리보다 큰 프로세스를 실행할 수 없다는 단점이 있다.
- 이는 가상 메모리를 통해 해결할 수 있다.
- 가상 메모리 관리 기법에는 페이징과 세그멘테이션 기법이 있다.
연속 메모리 할당 방식에서 외부 단편화가 생긴 이유는 각기 다른 크기의 프로세스가 메모리에 연속적으로 할당되었기 때문이다.
페이징
- 메모리와 프로세스를 일정한 단위로 자르고, 메모리에 불연속적으로 할당하는 방식이다.
- 프로세스의 논리 주소 공간을 페이지라는 일정한 단위로 자른다.
- 메모리 물리 주소 공간을 프레임이라는 일정한 단위로 자른다.
- 프레임과 페이지는 동일한 크기를 가진다.
- 즉, 프로세스의 논리 주소 공간을 페이지 단위로 자른 뒤 각 페이지를 프레임에 할당하는 가상 메모리 관리 기법이다.

페이징에서의 스와핑
- 스와핑은 스포레스 전체가 '스왑 아웃/스왑 인'을 하는 것이다.
- 반면에, 페이징에서의 스와핑은 페이지 단위로 '스왑 아웃/스왑 인'을 하는 것이다. 이를 '페이지 아웃/페이지 인'이라고 부른다.
- 이는 프로세스 전체가 메모리에 적재될 필요가 없다는 말과 같다.
- 즉, 프로세스를 이루는 페이지 중 일부 페이지만을 메모리에 적재하고, 당장 실행에 필요하지 않는 페이지들은 보조기억장치에 남겨둘 수 있다. 이는 메모리보다 큰 프로세스를 실행시킬 수 있다는 말이다.

페이지 테이블
- 위의 페이징에서의 스와핑을 그대로 할 경우 문제가 생긴다. 프로세스가 불연속적으로 배치되어 , CPU는 순차적으로 실행할 수가 없다.
- 이를 해결하기 위해 페이지 테이블을 이용한다.
- 페이지 테이블은 페이지 번호와 프레임 번호를 짝지어 주는 일종의 이정표이다.
- 즉, 페이지 테이블은 어떤 페이지가 어떤 프레임에 할당되었는 지를 알려준다.

- CPU 내의 페이지 테이블 베이스 레지스터(PTBR)는 각 프로세스의 페이지 테이블이 적재된 주소를 가키고 있다.
- PTBR은 각 프로세스의 페이지 테이블이 적재된 주소를 가리킨다.
- 그러나 페이지 테이블을 메모리에 두면 문제가 발생한다. 메모리 접근 시간이 2배로 늘어난다는 점이다.
- 그래서 CPU 곁에 TLB라는 페이지 테이블의 캐시 메모리를 둔다.
- 논리 주소에 대한 페이지 번호가 TLB에 있으면 TLB 히트, 없으면 TLB 미스라고 한다.

페이징에서의 주소 변환
- 하나의 페이지 혹은 프레임은 여러 주소를 포괄한다.
- 따라서 특정 주소에 접근하려면, '어떤 페이지 혹은 프레임에 접근하고 싶은지', '접근하려는 주소가 페이지 혹은 프레임으로 부터 얼마나 떨어져 있는지' 2가지 정보가 필요하다.
- 페이징 시스템은 모든 논리 주소가
페이지 번호+변위로 이루어져 있다.

페이지 테이블 엔트리
- 페이지 테이블의 각각의 행동을 페이지 테이블 엔트리라고 한다.
- 페이지 테이블 엔트리에는
페이지 번호,프레임 번호,유효비트,보호비트,참조비트,수정비트를 포함하고 있다.

유효비트
- 현재 해당 페이지에 접근 가능한 지 여부를 알려준다.
- 현재 페이지가 메모리에 적재되어 있는 지, 보조기억장치에 있는 지를 알려주는 비트이다.
- 메모리에 적재되어 있으면 1, 메모리에 적재되어 있지 않다면 0 비트가 된다.
- 만약 유효 비트가 0인 메모리에 적재되어 있지않는 페이지로 접근하면 페이지 폴트라는 예외가 발생한다.
보호비트
- 페이지 보호 기능을 위해 존재하는 비트이다.
- 0이면 읽기만 가능한 페이지, 1이면 읽고 쓰기가 모두 가능한 페이지임을 나타낸다.
- 보호 비트는 3개의 비트로 더 복잡하게 구현할 수 있다.
읽기+쓰기+실행의 비트는 각각 나눠서 설정할 수 있다. 3가지가 모두 허용되면 '111'비트로 구성되며, 3가지가 모두 허용되지 않는다면 '000'으로 설정되어 있다ㅏ.
참조비트
- CPU가 이 페이지에 접근한 적이 있는 지 여부를 나타낸다.
- 적재이후 읽거나 쓴 페이지는 1로 세팅되고, 한번도 읽거나 쓴 적이 없는 페이지는 0으로 유지된다.
수정비트
- 해당 페이지에 데이터를 쓴 적이 있는지 없는지 수정 여부를 알려준다.
- 더티 비트라고도 부른다.
- 1이면 변경된 적이 있는 페이지, 0이면 변경된 적이 없는 페이지이다.
- 수정비트는 페이지가 메모리에서 사라질 때, 보조기억장치에 쓰기 작업을 해야하는지, 할 필요가 없는지 판단하기 위해 존재한다.
페이징의 이점 - 쓰기 시 복사
- fork 시스템 호출을 하면, 부모 프로세스의 복사본인 자식 프로세스로서 생성된다.
- 프로세스 간에는 자원을 공유하지 않는다.
- 그러기 때문에 부모 프로세스 혹은 자식 프로세스가 페이제 쓰기 작업을 하는 순간, 해당 페이지가 별도의 공간으로 복제된다.
- 각 프로세스는 자신의 고유한 페이지가 할당된 프레임을 가리킨다. 이것이 쓰기 시 복사이다.
계층적 페이징
- 프로세스를 이루는 모든 페이지 테이블 엔트리를 항상 메모리에 유지하지 않을 수 있는 방법이 등장했는데, 이것이 계층적 페이징이다.
- 계층적 페이징은 페이지 테이블을 페이징하여 여러 단계의 페이지를 두는 방식이다.
- 여러 단계의 페이지를 둔다는 점에서 다단계 페이지 테이블 기법이라고도 부른다.
- 페이지 테이블을 계층적으로 구성하여, 모든 페이지 테이블을 항상 메모리에 유지할 필요없게 만든다.
- 논리 주소도
변위+페이지 번호에서 바깥 페이지 번호+안쪽 페이지 번호+변위로 바뀐다.

내부 단편화
- 페이징은 외부 단편화를 해결할 수 있지만, 내부 단편화 문제를 야기 시킨다.
- 페이징은 프로세스의 논리 주소 공간을 페이지라는 일정한 크기 단위로 자른다. 그러나 모든 프로세스가 페이지 크기에 맞게 잘리는 것이 아니다. 즉, 프로세스를 페이지로 나누고 남은 부분이 메모리 낭비를 야기 시킨다는 의미이다.