페이징에 대해 좀 더 알아보자.
페이지 크기와 내부 단편화
외부 단편화를 해결하기 위해 페이징 기법을 사용하지만, 내부 단편화 문제가 남는다.
프로세스에게 할당하고 남는 페이지가 생긴다. 이때 메모리가 낭비되는것을 내부 단편화라 한다.
예를 들어 페이지 크기가 10KB이고 프로세스의 크기가 107KB라고 치자.
그럼 마지막에 3KB만큼이 남게된다.
만약 페이지의 크기를 2KB로 줄이면? 1KB가 남게 된다.
이렇게 페이지의 크기를 줄이면 내부 단편화는 줄게 되겠지만, 전체 페이지의 수가 늘어가 페이지 테이블의 크기가 커져버려 테이블이 차지하는 공간이 낭비된다.
적당한 크기의 페이지 테이블이 만들어 지도록 조정할 필요가 있다.
대형 페이지
기본적으로 설정된 페이지 보다 큰 페이지를 대형 페이지라고 한다. 대형 페이지를 이용해 좀 더 유연하게 메모리를 유지할 수 있다.
쓰기 시 복사
프로세스 간 페이지를 공유하는 사례중 쓰기 시 복사 copy on write가 있다.
이론적인 fork()이다.
위와 같은 복사 작업은 생성 시간을 늦추고 메모리 낭비를 야기한다.
쓰기 시 복사는 자식 프로세스와 부모 프로세스가 동일한 프레임을 가리킨다.
메모리 공간을 복사하지 않고도 동일한 코드 및 데이터 영역을 가리킬 수 있는것이다.
부모 또는 자식 둘 중 하나가 쓰기 작업을 하면 해당 페이지가 별도의 공간으로 복제된다.
쓰기 시 복사로 자식 프로세스 생성 시간 축소 및 메모리 공간 절약이 가능해진다.
계층적 페이징
페이지 테이플을 페이징 한다!
모든 페이지 테이블 엔트리를 메모리에 두는 것은 메모리를 너무 많이 차지하기 때문이다.
페이지 테이블들 중 몇 개는 보조기억장치에 있어도 되고, 필요할 때 메모리에 적재하면 된다.
계층적 페이징을 이용하면 논리 주소도 위와 같이 변경된다.
바깥 페이지 번호: CPU와 근접한 곳에 위치한 페이지 테이블 엔트리
안쪽 페이지 번호: 페이지 테이블의 페이지 번호
페이지 폴트가 발생하면 메모리 참조 횟수가 많아져 계층이 많다고 무작정 좋은것은 아니다.