Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Функционирование менеджера памяти Лекция10.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
434.18 Кб
Скачать

Прогон программы, иллюстрирующей увеличение рабочего набора процесса

Рассмотрим легкую модификацию программы DemoVM, добавив туда операцию записи одного байта на каждую страницу переданной памяти (программа DemoPageFaults.c).

#include <windows.h>

#include <stdio.h>

void main(void)

{

PVOID pMem = NULL;

int nPageSize = 4096;

int nPages = 200;

long SizeCommit = 0;

int i;

char * Ptr;

SizeCommit = nPages * nPageSize;

getchar();

pMem = VirtualAlloc(0, SizeCommit, MEM_RESERVE| MEM_COMMIT, PAGE_READWRITE);

if(pMem == NULL) printf("VirtualAlloc Error\n");

Ptr = (char *)pMem;

for(i=0; i<nPages; i++) Ptr[i*nPageSize] = '0';

getchar();

pMem = VirtualAlloc(0, SizeCommit, MEM_RESERVE| MEM_COMMIT, PAGE_READWRITE);

if(pMem == NULL) printf("VirtualAlloc Error\n");

Ptr = (char *)pMem;

for(i=0; i<nPages; i++) Ptr[i*nPageSize] = '0';

getchar();

pMem = VirtualAlloc(0, SizeCommit, MEM_RESERVE| MEM_COMMIT, PAGE_READWRITE);

if(pMem == NULL) printf("VirtualAlloc Error\n");

Ptr = (char *)pMem;

for(i=0; i<nPages; i++) Ptr[i*nPageSize] = '0';

getchar();

pMem = VirtualAlloc(0, SizeCommit, MEM_RESERVE| MEM_COMMIT, PAGE_READWRITE);

if(pMem == NULL) printf("VirtualAlloc Error\n");

Ptr = (char *)pMem;

for(i=0; i<nPages; i++) Ptr[i*nPageSize] = '0';

getchar();

}

Наращивание объема переданной памяти и размера рабочего набора будет происходить по нажатию клавиши "Enter". Посмотрим на поведение счетчика "Рабочее множество" для процессов DemoVM и DemoPageFaults. Несмотря на одинаковый объем переданной физической памяти, размеры рабочего набора сильно отличаются. У DemoVM он остается близким к нулю, тогда как у процесса DemoPageFaults идет заметное ступенчатое приращение рабочего набора (см. рис. 10.5)

Рис. 10.5. Наблюдение за изменениями рабочих наборов процессов

Замещение страниц в рабочем наборе процесса - одна из наиболее ответственных операций. Дело в том, что уменьшение частоты page fault`ов является одной из ключевых задач системы управления памятью (например, известно, что вероятности page fault'а 5*10-7оказывается достаточно, чтобы снизить производительность страничной схемы управления памятью на 10%.). Решение этой задачи связано с разумным выбором алгоритма замещения страниц. Если стратегия замещения выбрана правильно, то в оперативной памяти остается только самая актуальная информация, которая может понадобиться в недалеком будущем и которая не нуждается в замещении (на эту тему написано много книг, см., например, [2]).

В ОС Windows используются алгоритмы FIFO (first input first output) в многопроцессорном варианте и LRU - в однопроцессорном. На самом деле применяется не LRU, а его программная реализация NFU (not frequently used), согласно которой страница характеризуется не давностью, а частотой использования. Однако, согласно документации по ОС Windows, алгоритм, осуществляющий модификацию размера рабочего набора процесса, называется именно LRU. Что касается алгоритма FIFO, несмотря на известные недостатки, его применение упрощает обработку ссылок на страницу от нескольких процессоров.

База данных pfn. Страничные демоны

В процессе функционирования операционной системы в физической памяти располагаются рабочие наборы процессов, системный рабочий набор, свободные фрагменты и многое другое. Для учета состояния физической памяти поддерживается база данных PFN (page frame number). Это таблица записей фиксированной длины. Количество записей в ней совпадает с количеством страничных кадров.

Известно, что подсистема виртуальной памяти работает производительно при наличии резерва свободных страничных кадров. Тогда в случае страничной ошибки требуется только одна дисковая операция (чтение), и свободная страница может быть найдена немедленно. Алгоритмы, обеспечивающие поддержку системы в оптимальном состоянии, реализованы в составе фоновых процессов (их часто называют демонами или сервисами), которые периодически "просыпаются" и инспектируют состояние памяти. Их задача - обеспечивать достаточное количество свободных страниц, поддерживая систему в состоянии наилучшей производительности.

Формально, каждая страница физической памяти должна находиться в составе рабочего набора или входить в один из поддерживаемых базой связных списков страниц. Перемещение страниц между списками и рабочими наборами осуществляется системными потоками-демонами, входящими в состав менеджера памяти (см. [6]). Параметры настройки демонов хранятся в разделе HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Managementреестра

Чаще всего для обслуживания ошибки страницы в соответствии с требованиями защиты уровня C2 (см. часть V) требуется обнуленная страница, которая извлекается из соответствующего списка. Список обнуленных страниц пополняется потоком обнуления страниц (zero page thread) в фоновом режиме за счет списка свободных страниц. Иногда, например, для отображения файла, обнуленные страницы не нужны, и можно обойтись свободными страницами. Если у рабочего набора процесса отбирается страница, она попадает в список модифицированных страниц или в список свободных страниц. Подсистема записи модифицированных страниц (modified page writer) записывает их содержание на диск, когда количество таких страниц превышает установленный лимит. Страницы проецируемого файла можно сбросить на диск явным образом (при помощи функции FlushViewOfFile ). После записи модифицированная страница попадает в список свободных страниц.

Общее руководство и реализацию общих правил управления памятью осуществляет диспетчер рабочих наборов (working set manager), который вызывается системным потоком ядра - диспетчером настройки баланса - раз в секунду или при уменьшении объема свободной памяти ниже порогового значения.