Теорія операційної системи

:: Меню ::

Головна
Представлення даних в обчислювальних системах
Машинні мови
Завантаження програм
Управління оперативною пам'яттю
Сегментна і сторінкова віртуальна пам'ять
Комп'ютер і зовнішні події
Паралелізм з точки зору програміста
Реалізація багатозадачності на однопроцесорних комп'ютерах  
Зовнішні пристрої
Драйвери зовнішніх пристроїв
Файлові системи
Безпека
Огляд архітектури сучасних ОС

:: Друзі ::

Карта сайту
 

:: Статистика ::

 

 

 

 

 

Операції над файлами

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

  • int open(char * fname, int flags, mode_t mode)
    Ця операція "відкриває" файл, встановлюючи з'єднання між програмою і файлом. При цьому програма отримує "ручку" або дескриптор файлу — ціле число, що ідентифікує дане з'єднання. Фактично це індекс в системній таблиці відкритих файлів для даного завдання. Всі останні операції використовують цей індекс для заслання на файл. Параметр char * fname задає ім'я файлу, int flags — це бітова маска, що визначає режим відкриття файлу. Файл може бути відкритий лише для читання, лише для запису і для читання і запису; крім того, можна відкривати існуючий файл, а можна намагатися створити новим файл нульової довжини. Необов'язковий третій параметр mode використовується лише при створенні файлу і задає атрибути цього файлу.
  • off_t lseek(int handle, off_t offset., int whence)
    Ця операція переміщає покажчик чтенія/запіси у файлі. Параметр offset задає кількість байтів, на яку потрібно змістити покажчик, а параметр whence — початок відліку зсуву. Передбачається, що зсув можна відлічувати від початку файлу (Seek_set), від його коніа (Seek_end) і від поточного положення покажчика (Seek_cur). Операція повертає положення покажчика, відлічуване від початку файлу. Таким чином, виклик iseek (handle, про, Seek_cur) поверне поточне положення покажчика, не пересуваючи його.
  • int read(int handle, char * where, size__t howjnuch)
    Операція читання з файлу. Покажчик where задає буфер, куди потрібно помістити прочитані дані; третій параметр вказує, скільки даних треба вважати. Система прочитує необхідне число байтів з файлу, починаючи з покажчика чтенія/запіси в цьому файлі, і переміщає покажчик до кінця ліченої послідовності. Якщо файл кінчився раніше, прочитується стільки даних, скільки залишалося до його кінця. Операція повертає кількість лічених байтів. Якщо файл відкривався лише для запису, виклик read поверне помилку.
  • int write(int handle, char * what, size__t how_much)
    Операція запису у файл. Покажчик what задає початок буфера даних; третій параметр вказує, скільки даних треба записати. Система записує необхідне число байтів у файл, починаючи з покажчика чтенія/запіси в цьому файлі, замінюючи ті, що зберігалися в цьому місці дані, і переміщає покажчик до кінця записаного блоку. Якщо файл кінчився раніше, його довжина збільшується. Операція повертає кількість записаних байтів. Якщо файл відкривався лише для читання, виклик write поверне помилку.
  • int ioctl ( int handle, int cmd .. . .)
    int fcntl(int handle, int cmd . . . )

    Додаткові операції над файлом. Спочатку, мабуть, передбачалося, що ioctl — це операції над самим файлом, а fcntl — це операції над дескриптором відкритого файлу, але потім історичний розвиток дещо перемішав функції цих системних викликів. Стандарт Pos1x визначає деякі операції як над дескриптором, наприклад дублювання (в результаті цієї операції ми отримуємо два дескриптори, пов'язаних з одним і тим же файлом), так і над самим файлом, наприклад, операцію truncate — обрізувати файл до заданої довжини. У більшості версій Unix операцію truncate можна використовувати і для вирізування даних з середини файлу. При прочитуванні даних з такої вирізаної області прочитуються нулі, а сама ця область не займає фізичного місця на диску.

Важливою операцією є блокування ділянок файлу. Стандарт POSIX пропонує для цієї мети бібліотечну функцію, але в системах сімейства Unix ця функція реалізована через виклик fcntl.
Більшість реалізацій стандарту POSIX пропонують і свої додаткові операції. Так, в Unix Svr4 цими операціями можна встановлювати
синхронний або відкладений запис (Детальніше поняття відкладені записи обговорюється в разд. Асинхронна модель введення-виводу з точки зору додатків) і так далі

  • caddr t mmap(cadclr t addr, size_t len, int prot, int flags, int handle, off_t
    Відображення ділянки файлу у віртуальний адресний простір процесу. Параметр prot задає права доступу до ділянки, що відображує: на читання, запис і виконання. Відображення може відбуватися на задану віртуальну адресу, або ж система може вибирати адресу для відображення сама.
    Ще дві операції виконуються вже не над файлом, а над його ім'ям: це операції перейменування і видалення файлу. У деяких системах, наприклад в системах сімейства Unix, файл може мати декілька імен, і існує лише системний виклик для видалення імені. Файл віддаляється при видаленні останнього імені.

Видно, що набір операцій над файлом в цьому стандарті дуже схожий на набір операцій над зовнішнім пристроєм. І те, і інше розглядається як неструктурований потік байтів. Для повноти картини слід сказати, що основний засіб межпроцессной комунікації в системах сімейства Unix (труба) також є неструктурованим потоком даних. Ідея про те, що більшість актів передачі даних можуть бути зведене до байтового потоку, досить стара, але Unix була однією з перших систем, де ця ідея була наближена до логічного завершення.
Приблизно та ж модель роботи з файлами прийнята в Ср/м, а набір файлових системних' викликів MS DOS фактично скопійований з викликів Unix v7. У свою чергу, Os/2 і Windows Nt/2000/xp успадкували принципи роботи з файлами безпосередньо від MS DOS.
У системах, Unix, що не мають, в родоводі, може використовуватися декілька інше трактування поняття файлу. Найчастіше файл трактується як набір записів (мал. 11.4). Зазвичай система підтримує записи як постійної довжини, так і змінної. Наприклад текстовий файл інтерпретується як файл із записами змінної довжини, а кожному рядку тексту відповідає один запис. Така модель роботи з файлами в VMS і в ОС лінії Os/360-mvs-z/os фірми IBM.
Практика систем з неструктурованими файлами показала, що, хоча структуровані файли часто бувають зручні для програміста, необов'язково вбудовувати підтримку записів в ядро системи. Це цілком можна зробити і на рівні бібліотек. До того ж структуровані файли самі по собі не вирішують серйозної проблеми, повністю усвідомленої лише в 80-і роки при розробці нових моделей взаємодії людини з комп'ютером.

Мал. 11.4. Неструктурований файл і файли як набори записів

 

:: Реклама ::

 

:: Посилання ::


 

 

 


Copyright © Kivik, 2017