CS/운영체제

[운영체제] 14-2 페이징을 통한 가상 메모리 관리

서니션 2024. 8. 28. 16:23
이 글을 혼자 공부하는 컴퓨터구조 + 운영체제 (한빛미디어) 책을 읽고 혼자 공부한 내용입니다.
잘못 이해한 부분이 있을 수 있고, 문제가 있는 부분 댓글로 알려주시면 수정하겠습니다.

 

가상 메모리

실행하고자 하는 프로그램을 일부만 메모리에 적재하여 실제 물리 메모리 크기보다 더 큰 프로세스를 실행할 수 있게 하는 기술


페이징

페이징은 프로세스의 논리 주소 공간을 페이지라는 일정한 단위로 자르고,

메모리 물리 주소 공간을 프레임이라는 페이지와 동일한 크기의 일정한 단위로 자른 뒤

페이지를 프레임에 할당하는 가상 메모리 관리 기법

 

페이징에서도 스와핑이 가능

전체가 아닌 페이지 단위로 페이지 인/페이지 아웃 됨

 

페이징은 외부 단편화 문제를 해결할 수 있지만, 내부 단편화 문제가 있음

이러한 내부 단편화 문제는 하나의 페이지 크기를 적당히 조절해야함

 


페이지 테이블

프로세스가 비록 (실제 메모리 내의 주소인) 물리 주소에 불연속적으로 배치되더라도

(CPU가 바라보는 주소인) 논리 주소에는 연속적으로 배치되게 하는 것

 

페이지 번호와 프레임 번호를 짝지어 주는 일종의 이정표

프로세스마다 각자의 프로세스 테이블이 있음

프로세스들이 메모리에 분산되어 저장되어 있더라도 CPU는 논리 주소를 순차적으로 실행하면 됨

 

CPU 내의 페이지 테이블 베이스 레지스터(RTBR)는 각 프로세스의 페이지 테이블이 적재된 주소를 가리킴

 

하지만, 이렇게 페이지 테이블을 메모리에 둔다면 메모리 접근 시간이 두 배로 늘어남

메모리에 있는 페이지 테이블을 보기 위해, 보고 나서 프레임에 접근하기 위해.

 

이와 같은 문제를 해결하기 위해 TLB라는 페이지 테이블의 캐시 메모리가 있음

  • 참조 지역성에 근거해 주로 최근에 사용된 페이지 위주로 가져와 저장
  • TLB 히트 CPU가 발생한 논리 주소에 대한 페이지 번호가 TBL에 있을 경우
  • TBL 미스 만일 페이지 번호가 TBL에 없을 경우

페이징에서의 주소 변환

특정 주소에 접근하려면 두 가지 정보가 필요

  • 어떤 페이지 혹은 프레임에 접근하고 싶은지
  • 접근하려는 주소가 그 페이지 혹은 프레임으로부터 얼마나 떨어져 있는지

 

페이징 시스템에서는 모든 논리 주소가 기본적으로 페이지 번호와 변위로 구성

페이지 번호를 찾으면 어떤 프레임에 할당되었는지 알 수 있음

변위는 접근하려는 주소가 프레임의 시작 번지로부터 얼만큼 떨어져 있는지를 알기 위한 정보

 

논리 주소 <페이지 번호, 변위> -> 페이지 테이블 -> 물리 주소 <프레임 번호, 변위> 변환


페이지 테이블 엔트리

페이지 테이블의 각각의 행

 

유효 비트

  • 현재 해당 페이지에 접근 가능한지 여부
  • 페이지가 메모리에 적재되어 있다면 유효 비트가 1
  • 적재되어 있지 않다면 유효 비트가 0
  • 만일 0인 메모리에 접근하려고 한다면 페이지 폴트라는 예외가 발생

 

페이지 폴트를 처리하는 과정 

  1. CPU는 기존의 작업 내역을 백업
  2. 페이지 폴트 처리 루틴 실행
  3. 페이지 처리 루틴은 원하는 페이지를 메모리로 가져온 뒤 유효 비트를 1로 변경
  4. 페이지 폴트를 처리했다면 이제 CPU는 해당 페이지에 접근 가능

 

보호 비트

  • 페이지 보호 기능을 위해 존재하는 비트
  • 해당 페이지가 읽고 쓰기가 모두 가능한 페이지인지, 혹은 읽기만 가능한 페이지인지 확인
  • 읽고 쓰기가 모두 가능한 페이지라면 1
  • 읽기만 가능한 페이지라면 0
  • 0,1 이 아닌 r(read, 읽기), w(wirte, 쓰기), e(excute, 실행)으로 100,111 이렇게도 사용 가능

 

참조 비트

  • CPU가 이 페이지에 접근한 적이 있는지 여부
  • 적재 이후 CPU가 읽거나 쓴 페이지는 참조 비트가 1
  • 적재 이후 한 번도 읽거나 쓴 적이 없는 페이지는 0

 

수정 비트 (더티 비트)

  • CPU가 해당 페이지에 데이터를 쓴 적이 있는지 없는지 수정 여부
  • 변경된 적이 있는 페이지라면 1
  • 변경된 적이 없는 (접근한 적 없거나, 읽기만 한) 페이지라면 0
  • 페이지가 메모리에서 사라질 때 보조기억장치에 쓰기 작업을 해야 하는지, 할 필요가 없는지를 판단하기 위해 존재

쓰기 시 복사

  • 대표적인 페이징의 이점
  • 부모 프로세스와 동일한 자식 프로세스가 생성되면 다음 그림과 같이 자식 프로세스로 하여금 부모 프로세스와 동일한 프레임을 가리킴
  • 부모 프로세스 혹은 자식 프로세스 둘 중 하나가 페이지에 쓰기 작업을 하면 그 순간 해당 페이지가 별도의 공간으로 복제
  • 프로세스 생성 시간을 줄이는 것은 물론, 메모리 공간 절약도 가능


계층적 페이징

  • 페이지 테이블을 페이징하여 여러 단계의 페이지를 두는 방식
  • 계층적으로 구성한다면 모든 페이지 테이블을 항상 메모리에 유지할 필요가 없음
    • 보조기억장치에 두다가, 참조해야 할 때가 있으면 그때 메모리에 적재하면 되니까


CPU가 발생하는 논리 주소가 달라짐

  • 바깥 페이지 번호 CPU와 근접한 곳에 위치한 페이지 테이블 엔트리
  • 안쪽 페이지 번호 첫 번째 페이지 테이블 바깥에 위치한 두 번째 페이지 테이블, 즉 페이지 테이블의 페이지 번호를 가리킴

 

논리 주소를 토대로 주소 변환은 아래와 같이 이뤄짐

  1. 바깥 페이지 번호를 통해 페이지 테이블의 페이지 찾기
  2. 페이지 테이블의 페이지를 통해 프레임 번호를 찾고 변위를 더함으로서 물리 주소 얻기