регіон купа
Купа (heap) - зарезервований регіон розміром в одну і більше сторінок, який рекомендується використовувати для зберігання безлічі невеликих порцій даних. На відміну від функції VirtualAlloc правила гранулярності виділення пам'яті при цьому дотримуватися не обов'язково.
Передачею пам'яті купах, а також урахуванням вільної та використаної пам'яті в купі займається спеціальний диспетчер куп (heap manager). Ця діяльність не документована.
Стандартна купа процесу розміром 1 Мб (цю величину можна змінити) резервується в момент створення процесу. Зазвичай купа динамічно змінює свій розмір (прапор growable). Стандартну купу процесу використовують не тільки додатки, але і деякі Win32-функції. Для використання стандартної купи необхідно отримати її описувач за допомогою функції GetProcessHeap.
При бажанні процес може створити додаткові купи за допомогою функції HeapCreate (зворотна операція HeapDestroy). Прикладна програма виділяє пам'ять в купі з допомогою функції HeapAlloc. а звільняє за допомогою HeapFree.
Оскільки купами можуть користуватися всі потоки процесу, за замовчуванням організовується синхронізація (прапор SERIALIZE), яку, хоча це і не рекомендується, для підвищення швидкодії можна скасувати. Завдання синхронізації доступу потоків до купи можна також вирішити, створюючи кожному потоку свою власну купу.
Прогін програми виділення пам'яті в стандартній купі
У наведеній програмі відбувається виділення масиву пам'яті в стандартній купі процесу. Далі туди записується текстова рядок, яка потім виводиться на екран. Якщо виникає ситуація виходу за межі виділеної пам'яті, яку легко змоделювати, збільшуючи значення параметра Shift. - виникає помилка виконання.
В якості самостійного вправи можна рекомендувати спостереження за нарощуванням обсягу переданої в купі пам'яті за допомогою лічильників продуктивності. Обсяг віртуальної пам'яті процесу повинен почати рости в разі виходу за межі початкового розміру купи (1 Мб) і при утворенні додаткових куп.
Регіон стека потоку. сторожові сторінки
При створенні потоку для його стека резервується регіон розміром 1 Мб (за замовчуванням), і йому передається 2 сторінки пам'яті (ці параметри можуть бути змінені). Нижня сторінка є сторожовий. Як тільки верхня сторінка виявилася заповненою і відбулося звернення до нижньої сторінці, це помічається системою і регіону передається ще одна сторінка, тепер уже вона стає сторожовий. Внаслідок такої тактики сама нижня передана регіону стека сторінка завжди залишається сторожовий і її завдання - просигналізувати системі про те, що обсяг переданої стеку пам'яті потрібно збільшити.
Прогін програми, що моделює звернення до сторожовим сторінок
У наведеній програмі відбувається передача пам'яті регіону і установка прапора PAGE_GUARD для його сторінок. Крім того, використовується структурна обробка винятків. У разі спроби записи текстового рядка на сторожову сторінку (в блоці try) виникає виняткова ситуація exception 0x80000001. При повторній спробі запису на цю сторінку (блок except) подібна ситуація вже не виникає.
Написання, компіляція і прогін програми, що моделює зростання стека за допомогою механізму сторожових сторінок
В якості самостійного вправи рекомендується написати програму, в якій сторожова сторінка весь час знаходиться на кордоні фрагмента переданої пам'яті. У разі звернення до сторожової сторінці обсяг переданої процесу пам'яті потрібно збільшити, а сторожову сторінку перемістити.
Регіон файлу, що відображається в пам'ять
Техніка файлів, що проектуються в пам'ять (див. Рис. 9.4), активно використовується новітніми ОС. Вона дозволяє користувачеві вирішувати такі завдання, як робота з даними файлу за допомогою операцій копіювання і переміщення байтів в пам'яті або організація спільного доступу до областям пам'яті. Цей механізм також активно використовується самою операційною системою, наприклад, для завантаження в пам'ять модулів, що виконуються, динамічних бібліотек і відображення файлу в буфер кешу для здійснення операцій стандартного вводу-виводу.
Для відображення файлу в пам'ять використовується функція CreateFileMapping. а для отримання покажчика на відображену область - функція MapViewOfFile. Успішне виконання обох операцій дозволяє прикладній програмі працювати з цією областю як з будь-яким іншим фрагментом виділеної пам'яті, зокрема, змінювати її вміст. У зв'язку з цим виникає проблема відповідності (когерентності) вмісту регіону і файлу на диску. Операційна система намагається забезпечити когерентність, проте в розпорядженні користувача є можливість в будь-який момент скинути вміст пам'яті на диск за допомогою функції FlushViewOfFile.
Прогін програми, яка демонструє відображення файлу в пам'ять
Наведена програма демонструє етапи створення файлу, проектування його в пам'ять, зміни його вмісту і відображення на диск.
Написання, компіляція і прогін програми, яка демонструє різні аспекти проектування файлу в пам'ять
На основі попередньої програми рекомендується написати програму відображення файлу в пам'ять з проміжною вивантаженням файлу на диск за допомогою функції FlushViewOfFile. Розгляньте різні варіанти існування файлу і його розмірів до і після відображення.
Рішення завдання спільного доступу до пам'яті буде приведено нижче.