[CS] 페이징을 통한 가상 메모리 관리

정은아·2024년 2월 11일
post-thumbnail

메모리 관리 기법인 페이징의 생겨난 이유와 작동 원리를 알아보자

메모리 연속 할당 문제

  • 외부 단편화 말고도, 물리 메모리보다 큰 프로세스를 실행할 수 없다는 단점이 있다.
  • 이는 가상 메모리를 통해 해결할 수 있다.
  • 가상 메모리 관리 기법에는 페이징세그멘테이션 기법이 있다.

연속 메모리 할당 방식에서 외부 단편화가 생긴 이유는 각기 다른 크기의 프로세스가 메모리에 연속적으로 할당되었기 때문이다.

페이징

  • 메모리와 프로세스를 일정한 단위로 자르고, 메모리에 불연속적으로 할당하는 방식이다.
  • 프로세스의 논리 주소 공간페이지라는 일정한 단위로 자른다.
  • 메모리 물리 주소 공간프레임이라는 일정한 단위로 자른다.
  • 프레임과 페이지는 동일한 크기를 가진다.
  • 즉, 프로세스의 논리 주소 공간을 페이지 단위로 자른 뒤 각 페이지를 프레임에 할당하는 가상 메모리 관리 기법이다.

페이징에서의 스와핑

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

페이지 테이블

  • 위의 페이징에서의 스와핑을 그대로 할 경우 문제가 생긴다. 프로세스가 불연속적으로 배치되어 , 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 시스템 호출을 하면, 부모 프로세스의 복사본인 자식 프로세스로서 생성된다.
  • 프로세스 간에는 자원을 공유하지 않는다.
  • 그러기 때문에 부모 프로세스 혹은 자식 프로세스가 페이제 쓰기 작업을 하는 순간, 해당 페이지가 별도의 공간으로 복제된다.
  • 각 프로세스는 자신의 고유한 페이지가 할당된 프레임을 가리킨다. 이것이 쓰기 시 복사이다.

계층적 페이징

  • 프로세스를 이루는 모든 페이지 테이블 엔트리를 항상 메모리에 유지하지 않을 수 있는 방법이 등장했는데, 이것이 계층적 페이징이다.
  • 계층적 페이징은 페이지 테이블을 페이징하여 여러 단계의 페이지를 두는 방식이다.
  • 여러 단계의 페이지를 둔다는 점에서 다단계 페이지 테이블 기법이라고도 부른다.
  • 페이지 테이블을 계층적으로 구성하여, 모든 페이지 테이블을 항상 메모리에 유지할 필요없게 만든다.
  • 논리 주소도 변위+페이지 번호에서 바깥 페이지 번호+안쪽 페이지 번호+변위로 바뀐다.

내부 단편화

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

0개의 댓글