НОУ ИНТУИТ, Лекція, Організація файлової системи в UNIX
Поняття про файли, що відображаються у пам'ять (memory mapped файлах). Системні виклики mmap(), munmap()
З погляду програміста робота з такими файлами виглядає так:
Системний виклик mmap()
Прототип системного виклику
Опис системного виклику
Цей опис не є повним описом системного дзвінка, а призначений лише для використання в рамках даного курсу. Для отримання повної інформації зверніться до UNIX Manual.
У пам'ять буде відображатися частина файлу, починаючи з позиції всередині його, заданої значенням параметра offset - зміщення від початку файлу в байтах, і довжиною, що дорівнює значенням параметра length (звісно, теж у байтах). Значення параметра length може перевищувати реальну довжину від позиції offset остаточно існуючого файла. На поведінці системного виклику це ніяк не відобразиться, але надалі при спробі доступу до осередків пам'яті, що лежать поза межами реального файлу, виникне сигнал SIGBUS (реакція на нього за замовчуванням – припинення процесу з утворенням файлу core).
Параметр prot визначає дозволені операції над областю пам'яті, у якій буде відображено файл. Як його значення ми будемо використовувати значення PROT_READ (дозволено читання), PROT_WRITE (дозволений запис) або їх комбінацію через операцію "побітове або" – "". Необхідно відзначити дві суттєві особливості системного виклику, пов'язані з цим параметром:
- Значення параметра prot не може бути ширшим, ніж операції над файлом, заявлені при його відкритті у параметрі flags системного виклику open() . Наприклад, не можна відкрити файл тільки для читання, а під час його відображенняна згадку використовувати значення prot = PROT_READ PROT_WRITE .
- В результаті помилки в операційній системі Linux при роботі на 486-х і 586-х процесорах спроба записати у відображення файлу, відкрите тільки для запису, більше 32 байт одночасно призводить до помилки (виникає сигнал про порушення захисту пам'яті).
- Після цього із вмістом файлу можна працювати, як із вмістом звичайної області пам'яті.
- Після роботи з вмістом файлу, необхідно звільнити додатково виділену процесу область пам'яті, попередньо синхронізувавши вміст файлу на диску із вмістом цієї області (якщо, звичайно, необхідно). Ці дії виконує системний виклик munmap().
Системний виклик munmap
Прототип системного виклику
Опис системного виклику
Параметр length визначає її довжину, і його значення має співпадати зі значенням відповідного параметра системного виклику mmap() .
При нормальному завершенні системний виклик повертає значення 0, при виникненні помилки – значення -1.
Аналіз, компіляція та прогін програми для створення memory mapped файлу та запису його вмісту
Для закріплення матеріалу, викладеного у попередньому розділі, розглянемо приклад програми.
Зверніть увагу на необхідність збільшення розміру файлу перед його відображенням. Створений файл має нульовий розмір, і якщо його з цим розміром відобразити на згадку, ми зможемо записати у нього чи прочитати з нього трохи більше 0 байт, тобто. нічого. Для збільшення розміру файлу використаний системний викликftruncate() , хоча це можна було б зробити і будь-яким іншим способом .
При відображенні файлу ми змушені дозволити в ньому і запис, і читання, хоча реально здійснюємотільки запис. Це зроблено для того, щоб уникнути помилки в операційній системі Linux, пов'язаної з використанням 486-х та 586-х процесорів. Такий список дозволених операцій однозначно вимагає, щоб під час відкриття файлу системним викликом open() файл відкривався і запис , і читання. Оскільки інформацію ми бажаємо зберегти на диску, для відображення використано значення прапорів MAP_SHARED . Відкомпілюйте цю програму та запустіть її.
Зміна попередньої програми для читання файлу, використовуючи його відображення в пам'ять
Модифікуйте програму з попереднього розділу так, щоб вона відображала файл, записаний програмою з розділу "Аналіз, компіляція та прогін програми для створення memory mapped файлу та запису його вмісту", в пам'ять і вважала суму квадратів чисел від 1 до 100000, які вже знаходяться в цей файл.
Завдання підвищеної складності: напишіть дві програми, що використовують memory mapped файл для обміну інформацією при одночасної роботі, подібно до того, як вони могли б використовувати пам'ять, що розділяється.