Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
практична робота 7.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
253 Кб
Скачать
☆

Поняття про файли, що відображаються в пам'ять (memory mapped файлах). Системні виклики mmap(), munmap()

Як вже мовилося, за допомогою системного виклику open() операційна система відображає файл з простору імен в дисковий простір файлової системи, готуючи грунт для здійснення інших операцій. З появою концепції віртуальної пам'яті, яка розглядалася в лекції 9, коли фізичні розміри пам'яті перестали грати роль стримуючого чинника в розвитку обчислювальних систем, стало можливим відображати файли безпосередньо в адресний простір процесів. Іншими словами, з'явилася можливість працювати з файлами як із звичайною пам'яттю, замінивши виконання базових операцій над ними за допомогою системних викликів на використовування операцій звичайних мов програмування. Файли, чий вміст відображається безпосередньо в адресний простір процесів, одержали назву файлів, що відображаються в пам'ять, або, по-англійськи, memory mapped файлів (див. лекцію 10). Треба відзначити, що таке відображення може бути здійснено не тільки для всього файлу в цілому, але і для його частини.

З погляду програміста робота з такими файлами виглядає таким чином:

  • Відображення файлу з простору імен в адресний простір процесу відбувається в два етапи: спочатку виконується відображення в дисковий простір, а вже потім з дискового простору на адресний. Тому спочатку файл необхідно відкрити, використовуючи звичайний системний виклик open().

  • Другим етапом є відображення файлу цілком або часткове з дискового простору в адресний простір процесу. Для цього використовується системний виклик mmap(). Файл після цього можна і закрити, виконавши системний виклик close(), оскільки необхідну інформацію про той, що розташовує файлу на диску ми вже зберегли в інших структурах даних при виклику mmap().

Системний виклик mmap()

#include <sys/types.h>

#include <unistd.h>

#include <sys/mman.h>

void *mmap (void *start, size_t length

int prot, int flags, int fd

off_t offset);

Опис системного виклику

Системний виклик mmap служить для відображення заздалегідь відкритого файлу (наприклад, за допомогою системного виклику open()) в адресний простір обчислювальної системи. Після його виконання файл може бути закритий (наприклад, системним викликом close()), що ніяк не вплине на подальшу роботу з відображеним файлом.

Справжній опис не є повним описом системного виклику, а призначено тільки для використовування в рамках даного курсу. Для отримання повної інформації звертайтеся до UNIX Manual.

Параметр fd є файловим дескриптором для файлу, який ми хочемо відобразити в адресний простір (тобто значенням, яке повернув системний виклик open()).

ненульове значення параметра start може використовуватися тільки дуже кваліфікованими системними програмістами, тому ми в семінарах завжди вважатимемо його рівним значенню NULL, дозволяючи операційній системі самої вибрати початок області адресного простору, в яку буде відображений файл.

В пам'ять відображатиметься частина файлу, починаючи з позицією усередині нього, заданою значенням параметра offset – зсув від початку файлу в байтах, і завдовжки, рівної значенню параметра length (природно, теж в байтах). Значення параметра length може і перевищувати реальну довжину від позиції offset до кінця існуючого файлу. На поведінці системного виклику це ніяк не відобразиться, але надалі при спробі доступу до елементів пам'яті, що лежать зовні меж реального файлу, виникне сигнал SIGBUS (реакція на нього за умовчанням – припинення процесу з утворенням core файлу).

Параметр flags визначає спосіб відображення файлу в адресний простір. В рамках нашого курсу ми використовуватимемо тільки два його можливі значення: MAP_SHARED і MAP_PRIVATE. Якщо як його значення вибране MAP_SHARED, то одержане відображення файлу згодом використовуватиметься і іншими процесами, mmap, що викликали, для цього файлу з аналогічними значеннями параметрів, а всі зміни, зроблені у відображеному файлі, будуть збережені у вторинній пам'яті. Якщо як значення параметра flags вказане MAP_PRIVATE, то процес одержує відображення файлу в своє монопольне розпорядження, але всі зміни в ньому не можуть бути занесені у вторинну пам'ять (тобто, простіше кажучи, не збережуться).

Параметр prot визначає дозволені операції над областю пам'яті, в яку буде відображений файл. Як його значення ми використовуватимемо значення PROT_READ (дозволено читання), PROT_WRITE (дозволений запис) або їх комбінацію через операцію "побітове або" – "|". Необхідно відзначити дві істотні особливості системного виклику, пов'язані з цим параметром:

  1. Значення параметра prot не може бути ширше, ніж операції над файлом, заявлені при його відкритті в параметрі flags системного виклику open(). Наприклад, не можна відкрити файл тільки для читання, а при його відображенні в пам'ять використовувати значення prot = PROT_READ | PROT_WRITE.

  2. В результаті помилки в операційній системі Linux при роботі на 486-х і 586-х процесорах спроба записати у відображення файлу, відкрите тільки для запису, більш 32-х байт одночасно приводить до помилки (виникає сигнал про порушення захисту пам'яті).

Значення, що повертається

При нормальному завершенні системний виклик повертає початкову адресу області пам'яті, в яку відображений файл (або його частина), при виникненні помилки – спеціальне значення MAP_FAILED.

  • Після цього з вмістом файлу можна працювати, як з вмістом звичайної області пам'яті.

  • Після закінчення роботи з вмістом файлу, необхідно звільнити додатково виділену процесу область пам'яті, заздалегідь синхронізувавши вміст файлу на диску з вмістом цієї області (якщо, звичайно, необхідно). Ці дії виконує системний виклик munmap().

Системний виклик munmap

#include <sys/types.h>

#include <unistd.h>

#include <sys/mman.h>

int munmap (void *start, size_t length);

Опис системного виклику

Системний виклик munmap служить для припинення відображення memory mapped файлу в адресний простір обчислювальної системи. Якщо при системному виклику mmap() було задано значення параметра flags, рівне MAP_SHARED, і у відображенні файлу була дозволена операція запису (в параметрі prot використовувалося значення PROT_WRITE), то munmap синхронізує вміст відображення з вмістом файлу у вторинній пам'яті. Після його виконання області пам'яті, що використалися для відображення файлу, стають неприступні поточному процесу.

Параметр start є адресою початку області пам'яті, виділеної для відображення файлу, тобто значенням, яке повернув системний виклик mmap().

Параметр length визначає її довжину, і його значення повинне співпадати із значенням відповідного параметра в системному виклику mmap().

Значення, що повертається

При нормальному завершенні системний виклик повертає значення 0, при виникненні помилки – значення -1.