- •39. Адресний простір процесу.
- •40. Керування віртуальною пам'ятю. Vmm.
- •41. Архітектура інтерфейсів (api) управління пам'ятю.
- •42. Работа програм з віртуальною пам'ятью.
- •43.Файли, що відображаються в пам'ять
- •45. Визначення вікна. Компоненти та параметри вікон.
- •46. Ієрархія вікон.
- •47. Стилі вікон.
- •49. Обмін даними між процесами.
- •48. Повідомлення та черги повідомлень.
- •50. Синхронізація потоків.
- •51 Общий план обработки исключений.
- •52 Обработчики завершения. Локальная и глобальная раскрутка.
- •53 Фильтры и обработчики исключений.
- •54 Общая структура системного реестра.
- •55 Системный реестр Windows’95 имеет следующую структуру:
- •56 Работа приложений с системным реестром.
- •57. Файлові структури.
- •58. Робота з томами та каталогами.
- •59. Синхронна робота з файлами.
- •60. Асинхронна робота з файлами.
- •61. Файлова структура ntfs
- •62Система безопасности windows nt
43.Файли, що відображаються в пам'ять
В порівнянні з доступом до пам'яті, традиційний доступ до файлів виглядає заплутаним і незручним. З цієї причини деякі ОС, починаючи з MULTICS, забезпечують відображення файлів в адресний простір виконуваного процесу. Це виражається в появі двох нових системних викликів: MAP (відобразити) і UNMAP (відмінити відображення). Перший виклик передає операційній системі як параметри ім'я файлу і віртуальна адреса, і операційна система відображає вказаний файл у віртуальний адресний простір за вказаною адресою.
Припустимо, наприклад, що файл f має довжину 64 До і відображається на область віртуального адресного простору з початковою адресою 512 К. После цього будь-яка машинна команда, яка читає вміст байта за адресою 512 До, отримує 0-ою байт цього файлу і так далі Очевидно, що запис за адресою 512 До + 1100 змінює 1100 байт файлу. При завершенні процесу на диску залишається модифікована версія файлу, неначебто він був змінений комбінацією викликів SEEK і WRITE.
Насправді при відображенні файлу внутрішні системні таблиці змінюються так, щоб даний файл служив сховищем сторінок віртуальної пам'яті на диску. Таким чином, читання за адресою 512 До викликає сторінкову відмову, внаслідок чого сторінка 0 переноситься у фізичну пам'ять. Аналогічно, запис за адресою 512 До + 1100 викликає сторінкову відмову, в результаті якої сторінка, що містить цю адресу, переміщається в пам'ять, після чого здійснюється запис в пам'ять за необхідною адресою. Якщо ця сторінка витісняється з пам'яті алгоритмом заміни сторінок, то вона записується назад у файл у відповідне його місце. При завершенні процесу всі відображені і модифіковані сторінки переписуються з пам'яті у файл.
Відображення файлів краще всього працює в системі, яка підтримує сегментацію. У такій системі кожен файл може бути відображений в свій власний сегмент, так що к-ый байт у файлі є к-ымбайтом сегменту. На малюнку 2.38,а зображений процес, який має два сегменти-коди і даних. Припустимо, що цей процес копіює файли. Для цього він спочатку відображає файл-джерело, наприклад, abc. Потім він створює порожній сегмент і відображає на нього файл призначення, наприклад, файл ddd.
З цієї миті процес може копіювати сегмент-джерело в сегмент-приймач за допомогою звичайного програмного циклу, що використовує команди пересилки в пам'яті типу mov. Ніякі викликиREAD або WRITE не потрібні. Після виконання копіювання процес може виконати виклик UNMAP для видалення файлу з адресного простору, а потім завершитися. Вихідний файл ddd існуватиме на диску, неначебто він був створений звичайним способом.
Хоча відображення файлів виключає потреба у виконанні введення-виводу і тим самим полегшує програмування, цей спосіб породжує і деякі нові проблеми. По-перше, для системи складно дізнатися точну довжину вихідного файлу, в даному прикладі ddd. Простіше вказати найбільший номер записаної сторінки, але немає способу дізнатися, скільки байт в цій сторінці було записано. Припустимо, що програма використовує тільки сторінку номер 0, і після виконання всі байти все ще встановлені в значення 0 (їх початкове значення). Мабуть, файл складається з 10 нулів. А може бути, він складається з 100 нулів. Як це визначити? Операційна система не може це повідомити. Все, що вона може зробити, так це створити файл, довжина якого дорівнює розміру сторінки.
Мал. 2.38. (а) Сегменти процесу перед відображенням файлів в адресний простір; (б) Процес після відображення існуючого файлу abc в один сегмент і створення нового сегменту для файлу ddd
Друга проблема виявляється (потенційно), якщо один процес відображає файл, а інший процес відкриває його для звичайного файлового доступу. Якщо перший процес змінює сторінку, то ця зміна не буде відбита у файлі на диску до тих пір, поки сторінка не буде витиснена на диск. Підтримка узгодженості даних файлу для цих двох процесів вимагає від системи великих турбот.
Третя проблема полягає в тому, що файл може бути більше, ніж сегмент, і навіть більше, ніж весь віртуальний адресний простір. Єдиний спосіб її рішення полягає в реалізації виклику MAP так, щоб він міг відображати не весь файл, а його частину. Хоча така робота, очевидно, менш зручна, чим відображення цілого файлу. 44. Купи. Використання переповнення в купі
Переповнення буфера в купі використовується відмінно від переповнення в стеку. Пам'ять в купі динамічно розподіляється застосунком під час виконання і, зазвичай, містить дані програми. Використання відбувається через пошкодження даних особливим чином, що призводить до перезапису внутрішніх структур даних, таких як зв'язний список вказівників.
Кучи и менеджеры куч
Серьезные приложения интенсивно используют механизмы выделения и освобождения памяти. В коммерческих приложениях широко применяются такие элементы, как: динамические массивы, строки, объекты и многое другое. При этом, создание и удаление подобных элементов происходит довольно часто, а сами элементы имеют относительно небольшой размер.
Такая работа по выделению памяти и ее освобождению, по отношению к элементам небольшого размера, является неэффективной. Во-первых, снижается производительность, т. к. резервирование адресного пространства и выделение страниц памяти происходит на уровне ядра операционной системы. Во-вторых, теряются большие объемы памяти. Например, если приложение требует выделить 256 байт под строку, операционная система реально выделяет одну страницу памяти, объемом 4 или 8 килобайт (в зависимости от операционной системы).
Для решения проблемы выделения памяти небольшим элементам приложения была введена организация по принципу кучи (heap). Куча - это достаточно большой непрерывный участок памяти, из которого выделяются небольшие блоки. Для того чтобы куча могла функционировать, в операционную систему был включен так называемый менеджер кучи. Менеджер кучи - это специальный механизм, который следит за выделением и освобождением блоков памяти. Для каждого вновь созданного процесса Windows по умолчанию создает кучу. Все кучи, которые создаются операционной системой, являются потокобезопасными. Следовательно, у программиста есть возможность обращаться к одной куче из разных потоков одновременно. Для работы с менеджером кучи Win32 API можно пользоваться следующими функциями
|
|
|
|
|
Функция |
Назначение |
|
|
HeapCreate |
Резервирует непрерывный блок памяти в виртуальном адресном пространстве процесса, т. е. создает кучу |
|
|
HeapAlloc |
Выделяет блок неперемещаемой памяти в куче |
|
|
HeapReAlloc |
Служит для изменения размера блока памяти, выделенного функцией HeapAlloc |
|
|
HeapFree |
Освобождает блок памяти, выделенной функцией HeapAlloc |
|
|
HeapDestroy |
Уничтожает кучу, созданную с помощью функции HeapCreate |
|
|
VirtualAlloc |
Резервирует или размещает страницы в виртуальной памяти процесса |
|
|
VirtualFree |
Освобождает страницы в виртуальной памяти процесса |
|
|
VirtualLock |
Защищает диапазон адресов от переноса в страницу памяти |
|
|
VirtualUnlock |
Снимает защиту, установленную функцией VirtualLock |
|
|
VirtualQuery |
Выдает информацию о диапазоне страниц в виртуальной памяти процесса, вызвавшего данную функцию |
|
|
VirtualQusryEx |
То же, что И VirtualQuery, только для определенного процесса |
|
|
VirtualProtect |
Изменяет права доступа к определенному диапазону памяти в адресном пространстве процесса, вызвавшего данную функцию |
|
|
VirtualProtectEx |
То же, что и VirtualProtect, только для определенного процесса |
|
Кроме перечисленных в табл. 1.10, существуют еще функции LocalAlloc (GlobalAlloc) и LocalFree (GlobalFree). Вы можете использовать любое на-писание функций, т. к. в Win32 нет разделения на глобальные и локальные кучи. Данные функции применяются, в основном, при работе с буфером обмена Windows. Эти функции являются устаревшими и не рекомендуются к использованию.
Кроме стандартного менеджера кучи, который предлагает Microsoft, создателями Delphi был предложен свой менеджер кучи, который поставляется вместе с Delphi. Менеджер кучи Delphi резервирует блоки виртуальной памяти размером 1 Мбайт. Размер выделяемых Delphi блоков реальной памяти - 16 Кбайт. При работе с менеджером куч Delphi можно использовать следующие функции:
- New, Dispose - применяются для выделения и освобождения памяти. Используются для динамической работы с элементами приложения;
- GetMem, FreeMem - также применяются для выделения и освобождения памяти. Используются для динамической работы с небольшими двоичными блоками памяти (блоки, буферы и т. п.).
Кроме вышеперечисленных менеджеров куч, программисту предоставлена возможность создания собственного менеджера. .
