Поділ файлів між процесами

У багатозадачних ОС, а також в мережевих системах, можлива ситуація, коли два або більше процесів намагаються одночасно використовувати один і той же файл. Наприклад, два користувача можуть одночасно працювати з однією базою даних. Будемо припускати, що з правами доступу все гаразд, кожен процес окремо має право читати і записувати файл. Питання в тому, чи можна дозволити одночасну роботу, чи не призведе це до порушення цілісності даних.

Може призвести. Якщо один процес оновлює дані у файлі, а інший в цей час намагається читати ці ж дані, то він може прочитати частково оновлені дані. Ще небезпечніше, коли два процеси намагаються одночасно змінити одні й ті ж дані. У цьому випадку важко навіть передбачити, що в результаті буде збережено у файлі.

В принципі, завжди безпечними є лише два крайніх випадку:

· Тільки один процес працює з файлом, виконуючи читання і запис;

· З файлом працює довільне число процесів, але всі вони виконують тільки читання.

ОС могла б забезпечити безпечний доступ, дозволяючи процесу відкривати файл тільки в цих двох випадках, тобто якщо файл не відкритий ще жодним іншим процесом або якщо файл відкритий кимось тільки для читання і даний процес теж відкриває його для читання. Однак така суворість у ряді випадків істотно знизила б продуктивність системи. Скажімо, багато користувачів хотіли б одночасно працювати з однією базою даних. І в цьому немає нічого поганого, поки вони працюють з різними записами бази. Небезпека виникає тільки при одночасній роботі з однією і тією ж записом. Але ОС не може сама відстежити ситуацію так докладно, це може зробити програма, що керує базою даних. Зважаючи подібних ситуацій, більшість ОС дозволяють програмам процесів самим визначати, чи допустимо спільний доступ у різних конкретних ситуаціях.

Типове рішення полягає в наступному. Прикладна програма, викликаючи системну функцію відкриття файлу, вказує два додаткові параметри: режим доступу та режим поділу.

Режим доступу визначає, які операції сам процес збирається виконувати з файлом. Зазвичай розрізняють доступ «тільки для читання», «тільки для запису», «для читання і запису».

Режим поділу визначає, які операції даний процес готовий дозволити іншим процесам, які захочуть відкрити той же файл. Зразковий набір режимів поділу - «заборона запису», «заборона читання», «заборона читання і запису» і «без заборон».

Перший процес, який відкриває файл, встановлює на свій розсуд режими доступу і розподілу. Коли другий процес намагається відкрити той же файл, ОС перевіряє дві умови:

· Режим доступу другого процесу не повинен суперечити режиму поділу, встановленому першим процесом;

· Режим поділу, запитуваний другим процесом, не повинен забороняти той режим доступу, який вже встановив для себе перший процес.

У разі порушення одного з цих умов система не відкриває файл для другого процесу, функція відкриття файлу повертає помилку. Якщо ж умови дотримані, система відкриває файл для другого процесу, як би знімаючи з себе відповідальність за наслідки: ви цього хотіли - отримаєте.

До цих пір мова йшла тільки про поведінку процесів і системи при відкритті файлу. Однак це не повністю вирішує проблему. Повернемося до прикладу з базою даних. Нехай відповідний файл відкритий декількома процесами. Коли один із процесів приступає до роботи з конкретною записом, він повинен мати можливість тимчасово заборонити або обмежити доступ інших процесів до цієї ж записи. Для цієї мети служить блокування процесом фрагментів файлу.

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

Описаний вище тип блокування називається ексклюзивної або виключної блокуванням: процес дозволяє собі і читання, і запис, а іншим процесам тимчасово забороняє те й інше. Деякі системи допускають також кооперативну (не виняткову) блокування: встановлюючи її, процес забороняє тільки запис всім процесам, у тому числі і собі самому, в той час як читання залишається дозволеним для всіх.