- •Логічна організація файлових систем
- •11.1. Поняття файла і файлової системи
- •11.1.1. Поняття файла
- •11.1.2. Поняття файлової системи
- •11.1.3. Типи файлів
- •11.1.4. Імена файлів
- •11.2. Організація інформації у файловій системі
- •11.2.1. Розділи
- •11.2.2 Каталоги
- •11.2.3. Зв’язок розділів і структури каталогів
- •11.3. Зв’язки
- •11.3.1. Жорсткі зв’язки
- •11.3.2. Символічні зв’язки
- •11.4. Атрибути файлів
- •11.5. Операції над файлами і каталогами
- •11.5.1. Підходи до використання файлів процесами
- •11.5.2. Загальні відомості про файлові операції
- •11.5.3. Файлові операції posix
- •11.5,4. Файлові операції Win32 api
- •11.5.5. Операції над каталогами
- •11.6. Міжпроцесова взаємодія на основі інтерфейсу файлової системи
- •11.6.1. Файлові блокування
- •11.6.2. Файли, що відображаються у пам’ять
- •11.6.3. Поіменовані канали
- •Висновки
- •Контрольні запитання та завдання
11.6. Міжпроцесова взаємодія на основі інтерфейсу файлової системи
Як зазначалося, використання файлів є найпростішою формою міжпроцесової взаємодії. У цьому розділі вивчатимемо складніші та продуктивніші способи обміну даними між процесами, які також ґрунтуються на інтерфейсі файлової системи, серед них механізм синхронізації (файлові блокування), реалізація відображуваної і розподілюваної пам’яті та механізм обміну повідомленнями (поіменовані канали).
11.6.1. Файлові блокування
Файлові блокування (file locks) є засобом синхронізації процесів, які намагаються здійснити доступ до одного й того самого файла Процес може заблокувати файл повністю або будь-який його діапазон (аж до одного байта), після чого інші процеси не зможуть отримати доступу до цього файла або діапазону доти, поки з нього не буде зняте блокування.
Розрізняють консультативне, або кооперативне (advisory lock), і обов’язкове блокування (mandatory lock) файлів.
Консультативне блокування є основним, найбезпечнішим видом блокування. Його підтримують нарівні процесів режиму користувача. Для коректної синхронізації всі процеси перед доступом до файла мають перевіряти наявність такого блокування (якщо блокування відсутнє, процес запроваджує своє блокування, виконує дії із файлом і знімає блокування). Якщо процес виконає операцію читання із файла або записування у файл без попередньої перевірки консультативного блокування, система дозволить виконання цього виклику.
Обов’язкове блокування підтримують на рівні ядра. Коли процес запровадив обов’язкове блокування, жодні операції над файлом або його діапазоном не будуть можливими доти, поки це блокування не буде зняте. Насправді таке блокування може бути небезпечним, оскільки навіть користувач із правами адміністратора не може його зняти (так, випадкове блокування системного файла може зробити систему непрацездатною).
Для файлових блокувань, аналогічно до блокувань читання-записування з попередніх лекцій, розрізняють режими для читання і для записування.
Файлові блокування POSIX
Підтримка файлових блокувань у POSIX ґрунтується на системному виклику fcntl( ), що дає змогу запровадити або перевірити блокування на файл або на діапазон даних усередині файла .
Значеннями параметра cmd може бути F_GETLK - перевірити, чи є блокування, F_SETLK — запровадити блокування, якщо воно вже є, повернути помилку, F_SETLKW — запровадити блокування, перейти до очікування, якщо воно вже є.
Структура f1ock мас бути задана перед викликом. У ній можна вказати:
♦ діапазон байтів у файлі (поля l_start і l_end); якщо ці поля дорівнюють нулю, блокується весь файл;
♦ тип блокування (поле 1_type із можливими значеннями F_RDLCK — для читання, F_WRLCK — для записування, F_UNLCK — зняти блокування).
Якщо cmd дорівнює F_GETLK, цю структуру заповнюють усередині виклику, її поле l_type міститиме тип блокування, якщо воно є.
За замовчуванням таке блокування є консультативним, для запровадження обов’язкового блокування потрібно спочатку задати спеціальні права доступу до файла (задати setgid біт і очистити дозвіл виконання для групи), після чого застосування fcntl ( ) до цього файла спричиняє обов’язкове блокування.
Файлові блокування використовують у UNIX-системах як простий і надійний засіб синхронізації процесів. Зазвичай для цієї мсти створюють окремий файл блокування, який блокується процесами у разі необхідності доступу до спільно використовуваних ресурсів і вивільняється разом із цими ресурсами. Наприклад, так можна заборонити повторний запуск уже запущеного застосування.
Файлові блокування у Win32
У Windows ХР для запровадження обов’язкових файлових блокувань використовують функцію LockFileEx( ), а для консультативних — LockFile( ). Зупинимось на особливостях використання LockFileEx( ).
де: fh — дескриптор відкритого файла;
flags — прапорці режиму блокування, зокрема LOCKFILE_EXCLUSIVE_LOCK — блокування для записування (якщо це значення не задане, встановлюють блокування для читання), LOCKFILE_FAIL_IMMEDIATELY — повернути нуль негайно, якщо файл уже заблокований;
1count — кількість заблокованих байтів;
ov - покажчик на структуру типу OVERLAPPED, поле Offset якої визначає зсув заблокованої ділянки від початку файла.
LockFileEx( ) повертає нуль, якщо блокування запровадити не вдалося.
Для розблокування використовують функцію UnLockFileEx( ) з тими самими параметрами, за винятком flags.
