- •Операционные системы Windows32
- •Объекты ядра Windows
- •Пользователи объектов ядра
- •Защита объектов ядра
- •Дескрипторы. Таблица дескрипторов объектов ядра.
- •Создание объектов ядра
- •Закрытие объектов ядра
- •Совместное использование объектов ядра различными процессами
- •Процессы и потоки в Windows Создание процесса
- •Завершение процесса
- •Операции с процессами
- •Создание потока
- •Завершение потока
- •Потоки и библиотека языка с
- •Операции с потоками
- •Приоритеты потоков в Windows
- •Потоки в мультипроцессорных системах
- •Синхронизация потоков
- •Interlocked-функции
- •Критические секции
- •Wait-функции
- •Wait-функции для работы с одним объектом
- •Wait-функции для работы с несколькими объектами.
- •Побочные эффекты ожидания.
- •События
- •Семафоры
- •Мьютексы
- •Ожидаемые таймеры
- •Управление памятью в Windows
- •Организация виртуальной памяти Windows
- •Выделение памяти процессу
- •Атрибуты защиты страниц памяти
- •Функции менеджера памяти Windows
- •Проецируемые в память файлы
- •Проекции файлов и разделяемая память
Управление памятью в Windows
32-х битные операционные системы Windows предоставляют каждому процессу виртуальное адресное пространство размером 4Гб (232=4294967296 байт). Адресное пространство каждого процесса закрыто, и один процесс не может обратиться к памяти другого процесса.
Организация виртуальной памяти Windows
Адресное пространство процесса разбивается на разделы, каждый из которых имеет свое назначение. Распределение разделов зависит от ядра операционной системы Windows. Распределение памяти в операционных системах Windows 98 и Windows 2000 показано в таблице:
Раздел |
Windows 98 |
Windows 2000 |
Для выявления нулевых указателей |
0x00000000 0x00000FFF |
0x00000000 0x0000FFFF |
Для совместимости с программами DOS и 16-разрядной Windows |
0x00001000 0x003FFFFF |
Нет |
Для кода данных и пользовательского режима |
0x00400000 0x7FFFFFFF |
0x00010000 0x7FFFFFFF |
Закрытый, размером 64 Кб |
нет
|
0x7FFF0000 0x7FFFFFFF |
Для общих проецируемых в память файлов |
0x80000000 0xBFFFFFFF |
Нет |
Для кода данных и режима ядра |
0xC0000000 0xFFFFFFFF |
0x80000000 0xFFFFFFFF |
Рис. Организация адресного пространства процесса в Windows.
Попытка обращения по нулевому указателю является одной из самых распространенных ошибок при работе с памятью. Для выявления таких ошибок адресное пространство начинается со специального раздела, любое обращение к которому вызывает ошибку доступа к памяти.
Так как в Windows 98 все процессы работают в одном адресном пространстве, то первые 4 МБ адресного пространства резервируются для 16-ти битных программ Windows 3x и DOS. Поскольку в Windows 2000 каждый процесс работает в собственном адресном пространстве, такой регион там не требуется.
Следующий раздел памяти используется для размещения кода и данных программ. В Windows 2000 в этот раздел загружаются все выполняемые файлы и динамически загружаемые библиотеки, а также проецируемые в память файлы, используемые приложением.
В Windows 98 в этом разделе располагается только код и данные пользовательских программ и библиотек. Системные библиотеки и все проецируемые в память файлы располагаются в отдельном разделе.
После раздела пользовательского кода и данных в Windows 2000 располагается закрытый для доступа раздел размером 64 КБ который используется для упрощения выявления попыток обращений к памяти, используемой операционной системой.
В последний раздел виртуальной памяти отображаются код и данные операционной системы, включая код ядра, драйвера устройств, области ввода-вывода, таблицы страниц.
Выделение памяти процессу
Адресное пространство процесса в момент его создания практически все свободно (не зарезервировано). Для того, чтобы процесс смог использовать память, ему необходимо запросить ее у операционной системы. Операция выделения региона виртуальной памяти процессу называется резервированием (reserving). При резервировании памяти начало региона выравнивается с учетом гранулярности выделения памяти операционной системой. Для рассматриваемых операционных систем она составляет 64 килобайта.
Резервирование региона памяти еще не означает, что его можно использовать. Для завершения получения памяти необходимо запросить у операционной системы выделение физической памяти для зарезервированных адресов. Такая операция называется передачей физической памяти (committing physical storage). При этом мы можем запросить передать физическую память не всему региону, а отдельным его частям. Передача физической памяти производятся страницами, размер которых составляет 4 килобайта.
Такая двухступенчатая схема позволяет экономить оперативную память. Процесс может зарезервировать большой регион адресного пространства, а затем, по мере необходимости, выделять оперативную память. Предварительное резервирование виртуального пространства позволяет гарантировать неразрывность используемой области памяти - это пространство не может быть использовано при последующих запросах на выделение памяти. А постепенное выделение физической памяти позволит использовать ровно столько физической памяти, сколько необходимо в каждый конкретный момент. Эта схема удобна для организации хранения разряженных матриц или
Освобождение памяти тоже проходит в два этапа: во-первых, мы можем освободить физическую память, не отменяя резервирования региона. Такая операция называется возврат физической памяти (decommitting physical storage). Во-вторых, мы можем отменить резервирование – это операция освобождения (releasing) региона.