Управление внешней памятью в ос windows управление базовыми и динамическими дисками
Менеджер памяти - часть операционной системы, отвечающая за управление памятью.
Основные методы распределения памяти:
Без использования внешней памяти (например: HDD)
С использованием внешней памяти
6.2 Методы без использования внешней памяти
6.2.1 Однозадачная система без подкачки на диск
Память разделяется только между программой и операционной системой.
Схемы разделения памяти:
Схемы разделения памяти
Третий вариант используется в MS-DOS. Та часть, которая находится в ПЗУ, часто называется BIOS.
6.2.2 Распределение памяти с фиксированными разделами.
Память просто разделяется на несколько разделов (возможно, не равных). Процессы могут быть разными, поэтому каждому разделу необходим разный размер памяти.
Системы могут иметь:
общую очередь ко всем разделам
к каждому разделу отдельную очередь
Распределение памяти с фиксированными разделами
Недостаток системы многих очередей очевиден, когда большой раздел может быть свободным, а к маленькому выстроилась очередь.
Алгоритмы планирования в случае одной очереди:
выбирается задача, которая максимально займет раздел
Также может быть смешанная система.
6.2.3 Распределение памяти динамическими разделами
В такой системе сначала память свободна, потом идет динамическое распределение памяти.
Распределение памяти динамическими разделами.
Перемещаемые разделы
Это один из методов борьбы с фрагментацией. Но на него уходит много времени.
Рост разделов
Иногда процессу может понадобиться больше памяти, чем предполагалось изначально.
Настройка адресов и защита памяти
В предыдущих примерах мы можем увидеть две основные проблемы.
Настройка адресов или перемещение программ в памяти
Защита адресного пространства каждой программы
Решение обоих проблем заключается в оснащении машины специальными аппаратными регистрами.
Базовый (указывает начало адресного пространства программы)
Предельный (указывает конец адресного пространства программы)
6.3 Методы с использованием внешней памяти (свопинг и виртуальная память)
Так как памяти, как правило, не хватает. Для выполнения процессов часто приходится использовать диск.
Основные способы использования диска:
Свопинг (подкачка) - процесс целиком загружается в память для работы
Виртуальная память - процесс может быть частично загружен в память для работы
6.3.1 Свопинг (подкачка)
При нехватке памяти процессы могут быть выгружены на диск.
т.к. процесс С очень большой, процесс А был выгружен временно на диск,
после завершения процесса С он снова был загружен в память.
Как мы видим процесс А второй раз загрузился в другое адресное пространство, должны создаваться такие условия, которые не повлияют на работу процесса.
Свопер - планировщик, управляющий перемещением данных между памятью и диском.
Этот метод был основным для UNIX до версии 3BSD.
Управление памятью с помощью битовых массивов
Вся память разбивается на блоки (например, по 32бита), массив содержит 1 или 0 (занят или незанят).
Чтобы процессу в 32Кбита занять память, нужно набрать последовательность из 1000 свободных блоков.
Такой алгоритм займет много времени.
битовые массивы и списки
Управление памятью с помощью связных списков
Этот способ отслеживает списки занятых (между процессами) и свободных (процессы) фрагментов памяти.
Запись в списке указывает на:
занят (P) или незанят (H) фрагмент
адрес начала фрагмента
Четыре комбинации соседей для завершения процесса X
Алгоритмы выделения блока памяти:
первый подходящий участок.
следующий подходящий участок, стартует не сначала списка, а с того места на котором остановился в последний раз.
самый подходящий участок (медленнее, но лучше использует память).
самый неподходящий участок, расчет делается на то, что программа займет самый большой участок, а лишнее будет отделено в новый участок, и он будет достаточно большой для другой программы.
6.3.2 Виртуальная память
Основная идея заключается в разбиении программы на части, и в память эти части загружаются по очереди.
Программа при этом общается с виртуальной памятью, а не с физической.
Диспетчер памяти преобразует виртуальные адреса в физические.
Страничная организация памяти
Страничные блоки - единицы физической памяти.
Х - обозначает не отображаемую страницу в физической памяти.
Страничное прерывание - происходит, если процесс обратился к странице, которая не загружена в ОЗУ (т.е. Х). Процессор передается другому процессу, и параллельно страница загружается в память.
Таблица страниц - используется для хранения соответствия адресов виртуальной страницы и страничного блока.
Таблица может быть размещена:
в аппаратных регистрах (преимущество: более высокое быстродействие, недостаток - стоимость)
Типичная запись в таблице страниц
Присутствие/отсутствие - загружена или незагружена в память
Защита - виды доступа, например, чтение/запись.
Изменение - изменилась ли страница, если да то при выгрузке записывается на диск, если нет, просто уничтожается.
Обращение - было ли обращение к странице, если нет, то это лучший кандидат на освобождение памяти.
Информация о адресе страницы когда она хранится на диске, в таблице не размещается.
Для ускорения доступа к страницам в диспетчере памяти создают буфер быстрого преобразования адреса, в котором хранится информация о наиболее часто используемых страниц.
Страничная организация памяти используется, и в UNIX, и в Windows.
Хранение страничной памяти на диске
Статическая область свопинга
После запуска процесса он занимает определенную память, на диске сразу ему выделяется такое же пространство. Поэтому файл подкачки должен быть не меньше памяти. А в случае нехватки памяти даже больше. Как только процесс завершится, он освободит память и место на диске.
На диске всегда есть дубликат страницы, которая находится в памяти.
Этот механизм наиболее простой.
Статический и динамический методы организации свопинга.
Динамическая область свопинга
Предполагается не выделять страницам место на диске, а выделять только при выгрузке страницы, и как только страница вернется в память освобождать место на диске.
Этот механизм сложнее, так как процессы не привязаны к какому-то пространству на диске, и нужно хранить информацию (карту диска) о местоположении на диске каждой страницы.
Обо всех деталях отображения виртуальных адресов на физические адреса (virtual to physical memory mapping), механизмах страничной подкачки (page swapping) и замещения страниц по запросу (demand paging) и прочих моментах заботится ОС. Эти вопросы подробно обсуждаются в документации по ОС, а также в книге Соломона (Solomon) и Руссиновича (Russinovich) Inside Windows2000. Краткое изложение наиболее существенных сведений приводится ниже:
• Система может располагать сравнительно небольшим объемом физической памяти; на практике для всех систем, кроме Windows XP, необходимый минимум составляет 128 Мбайт, однако в типичных случаях доступные объемы физической памяти оказываются намного большими.[21]
• Каждый отдельный процесс — а таких процессов, как пользовательских, так и системных, может выполняться одновременно несколько — имеет собственное виртуальное адресное пространство, объем которого может значительно превосходить объем доступного физического адресного пространства. Например, емкость виртуального адресного пространства объемом 1 Гбайт, относящегося к одному процессу, в восемь раз превышает емкость физической памяти объемом 128 Мбайт, и таких процессов может быть множество.
• ОС преобразует виртуальные адреса в физические адреса.
• Для большинства виртуальных страниц в физической памяти места не хватит, поэтому ОС имеет возможность реагировать на страничные ошибки (page faults), возникающие при попытках обращения к страницам, которые отсутствуют в памяти, и загружать данные с жесткого диска — из системного файла подкачки (swap file) или из обычного файла. Будучи прозрачными для программиста, страничные ошибки отрицательно влияют на производительность, поэтому программы должны проектироваться таким образом, чтобы вероятность возникновения подобных ошибок была сведена к минимуму. Более подробное освещение этой темы, рассмотрение которой выходит за рамки данной книги, вы найдете в справочной документации по ОС.
На рис. 5.1 проиллюстрировано расположение уровней API управления памятью Windows поверх диспетчера виртуальной памяти (Virtual Memory Manager, VMM). API виртуальной памяти Windows (VirtualAlloc, VirtualFree, Virtual-Lock, VirtualUnlock и так далее) работает с целыми страницами. API кучи Windows управляет блоками памяти, размер которых определяется пользователем.
Мы не будем останавливаться на топологии адресного пространства виртуальной памяти, поскольку она не имеет непосредственного отношения к API, различна в Windows 9x и Windows NT и в будущем может измениться. Соответствующая информация содержится в документации Microsoft.
Тем не менее, многим программистам хотелось бы знать больше о своей среде разработки. Начните исследование структуры памяти в вашей системе с вызова следующей функции:
VOID GetSystemInfo(LPSYSTEM_INFO lpSystemInfo)
Параметром этой функции служит адрес структуры PSYSTEM_INFO, в которой содержится информация относительно размера системной страницы, а также адресах физической памяти, доступных для приложений.
9.2.1. Обзор управления заданиями
9.2.1. Обзор управления заданиями Управление заданиями является сложной темой, той, в которую мы решили не погружаться в данной книге. Однако, здесь приведен краткий концептуальной обзор.Устройство терминала (физическое или другое) с работающим на нем пользователем
Архитектура системы управления памятью в Win32 и Win64
Архитектура системы управления памятью в Win32 и Win64 Win32 (в данном случае различия между Win32 и Win64 становятся существенными) — это API 32-разрядных ОС семейства Windows. "32-разрядность" проявляет себя при адресации памяти тем, что указатели (LPSTR, LPDWORD и так далее) являются 4-байтовыми
Обзор методов асинхронного ввода/вывода Windows
Обзор методов асинхронного ввода/вывода Windows В Windows выполнение асинхронного ввода/вывода обеспечивается в соответствии с тремя методиками.• Многопоточный ввод/вывод (Multihreaded I/O). Каждый из потоков внутри процесса или набора процессов выполняет обычный синхронный
3.7. Обзор возможностей современных систем управления политиками безопасности
3.7. Обзор возможностей современных систем управления политиками безопасности Как правило, современные системы управления политиками безопасности используют лицензированные библиотеки политик безопасности, разработанные другими компаниями. Так, например, продукт
Принципы управления памятью
Принципы управления памятью Одной из основных функций операционной системы является эффективное управление памятью. Оперативная память, или основная память, или память с произвольным доступом (Random Access Memory, RAM) является достаточно дорогостоящим ресурсом. Время доступа к
Управление памятью процесса
Управление памятью процесса Можно сказать, что каждый процесс в операционной системе UNIX выполняется на собственной виртуальной вычислительной машине, где все ресурсы принадлежат исключительно данному процессу. Подсистема управления памятью обеспечивает такую
2.2.1 Обзор особенностей подсистемы управления файлами
2.2.1 Обзор особенностей подсистемы управления файлами Внутреннее представление файла описывается в индексе, который содержит описание размещения информации файла на диске и другую информацию, такую как владелец файла, права доступа к файлу и время доступа. Термин
ГЛАВА 9. АЛГОРИТМЫ УПРАВЛЕНИЯ ПАМЯТЬЮ
ГЛАВА 9. АЛГОРИТМЫ УПРАВЛЕНИЯ ПАМЯТЬЮ Алгоритм планирования использования процессорного времени, рассмотренный в предыдущей главе, в сильной степени зависит от выбранной стратегии управления памятью. Процесс может выполняться, если он хотя бы частично присутствует в
18.1.3. Управление памятью
18.1.3. Управление памятью Управление памятью осуществляется с помощью параметра mem: mem=Определяет объем памяти, установленной в компьютере.Например: mem=16384K или mem=16M.Иногда нужно указать объем ОЗУ, отличный от того, который имеется на самом деле. Например, у вас чипсет Intel 810 с
23.2.2. Функции для работы с памятью
23.2.2. Функции для работы с памятью Функции для работы с памятью библиотеки Glib выполняют те же действия, что и соответствующие им функции языка С. Вот их прототипы:gpointer g_malloc(gulong size);gpointer g_realloc(gpointer mem, gulong size);void g_free(gpointer
Шаг 18 - Управление памятью.
Шаг 18 - Управление памятью. Больше нет возможности обходить эту тему. Это слишком важно. Долго не хотел браться за нее, но она сама взялась за меня.В управлении памятью одна из самых больших проблем (для меня) состоит в том,что у авторов книг по C++ в этом месте случается как бы
Шаг 19 - Управление памятью. Продолжение 1.
Шаг 19 - Управление памятью. Продолжение 1. Бог: "Я стер всякую жизнь. Впочем, я ничего не уничтожил. Я просто воссоединил в Себе частицы Себя. У меня на планете было множество типов с безумными глазами, которые болтали насчет слияния со Мной. Вот они и слились." Кармоди: "Им это
Примитивы управления памятью (Memory Handling Primitives)
Примитивы управления памятью (Memory Handling Primitives) Чтобы получать типичный указатель на неинициализированный буфер памяти данного размера, определена следующая функция:template ‹class T›inline T* allocate(ptrdiff_t n, Т*); // n ›= 0Размер (в байтах) распределённого буфера - не меньше n*sizeof(T).Для
Лекция 9. Управление памятью
Лекция 9. Управление памятью Честно говоря, было бы неплохо забыть про память. Программы создавали бы объекты по мере надобности. Неиспользованные объекты исчезали бы в небытие, а необходимые медленно передвигались бы вверх. Этот процесс подобен движению по служебной
Проблема управления памятью в ОО-модели
Проблема управления памятью в ОО-модели Подводя итог предшествующего анализа, определим оригиналы и соответственно достижимые объекты:Определение: начальные, достижимые и недостижимые объектыВ каждый момент времени выполнения системы множество оригиналов
Менеджер памяти - часть операционной системы, отвечающая за управление памятью.
Основные методы распределения памяти:
Без использования внешней памяти (например: HDD)
С использованием внешней памяти
6.2 Методы без использования внешней памяти
6.2.1 Однозадачная система без подкачки на диск
Память разделяется только между программой и операционной системой.
Схемы разделения памяти:
Схемы разделения памяти
Третий вариант используется в MS-DOS. Та часть, которая находится в ПЗУ, часто называется BIOS.
6.2.2 Распределение памяти с фиксированными разделами.
Память просто разделяется на несколько разделов (возможно, не равных). Процессы могут быть разными, поэтому каждому разделу необходим разный размер памяти.
Системы могут иметь:
общую очередь ко всем разделам
к каждому разделу отдельную очередь
Распределение памяти с фиксированными разделами
Недостаток системы многих очередей очевиден, когда большой раздел может быть свободным, а к маленькому выстроилась очередь.
Алгоритмы планирования в случае одной очереди:
выбирается задача, которая максимально займет раздел
Также может быть смешанная система.
6.2.3 Распределение памяти динамическими разделами
В такой системе сначала память свободна, потом идет динамическое распределение памяти.
Распределение памяти динамическими разделами.
Перемещаемые разделы
Это один из методов борьбы с фрагментацией. Но на него уходит много времени.
Рост разделов
Иногда процессу может понадобиться больше памяти, чем предполагалось изначально.
Настройка адресов и защита памяти
В предыдущих примерах мы можем увидеть две основные проблемы.
Настройка адресов или перемещение программ в памяти
Защита адресного пространства каждой программы
Решение обоих проблем заключается в оснащении машины специальными аппаратными регистрами.
Базовый (указывает начало адресного пространства программы)
Предельный (указывает конец адресного пространства программы)
6.3 Методы с использованием внешней памяти (свопинг и виртуальная память)
Так как памяти, как правило, не хватает. Для выполнения процессов часто приходится использовать диск.
Основные способы использования диска:
Свопинг (подкачка) - процесс целиком загружается в память для работы
Виртуальная память - процесс может быть частично загружен в память для работы
6.3.1 Свопинг (подкачка)
При нехватке памяти процессы могут быть выгружены на диск.
т.к. процесс С очень большой, процесс А был выгружен временно на диск,
после завершения процесса С он снова был загружен в память.
Как мы видим процесс А второй раз загрузился в другое адресное пространство, должны создаваться такие условия, которые не повлияют на работу процесса.
Свопер - планировщик, управляющий перемещением данных между памятью и диском.
Этот метод был основным для UNIX до версии 3BSD.
Управление памятью с помощью битовых массивов
Вся память разбивается на блоки (например, по 32бита), массив содержит 1 или 0 (занят или незанят).
Чтобы процессу в 32Кбита занять память, нужно набрать последовательность из 1000 свободных блоков.
Такой алгоритм займет много времени.
битовые массивы и списки
Управление памятью с помощью связных списков
Этот способ отслеживает списки занятых (между процессами) и свободных (процессы) фрагментов памяти.
Запись в списке указывает на:
занят (P) или незанят (H) фрагмент
адрес начала фрагмента
Четыре комбинации соседей для завершения процесса X
Алгоритмы выделения блока памяти:
первый подходящий участок.
следующий подходящий участок, стартует не сначала списка, а с того места на котором остановился в последний раз.
самый подходящий участок (медленнее, но лучше использует память).
самый неподходящий участок, расчет делается на то, что программа займет самый большой участок, а лишнее будет отделено в новый участок, и он будет достаточно большой для другой программы.
6.3.2 Виртуальная память
Основная идея заключается в разбиении программы на части, и в память эти части загружаются по очереди.
Программа при этом общается с виртуальной памятью, а не с физической.
Диспетчер памяти преобразует виртуальные адреса в физические.
Страничная организация памяти
Страничные блоки - единицы физической памяти.
Х - обозначает не отображаемую страницу в физической памяти.
Страничное прерывание - происходит, если процесс обратился к странице, которая не загружена в ОЗУ (т.е. Х). Процессор передается другому процессу, и параллельно страница загружается в память.
Таблица страниц - используется для хранения соответствия адресов виртуальной страницы и страничного блока.
Таблица может быть размещена:
в аппаратных регистрах (преимущество: более высокое быстродействие, недостаток - стоимость)
Типичная запись в таблице страниц
Присутствие/отсутствие - загружена или незагружена в память
Защита - виды доступа, например, чтение/запись.
Изменение - изменилась ли страница, если да то при выгрузке записывается на диск, если нет, просто уничтожается.
Обращение - было ли обращение к странице, если нет, то это лучший кандидат на освобождение памяти.
Информация о адресе страницы когда она хранится на диске, в таблице не размещается.
Для ускорения доступа к страницам в диспетчере памяти создают буфер быстрого преобразования адреса, в котором хранится информация о наиболее часто используемых страниц.
Страничная организация памяти используется, и в UNIX, и в Windows.
Хранение страничной памяти на диске
Статическая область свопинга
После запуска процесса он занимает определенную память, на диске сразу ему выделяется такое же пространство. Поэтому файл подкачки должен быть не меньше памяти. А в случае нехватки памяти даже больше. Как только процесс завершится, он освободит память и место на диске.
На диске всегда есть дубликат страницы, которая находится в памяти.
Этот механизм наиболее простой.
Статический и динамический методы организации свопинга.
Динамическая область свопинга
Предполагается не выделять страницам место на диске, а выделять только при выгрузке страницы, и как только страница вернется в память освобождать место на диске.
Этот механизм сложнее, так как процессы не привязаны к какому-то пространству на диске, и нужно хранить информацию (карту диска) о местоположении на диске каждой страницы.
Менеджер памяти - часть операционной системы, отвечающая за управление памятью.
Основные методы распределения памяти:
Без использования внешней памяти (например: HDD)
С использованием внешней памяти
6.2 Методы без использования внешней памяти
6.2.1 Однозадачная система без подкачки на диск
Память разделяется только между программой и операционной системой.
Схемы разделения памяти:
Схемы разделения памяти
Третий вариант используется в MS-DOS. Та часть, которая находится в ПЗУ, часто называется BIOS.
6.2.2 Распределение памяти с фиксированными разделами.
Память просто разделяется на несколько разделов (возможно, не равных). Процессы могут быть разными, поэтому каждому разделу необходим разный размер памяти.
Системы могут иметь:
общую очередь ко всем разделам
к каждому разделу отдельную очередь
Распределение памяти с фиксированными разделами
Недостаток системы многих очередей очевиден, когда большой раздел может быть свободным, а к маленькому выстроилась очередь.
Алгоритмы планирования в случае одной очереди:
выбирается задача, которая максимально займет раздел
Также может быть смешанная система.
6.2.3 Распределение памяти динамическими разделами
В такой системе сначала память свободна, потом идет динамическое распределение памяти.
Распределение памяти динамическими разделами.
Перемещаемые разделы
Это один из методов борьбы с фрагментацией. Но на него уходит много времени.
Рост разделов
Иногда процессу может понадобиться больше памяти, чем предполагалось изначально.
Настройка адресов и защита памяти
В предыдущих примерах мы можем увидеть две основные проблемы.
Настройка адресов или перемещение программ в памяти
Защита адресного пространства каждой программы
Решение обоих проблем заключается в оснащении машины специальными аппаратными регистрами.
Базовый (указывает начало адресного пространства программы)
Предельный (указывает конец адресного пространства программы)
6.3 Методы с использованием внешней памяти (свопинг и виртуальная память)
Так как памяти, как правило, не хватает. Для выполнения процессов часто приходится использовать диск.
Основные способы использования диска:
Свопинг (подкачка) - процесс целиком загружается в память для работы
Виртуальная память - процесс может быть частично загружен в память для работы
6.3.1 Свопинг (подкачка)
При нехватке памяти процессы могут быть выгружены на диск.
т.к. процесс С очень большой, процесс А был выгружен временно на диск,
после завершения процесса С он снова был загружен в память.
Как мы видим процесс А второй раз загрузился в другое адресное пространство, должны создаваться такие условия, которые не повлияют на работу процесса.
Свопер - планировщик, управляющий перемещением данных между памятью и диском.
Этот метод был основным для UNIX до версии 3BSD.
Управление памятью с помощью битовых массивов
Вся память разбивается на блоки (например, по 32бита), массив содержит 1 или 0 (занят или незанят).
Чтобы процессу в 32Кбита занять память, нужно набрать последовательность из 1000 свободных блоков.
Такой алгоритм займет много времени.
битовые массивы и списки
Управление памятью с помощью связных списков
Этот способ отслеживает списки занятых (между процессами) и свободных (процессы) фрагментов памяти.
Запись в списке указывает на:
занят (P) или незанят (H) фрагмент
адрес начала фрагмента
Четыре комбинации соседей для завершения процесса X
Алгоритмы выделения блока памяти:
первый подходящий участок.
следующий подходящий участок, стартует не сначала списка, а с того места на котором остановился в последний раз.
самый подходящий участок (медленнее, но лучше использует память).
самый неподходящий участок, расчет делается на то, что программа займет самый большой участок, а лишнее будет отделено в новый участок, и он будет достаточно большой для другой программы.
6.3.2 Виртуальная память
Основная идея заключается в разбиении программы на части, и в память эти части загружаются по очереди.
Программа при этом общается с виртуальной памятью, а не с физической.
Диспетчер памяти преобразует виртуальные адреса в физические.
Страничная организация памяти
Страничные блоки - единицы физической памяти.
Х - обозначает не отображаемую страницу в физической памяти.
Страничное прерывание - происходит, если процесс обратился к странице, которая не загружена в ОЗУ (т.е. Х). Процессор передается другому процессу, и параллельно страница загружается в память.
Таблица страниц - используется для хранения соответствия адресов виртуальной страницы и страничного блока.
Таблица может быть размещена:
в аппаратных регистрах (преимущество: более высокое быстродействие, недостаток - стоимость)
Типичная запись в таблице страниц
Присутствие/отсутствие - загружена или незагружена в память
Защита - виды доступа, например, чтение/запись.
Изменение - изменилась ли страница, если да то при выгрузке записывается на диск, если нет, просто уничтожается.
Обращение - было ли обращение к странице, если нет, то это лучший кандидат на освобождение памяти.
Информация о адресе страницы когда она хранится на диске, в таблице не размещается.
Для ускорения доступа к страницам в диспетчере памяти создают буфер быстрого преобразования адреса, в котором хранится информация о наиболее часто используемых страниц.
Страничная организация памяти используется, и в UNIX, и в Windows.
Хранение страничной памяти на диске
Статическая область свопинга
После запуска процесса он занимает определенную память, на диске сразу ему выделяется такое же пространство. Поэтому файл подкачки должен быть не меньше памяти. А в случае нехватки памяти даже больше. Как только процесс завершится, он освободит память и место на диске.
На диске всегда есть дубликат страницы, которая находится в памяти.
Этот механизм наиболее простой.
Статический и динамический методы организации свопинга.
Динамическая область свопинга
Предполагается не выделять страницам место на диске, а выделять только при выгрузке страницы, и как только страница вернется в память освобождать место на диске.
Этот механизм сложнее, так как процессы не привязаны к какому-то пространству на диске, и нужно хранить информацию (карту диска) о местоположении на диске каждой страницы.
Каталог:
Один
Два
Три
Оказывается длинные опусы нужно разбивать. А я то думал «многосерийные» топики публикуют исключительно для зарабатывания рейтинга :-)
Продолжу с места в карьер, так как где разбилось — там разбилось, а писать дополнительные введения к каждой серии выше моих сил.
Немного о том, как страницы попадают из рабочих наборов в эти самые списки.
Попадают разными способами. Один уже рассмотрен: кто-то явно вызвал EmptyWorkingSet для процесса. Это происходит нечасто. Обычно же это случается при помощи так называемого тримминга (trimming).
Когда система приближается к одному из установленных лимитов на свободную память, она начинает эту память освобождать. Во первых система находит процессы, максимально превысившие свой лимит на размер рабочего набора. Для этих процессов запускается процесс «старения» страниц (aging), для определения какие из страниц меньше всего используются. После этого, самые старые страницы «подрезаются» в standby или modified список.
Из той же лекции:
На диаграмме видно еще Delete page, которая происходит когда приложение просто освобождает выделенную память — с содержимым этих страниц попросту уже ничего нельзя делать, потому как по всем правилом оно не валидно и даже если новая память будет выделена по тому же адресу — это должна быть новая память.
Pagefile
Наконец-то я добрался до всеми любимого своп-файла. Драконы здесь водятся просто табунами. Ну что ж, попробуем их вывести.
Миф: Для повышения производительности нужно уменьшать количество обращений к пейджфайлу.
На самом деле: Для повышения производительности нужно уменьшать количество обращений К ДИСКУ. Пейджфайл является почти таким же файлом как и остальные.
Миф: Винда использует пейджфайл, даже если свободной памяти еще завались.
На самом деле: В пейджфайл страница может попасть только из modified списка. В modified список — при подрезке редко используемых страниц у разросшихся приложений. После того, как страница сброшена, она остается в standby списке и перечитываться не будет. Память никогда не берется из standby списка, если еще есть free или zeroed (то есть кешированные данные никогда не выбрасываются, если еще есть страницы вообще без данных). Standby список имеет 8 уровней приоритета (которыми до некоторой степени может управлять как само приложение, так и Superfetch, осуществляющий динамическое управление приоритетами страниц на основе анализа реального использования файлов/страниц), если не остается вообще никакого выбора — винда первым делом выбрасывает кеш самого низкого приоритета.
Вот пример получасовой работы в обычном режиме:
Прошу отметить, что файлы отсортированы по названию и между kernel.etl и «Program Files» должен был бы быть pagefile.sys.
Миф: Но винда сама признается, что использует пейджфайл.
На самом деле: Рассмотрено выше. Чаще всего речь идет о Commit Charge, который можно назвать «использованием», но совершенно не в том, смысле в котором это обычно принято понимать. В большинстве случаев при отсутсвии необходимости, приватные страницы (подлежащие сбросу в пейджфайл) будут сидеть в modified списке (даже если попадут туда) практически неограниченно долго.
Миф: Отключение пейджфайла улучшает производительность системы.
На самом деле: В редких случаях, приложение, которое злоупотребляет памятью и не понижает приоритет страниц для своих потоков может привести к понижению отзывчивости, однако в подавляющем большинстве случаев производительность только повышается за счет выгрузки неиспользуемого «хлама» в чулан и использовании освободившегося места для хранения более актуальных данных (тем самым снижая общее количество обращений к диску).
Приоритеты памяти и ввода/вывода
Чем ниже I/O приоритет потока, выполняющего запись/чтение, тем меньше он мешает нормальной работе (в целом, как и случае с приоритетами потоков используется round robin алгоритм для операций, ожидающих с наивысшим приоритетом, при этом небольшая часть пропускной способности отдается операциям с низким приоритетом в целях борьбы со starvation — на русский переводится не совсем адекватно). Запустите встроенный дефрагментатор. Resource Monitor покажет 100% загрузку диска, однако система при этом если и теряет в отзывчивости, то на глаз я этого заметить не могу.
Про приоритеты памяти я уже упоминал. Независимо от i/o приоритета, существует page приоритет (Page Priority). Каждая физическая страница в системе (а если точнее, то данные, которые она содержит в каждый момент времени) имеет приоритет. Когда страница перемещается в Standby list она попадает в один из восьми отдельных списков, соответствующий ее приоритету. Данные с более высоким приоритетом не могут быть замещены данными с более низким.
Prefetch и Superfetch
Prefetch появился в XP и является способом ускорить запуск приложений. Вот утилита, позволяющая просмотреть содержимое pf файлов. Собственно говоря там находятся имена и смещения файлов, к которым соответствующее приложение обращается в первые несколько (кажется 10) секунд после запуска. Так как запуск зачастую сопровождается бешенным чтением данных с диска, то упорядочивание этих чтений уменьшает количество head seek-ов и тем самым ускоряет запуск. Работает из службы SysMain. Помимо префетча и суперфетча этот сервис отвечает еще за ReadyBoot (который помогал ускорять загрузку в одном из предыдущих постов), ReadyBoost (штука довольно бесполезная на системах с большим количеством ОЗУ, но очень полезная на low-end системах) и ReadyDrive (это такой ReadyBoost, но с гарантией, что «флешка» не будет выниматься между перезагрузками — позволяет сильно ускорить основные операции не прибегая к полной замене HDD на SSD — используя так называемые гибридные или H-HDD: скорость SSD по цене HDD).
С суперфетчем все несколько сложнее. Мало кто понимает его назначение, но каждый норовит обвинить этот сервис в использовании памяти во время Idle и в чтении «чего то» с диска. Для начала чтение:
Осуществляется с background приоритетом и практически незаметно при использовании. Если раздражает мигание светодиода — его можно заклеить изолентой. Более того, это чтение загружает кеш нужными данными (можно посмотреть на увеличение standby после загрузки/просыпания даже при том, что пользователь не делает никаких активных операций с диском). Эти данные загруженные сейчас с низким приоритетом и с хорошим упорядочением, потом сохранят несколько секунд и бешенное перемещение головок при старте какого нибудь приложения. Речь идет чаще всего о загрузке данных на 6-7 уровни приоритетов (да, I/O операции с низким приоритетом используются для загрузки страниц в Standby списки высоких уровней), которые могут быть вытеснены только в самом крайнем случае, когда памяти не хватает уже ни на что.
Память этот сервис использует для хранения истории обращений к диску/страницам памяти. Периодически (в Idle) он выделяет больше для того, чтобы произвести анализ этих данных и построить долгосрочный план действий (а также бутплан на следующую загрузку). Кроме того, он производит динамическое перераспределение приоритетов страниц. Вот например, что происходит на моей домашней машине, на которой я частенько пользуюсь дотнетом (в виде powershell):
Там в списке предствлены страницы с приоритетами от 1 до 6 (7 — это специальный приоритет, который никогда не меняется). А вот свежеустановленная виртуальная машина, на которой powershell был запущен раз в жизни за несколько секунд до этого:
Суперфетч еще не знает, что делать с этим файлом, поэтому все страницы попали на уровнь, соответствующий приоритету потока, который загружал данный файл. А вот так выглядит кеш того же файла на той же виртуалке после нескольких часов бездействия (просто свернутое в таскбаре окно):
Видно, что все страницы понизили свой приоритет.
Копирование больших файлов
Здесь все просто. Запускаем копирование исошника. Видим, что копирование производится с нормальным I/O приоритетом:
Page priority потока я не сохранил, но могу с большой долей уверенности сказать, что там тоже «норма» — то есть 5. Значит ли это, что копирование файлов рано или поздно повыкидывает из кеша всех остальных? Проверим:
Все закешировалось с приоритетом 2 даже несмотря на то, что чтение осуществлялось с приоритетом 5. В чем же дело? А вот в чем:
Для операций копирования используется флаг FILE_FLAG_SEQUENTIAL_SCAN, который приводит к понижению приоритета кеша по сравнению с базовым, к использованию только одного VACB для кеширования и к более агрессивному read-ahead-у.
Читайте также: