11장. 페이지 관리

 

  • 요구페이징( Demand Paging ) : 모든 내용을 메모리에 올려놓지 않고, 실행되어지는 프로세스에서 요구하는 시점에서 그 내용을 올리기 위한 페이지를 할당하는 기법

    1. 마이크로프로세서는 프로그램이 접근하고자 하는 메모리가 유효한지 알아보기 위해 그 페이지 테이블의 유효 비트를 살펴본다.
    2. 유효 비트가 0으로 세트되어 유효 하지 않다면 Page Fault Interrupt 를 발생 시킨다.
    3. OS는 메인메모리에서 빈 공간을 찾아본다. 빈공간이 없으면 페이지 교체 작업을 수행하여 빈 공간을 확보
    4. 새로 할당된 빈 공간에 해당 페이지의 내용을 디스크로 부터 읽어들인다.
    5. 요청한 페이지가 메모리에 있다는 사실을 마이크로프로세서가 인식할 수 있도록 페이지 테이블의 내용을 갱신
    6. 트랩에 의해 발생한 인터럽트를 빠져나감으로써 페이지 에러가 발생한 명령어가 다시 시작
  • Page Fault Exception Handler

    • 마이크로프로세서는 해당 프로세스의 커널 스택에 페이지 폴트의 원인에 대한 에러 코드와 기타 레지스터 정보를 Push 하여 넣고, CR2 레지스터에는 페이지 폴트가 발생한 주소를 세팅하여 놓은 후 페이지 부재 에러인 Int 14 를 발생시킨다.
    • Int14가 발생했을 당시의 스택 내용으로, 만약 커널레벨에서 실행되던 코드가 페이지 부재를 발생시켰을 경우에는 Privilege Level 변화가 없는 경우로 Page Fault 발생 당시의 레지스터 값과 에러가 발생한 이유를 설명하여 놓은 Error Code 값을 스택에 넣어주게 된다.
    • 유저 레벨에서 발생시켰을 경우에는, MicroProcessor는 실행 중이던 프로세스의 스택을 커널에 존재하는 스택으로 스위칭한 후 Previlege Level 변화가 없을 경우 들어갔던 내용에 유저레벨에서 실행되던 ESP와 SS 레지스터가 들어가게 된다.
    • Page Fault 는 참조하는 페이지가 메인 메모리에 존재하고 있지 않을 때, 접근 권한이 없는 프로세스가 해당 페이지를 접근하였을 때에도 발생하며 이러한 사항에 대해서는 Error Code 를 통해 알린다.
    • Error Code

      • P ( bit 0 ) : 0 - 참조하고자 하는 페이지가 유효하지 않을 상태로 페이지 테이블 또는 페이지 디렉토리의 P 비트가 0 이다.
      • 1 - 접근 권한에 대한 에러로( Read/Write ) 액세스 권한 또는 (User/Supervisor) 특권레벨 위반에 대한 페이지 폴트이다ㅣ.
      • R/W( bit 1 ) : 0 - 읽기 권한이 없는데 읽기를 시도하였다.
      • 1 - 쓰기 권한이 없는데 쓰기를 시도하였다.
      • U/S( bit 2 ) : 0 - 특권레벨 0, 1, 2( 커널레벨 )에서 페이지 폴트가 발생하였다.
      • 1 - 특권레벨 3( 유저레벨 ) 에서 페이지 폴트가 발생하였다.
    • 페이지 폴트가 발생한 주소에 대해서는 CR2 레지스터를 통해 알리게 된다.
  • 선페이징( Prepaging ) : 대부분의 프로그램이 참조한 근처의 메모리를 다시 참조한다는 지역성의 특성을 이용해 요구한 페이지 외에 그 근처의 페이지까지 함께 불러들이는 방식이다. 읽어들이고자 하는 내용이 코드 페이지인지 또는 데이터 페이지인지에 따라 읽어들여 놓는 크기가 달라지도록 하고 있다.
  • Page Out : 물리적 메모리에 있는 페이지의 내용에 대하여 하드디스크로 복사하여 놓는 작업
  • Page In : 하드디스크에 있는 페이지의 내용이 물리적 메모리로 옮겨와 사용되어지는 것
  • Paged Memory or Pageable Memory : 가상 메모리 공간 중에서 Page In과 Page Out 이 발생할 수 있는 가상 메모리 공간
  • NonPaged Memory : Page In 을 처리하기 위한 루틴이 포함되어 있는 Page Fault Handler 가 Page Out 되어 있다면 Page Fault 를 처리 할 수 없게 된다. 이러한 공간은 절대 Page Out 이 발생되지 않는 공간에 있게 된다. 이를 NonPaged Memory 라고 한다.
  • 페이지 교체 정책( Page Replacement Policy ) : 가장 좋은 교체 정책은 앞으로 가장 오랜 시간 동안 사용되지 않을 페이지를 찾아 교체하는 것이다.

    • FIFO( First In, First Out ) : 가장 먼저 들어온 페이지를 교체
    • LRU( Least Recently Used ) : 가장 오랫동안 사용되지 않은 페이지를 교체
    • Additional Reference Bits 알고리즘
    • Second Chance 알고리즘
  • 스레싱( Thrashing ) 현상

    • 어떤 프로세스가 너무 작은 양의 메모리 페이지 할당으로 실제 프로세스가 원하는 명령어의 실행 시간보다 페이지 부재의 발생으로 페이지 교체를 수행하는데 소비하는 시간이 더 많아 지면, 컴퓨터 성능에 심각한 성능 저하를 가져 올 것이다. 프로세스 수가 많아 질 수 록 CPU이용율은 점점 늘어나지만 일정 개수가 되고 나면 이용율이 급격히 떨어지게 된다. 이를 위해 각 프로세스가 가져야하는 페이지의 수를 적절히 조절해 주어야 할 것이다.
  • 작업세트 관리

    • 작업세트란? 하나의 프로세스에서 메인 메모리에 올라갈 수 있는 페이지들의 양
    • 고정 크기 할당 정책  : 프로세스가 생성되어질 때 메인 메모리에 유지할 페이지수를 결정하게 되며 그 이후 그 프로세스의 작업세트 크기를 계속 유지하게 된다. 추가적인 페이지가 필요할 때에는 페이지의 교체를 수행해야 한다.
    • 가변 크기 할당 정책 : 프로세스가 실행되는 동안 페이지의 할당 수를 다르게 하는 것, Page Fault 가 자주 발생하는 프로세스의 경우 그 페이지의 할당 수를 늘려주어 Page Fault 를 줄이고, Page Fault 가 적게 발생하는 프로세스의 경우 페이지 할당 수를 줄여주어 다른 프로세스가 사용할 수 있는 메인 메모리의 페이지 수를 늘려줄 수 있게 한다. 단, 이러한 모니터링에 의한 많은 오버헤드를 초례하게 된다.
    • 지역적 교체 정책 : Page Fault 를 일으킨 프로세스의 페이지에 대해 그 프로세스가 소유한 작업세트 내의 페이지로 교체 페이지를 선택
    • 전역적 교체 정책 : 전역 메인 메모리 중 커널이 위차한 페이지 or 락이 걸린 페이지를 제외한 모든 페이지를 교체 대상으로 삼는다.
    • Windows 에서는 작업세트의 상한치 하한치를 설정하여 놓은 후 그 프로세스가 가질 수 있는 작업세트의 크기를 이 범위 내에서 가질 수 있도록 보장해 주고 있다. 가용 페이지가 넉넉히 있는 상태에 Page Fault 발생시 작업세트의 상한치를 넘지 않는 범위 내에서 메인 메모리의 페이지를 작업세트로 할당, 상한치 까지 채워졌으면 지역적 교체 정책에 따라 LRU 의 교체정책에 의해 수행. 메인 메모리의 가용 메모리의 가용 메모리가 시스템이 정한 임계치 보다 낮을 경우에는 각 프로세스가 가지고 있는 작업세트를 조사하여 하한치보다 넘게 할당된 페이지들을 FIFO 알고리즘으로 회수하게 된다.
  • 페이징의 효과적 이용 방법
  1. typedef struct _ListEntry
  2. {
       int key;
  3. _ListEntry *pre, *next;
  4. DWORD flags;
  5. BYTE filename[1024];
  6. } ListEntry, *PListEntry;
  7. 2.
  8. typedef struct _DataBody
  9. {
        DWORD flags;
  10. BYTE filename[1024];
  11. } DataBody, *PDataBody;
  12. typedef struct _ListEntry
  13. {
  14. int key;

    _ListEntry *pre, *next;

  15. PDataBody data;
  16. } ListEntry, *PListEntry;

 

 위의 데이터구조는 하나의 데이터 구조에서 모든 엔트리를 다 가지고 있으며, 아래는 실제 데이터로 사용되는 부분과 검색에 의해 자주 참조되는 키를 분리하여 놓았다.

해당 데이터에 대하여 키에 대한 검색이 자주 일어나면 위쪽 데이터 구조에서는 메번 전체 키 검색을 위해 모든 데이터가 있는 자료구조 때문에 더 많은 페이지를 로드해야 하지만, 아래쪽 형태는 이를 분리하여 검색시 필요한 데이터 량을 줄여서 더 적은 페이지를 로드하게 해주어 페이지를 효과적으로 사용하게 해준다.


'책 정리 > Windows 구조와 원리 그리고 Codes' 카테고리의 다른 글

10장. 페이징  (0) 2009.11.15
9장. 세그먼테이션  (0) 2009.11.15
8장. 메모리 관리  (0) 2009.11.15
4장. 프로시저와 스택 구조  (0) 2009.11.15
3장. 기계어의 구성  (0) 2009.11.15

설정

트랙백

댓글