Составители:
CreateFileMapping() необходимо передать в качестве параметра не описатель ранее от-
крытого файла, а -1. В этом случае необходимо задать размеры выделяемой области.
Кроме того, в параметре lpName можно задать имя объекта, которое является глобаль-
ным в системе. Если это имя задается в системе впервые, то процессу выделяется новая
область данных, а если имя было уже задано, то именованная область данных предос-
тавляется для совместного использования.
Если один процесс меняет разделяемую область данных, то она меняется и для
другого процесса. Операционная система обеспечивает когерентность разделяемой об-
ласти данных для всех процессов. Но для обеспечения когерентности процессы должны
работать с одним объектом “проецируемый файл”, а не с одним файлом.
4.4.3. API-функции для работы с динамической областью памяти
Динамическая область памяти, или куча (heap), представляет собой блок памяти,
из которого программа при необходимости выделяет себе более мелкие фрагменты. 16-
разрядные Windows-программы выделяют память как из глобальной, так и из локальной
динамической области. Последняя работает быстрее, но ее объем ограничен 64 Кб.
Современные ОС семейства Windows со своим плоским адресным пространством
аннулирует разницу между понятиями глобальный и локальный, а также дальний и
ближний, превращая всю память в одну нераздельную динамическую область.
Даже при наличии большого непрерывного адресного пространства иногда целесо-
образно работать с динамической областью памяти меньшего размера. Резервирование и
закрепление виртуальной памяти имеет очевидные преимущества при работе с больши-
ми динамическими или разреженными структурами. А как быть с алгоритмами, которые
предполагают выделение большого количества мелких блоков памяти? Команды для ра-
боты с динамической областью памяти позволяют создавать в адресном пространстве
программы одну или несколько локальных куч и выделять из них более мелкие блоки
памяти.
Команды для работы с динамической областью памяти удобны тем, что позволяют
сосредоточить выделенные блоки в небольшом диапазоне адресного пространства.
Группировка выделенных блоков выполняется по следующим причинам [12].
• Она позволяет отделить и защитить группу связанных блоков. Программа, создаю-
щая большое количество маленьких блоков одинакового размера, гораздо эффектив-
нее упаковывает память, если блоки следуют последовательно.
• Если все узлы связанного списка находятся в одной куче, а узлы двоичного дерева -
в другой, ошибка одного алгоритма в меньшей степени скажется на работе другого
алгоритма.
• Объекты памяти, работающие совместно, могут быть сгруппированы, что сводит к
минимуму подкачку страниц. Несколько адресов, оказавшихся на одной странице
памяти, можно прочитать с помощью одной дисковой операции.
Для получения дескриптора кучи "по умолчанию" используется функция:
HANDLE GetProcessHeap( VOID );
Используя возвращаемый этой функцией дескриптор можно осуществлять работу с
кучей.
Память, выделяемая из кучи, ничем не отличается от любой другой памяти. Вы
можете самостоятельно организовать работу с кучей, прибегнув к командам управления
виртуальной памятью, ведь именно так поступает Windows. Для создания кучи нужно
задать ее начальный и максимальный размеры:
119
CreateFileMapping() необходимо передать в качестве параметра не описатель ранее от-
крытого файла, а -1. В этом случае необходимо задать размеры выделяемой области.
Кроме того, в параметре lpName можно задать имя объекта, которое является глобаль-
ным в системе. Если это имя задается в системе впервые, то процессу выделяется новая
область данных, а если имя было уже задано, то именованная область данных предос-
тавляется для совместного использования.
Если один процесс меняет разделяемую область данных, то она меняется и для
другого процесса. Операционная система обеспечивает когерентность разделяемой об-
ласти данных для всех процессов. Но для обеспечения когерентности процессы должны
работать с одним объектом “проецируемый файл”, а не с одним файлом.
4.4.3. API-функции для работы с динамической областью памяти
Динамическая область памяти, или куча (heap), представляет собой блок памяти,
из которого программа при необходимости выделяет себе более мелкие фрагменты. 16-
разрядные Windows-программы выделяют память как из глобальной, так и из локальной
динамической области. Последняя работает быстрее, но ее объем ограничен 64 Кб.
Современные ОС семейства Windows со своим плоским адресным пространством
аннулирует разницу между понятиями глобальный и локальный, а также дальний и
ближний, превращая всю память в одну нераздельную динамическую область.
Даже при наличии большого непрерывного адресного пространства иногда целесо-
образно работать с динамической областью памяти меньшего размера. Резервирование и
закрепление виртуальной памяти имеет очевидные преимущества при работе с больши-
ми динамическими или разреженными структурами. А как быть с алгоритмами, которые
предполагают выделение большого количества мелких блоков памяти? Команды для ра-
боты с динамической областью памяти позволяют создавать в адресном пространстве
программы одну или несколько локальных куч и выделять из них более мелкие блоки
памяти.
Команды для работы с динамической областью памяти удобны тем, что позволяют
сосредоточить выделенные блоки в небольшом диапазоне адресного пространства.
Группировка выделенных блоков выполняется по следующим причинам [12].
• Она позволяет отделить и защитить группу связанных блоков. Программа, создаю-
щая большое количество маленьких блоков одинакового размера, гораздо эффектив-
нее упаковывает память, если блоки следуют последовательно.
• Если все узлы связанного списка находятся в одной куче, а узлы двоичного дерева -
в другой, ошибка одного алгоритма в меньшей степени скажется на работе другого
алгоритма.
• Объекты памяти, работающие совместно, могут быть сгруппированы, что сводит к
минимуму подкачку страниц. Несколько адресов, оказавшихся на одной странице
памяти, можно прочитать с помощью одной дисковой операции.
Для получения дескриптора кучи "по умолчанию" используется функция:
HANDLE GetProcessHeap( VOID );
Используя возвращаемый этой функцией дескриптор можно осуществлять работу с
кучей.
Память, выделяемая из кучи, ничем не отличается от любой другой памяти. Вы
можете самостоятельно организовать работу с кучей, прибегнув к командам управления
виртуальной памятью, ведь именно так поступает Windows. Для создания кучи нужно
задать ее начальный и максимальный размеры:
119
Страницы
- « первая
- ‹ предыдущая
- …
- 115
- 116
- 117
- 118
- 119
- …
- следующая ›
- последняя »
