Machineboy空

가상메모리 ② 페이징, 페이징 테이블 엔트리 (유효,보호,참조,수정비트) 본문

Computer/CS

가상메모리 ② 페이징, 페이징 테이블 엔트리 (유효,보호,참조,수정비트)

안녕도라 2024. 1. 18. 11:59

연속 메모리 할당의 두 가지 문제점

  • 외부 단편화 (빈 공간들이 파편화되어 있어 활용도가 낮은 것)
  • 물리 메모리보다 큰 프로세스 실행 불가

가상 메모리란?

  • 실행하고 싶은 프로그램을 일부만 메모리에 적재해서 실제 물리 메모리 보다 큰 프로세스을 실행할 수 있는 기술
  • 방법: 페이징, 세그멘테이션

페이징(Paging)

외부 단편화가 발생했던 근본적인 문제?

각기 다른 크기의 프로세스가 메모리에 연속적으로 할당되었기 때문

 

모든 프로세스의 크기가 같다면, 외부단편화가 발생하지 않을 것

따라서, 프로세스를 일정 크기로 자르고 이를 메모리에 불연속적으로 할당할 수 있다면?

 

  • 프로세스의 논리 주소 공간페이지(page)라는 일정 단위로 자르고
  • 메모리의 물리 주소 공간프레임(frame)이라는 페이지와 동일한 일정 단위로 자른 뒤
  • 페이지를 프레임에 할당하는 가상 메모리 관리 기법

 

페이징에서의 스와핑 (swap)

  • 진행
    • 프로세스 단위의 스왑 인, 스왑 아웃이 아닌 페이지 단위의 스왑 인(페이지 인), 스왑 아웃(페이지 아웃)
    • 메모리에 적재될 필요가 없는 페이지들은 보조기억장치로 스왑 아웃
    • 실행에 필요한 페이지들은 메모리로 스왑 인
  • 의미
    • 모든 프로세스들이 메모리에 적재될 필요는 없다는 것을 시사한다.
    • 프로세스를 실행하기 위해 모든 페이지가 적재될 필요가 없다.
    • 달리 말해 물리 메모리보다 큰 프로세스도 실행될 수 있다.

페이지에서의 스왑 인 = 페이지 인, 스왑 아웃 = 페이지 아웃

 


페이지 테이블(Page Table)

 

하지만 이렇게 불연속적으로 위치해 있다면,

  • 프로세스를 이루는 페이지가 어느 프레임에 적재되어 있는지 CPU가 일일이 알기는 어렵다.
  • 프로세스가 메모리에 불연속적으로 배치되어 있다면 CPU입장에서 이를 순차적으로 실행할 수가 없음
  • CPU 입장에서 다음에 실행할 명령어 위치를 찾기가 어려워짐

 

  • 페이지 테이블
    • (실제 메모리 내의 주소인) 물리 주소에 불연속적으로 배치되더라도
    • (CPU가 바라보는 주소인) 논리 주소에는 연속적으로 배치되도록 하는 방법
    • 페이지 번호와 프레임 번호를 짝지어 주는 일종의 이정표

 

페이지 테이블은 프로세스마다 있다

 

물리적으로 분산되어 저장되더라도 CPU입장에서 바라본 논리 주소는 연속적으로 보인다.

CPU는 그저 논리 주소를 순차적으로 실행하면 된다.

 

하지만 페이징은 외부단편화를 해결하는 대신 내부 단편화가 발생할 수 있다.

 

예시 상황

  • 페이지 크기가 10KB, 프로세스 크기가 108KB?
  • 2KB: 내부 단편화 * 꼭 페이지의 크기가 영역 크기의 배수가 되진 않으니까
  • 하나의 페이지 크기보다 작은 크기로 발생한다.

 

*대형 페이지(huge Page) : 일부 운영체제에서 예외적 페이지로서 큰 크기의 페이지를 허용하기도 한다.

 


PTBR(Process Table Base Register)

 

프로세스마다 페이지 테이블이 있고

각 페이지 테이블은 CPU 내의 프로세스 테이블 베이스 레지스터(PTBR)가 가리킨다.

 

페이지 테이블이 메모리에 저장되어 있으면 어떤 문제가 있을까?

메모리에 접근하는 시간은 레지스터나, 캐시 메모리에 접근하는 시간보다 느리니

 

메모리 접근 시간이 두 배로

  • 페이지 테이블 참조하기 위해 한 번
  • 페이지 참조하기 위해 한 번


TLB (Translation Lookaside Buffer)

TLB: CPU 곁에 페이지 테이블의 캐시 메모리

페이지 테이블의 일부를 가져와 저장

불필요한 메모리 접근을 줄이게 해준다.

  • CPU가 접근하려는 논리주소가 TLB에 있다면? TLB 히트
    • 메모리 접근 한 번
  • CPU가 접근하려는 논리주소가 TLB에 없다면? TLB 미스
    • 메모리 접근 두 번

 


페이징에서의 주소 변환

특정 주소에 접근하고자 한다면 어떤 정보가 필요할까?

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

 

  • 페이징 시스템에서의 논리 주소
    • 페이지 번호(page number)와 변위(offset)
      • 접근하고자 하는 페이지
      • 내가 접근하고자 하는 주소는 페이지로부터 얼마나 떨어져 있는지
    • <페이지 번호, 변위>로 이루어진 논리 주소페이지 테이블을 통해 <프레임 번호, 변위>로 변환된다.
      • 두 변위는 같다.
      • 페이지 크기와 프레임 크기가 같으니까
     

 

 

 


페이지 테이블 엔트리(PTE, Page Table Entry)

 

페이지 테이블 엔트리(PTE): 페이지 테이블의 각각의 행

  • 페이지 번호, 프레임 번호 이외에 담기는 정보는?
    • 유효 비트 (valid bit)
      • 현재 해당 페이지에 접근 가능한지 여부
      • = 현재 페이지가 swap영역으로 쫓겨나 있는지 아닌지 등
      • 유효 비트가 0인 페이지에 접근하려고 하면? : 페이지 폴트(page fault)라는 인터럽트가 발생
        • CPU는 기존 작업 내역을 백업한다
        • 페이지 폴트 처리 루틴을 실행한다
        • 페이지 처리 루틴은 원하는 페이지를 메모리로 가져온 뒤 유효 비트를 1로 변경해 준다
        • 페이지 폴트를 처리했다면 이제 CPU는 해당 페이지에 접근할 수 있게 된다.
    • 보호 비트
      • 페이지 보호 기능을 위해 존재하는 비트
      • 페이지에 접근할 권한을 제어해서 페이지를 보호하는 비트
        • read,write,execute(?)로 나눠 체크하기도 한다.
    • 참조 비트(Reference bit)
      • CPU가 이 페이지에 접근한 적이 있는지 여부
        • CPU가 참조한 적이 한번이라도 있으면 1, 없으면 0
    • 수정 비트(dirty bit)
      • CPU가 이 페이지에 데이터를 쓴 적이 있는지 여부
      • =즉 수정한 적이 있는지. 변경된 적이 있는지 체크
      • 왜 있을까?
        • swapping과 연관
        • 이 페이지가 메모리에서 사라질 때 보조기억장치에 쓰기 작업을 해야하는지, 할 필요 없는지 체크
        • 메모리에서 수정되었으면 보조기억장치에도 수정해서 반영해줘야 하니까.