Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
21-60.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
270.43 Кб
Скачать

30)Буферизація даних. Нетипізовані файли.

Буферизація даних

Буфером називається область пам'яті, призначена для тимчасового збереження даних під час їх передачі від джерела до приймача інформації. Застосування буферів дає можливість зменшити диспропорції між швидкостями роботи процесора та зовнішніх пристроїв. Переважаюча частина зовнішніх пристроїв може отримувати та надсилати дані лише досить великими порціями (у сотні або тисячі байтів), і при цьому кожна операція обміну даними між пам'яттю і пристроєм є досить трудомісткою. Натомість, під час створення програм часто виникає потреба надіслати чи отримати з пристрою один або кілька байтів інформації, виконати певні дії, знову здійснити обмін даними із пристроєм тощо (див. програму сортування файла з прикладу 9.9). Було б украй недоцільно багаторазово повторювати трудомістку операцію обміну великою порцією даних із пристроєм, аби переслати один чи кілька байтів. Буфер дозволяє накопичити порцію даних у пам'яті, а потім передати її на пристрій «в один прийом». Отже, за допомогою буфера імітується обмін даними між програмою і зовнішнім пристроєм, в той час як насправді відбувається обмін даними між програмою та пам'яттю.

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

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

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

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

Нетипізовані файли.

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

var <ім'я файлової змінної>: file;

Відкриття нетипізованого файла для читання або запису виконується процедурами Reset та Rewrite, яким крім файлової змінної передається, ще й додатковий аргумент — розмір файлового запису в байтах:

Reset(<файлова змінна>,<розмір запису>); Rewrite(var <файлова змінна>,<розмір запису>);

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

Зчитування даних із фізичного файла у буфер здійснює процедура BlockRead, а запис даних з буфера у файл — процедура BlockWrite. Наведемо синтаксис виклику цих процедур:

BlockRead(<файлова змінна>,<буферна змінна>,<кількість записів>,[,<кількість фактично зчитаних компонентів>]); BlockWrite(<файлова змінна>,<буферна змінна>,<кількість записів>,[,<кількість фактично записаних компонентів>]);

Тут <файлова змінна> — ім'я змінної типу file; <буферна змінна> - ім'я змінної, що використовується як буфер обміну даними (ця змінна може мати будь-який тип); цілочисловий аргумент <кількість записі в> визначає кількість записів, що мають бути зчитані або записані; необов'язковий параметр <кількість фактично записаних компонентів> — змінна типу word, якій буде присвоєна кількість записів, переданих насправді. Четвертий параметр слід використовувати тоді, коли кількість байтів, що їх залишилося передати, може бути меншою за значення третього аргументу. Обсяг буфера можна визначити за такою формулою:Обсяг буфера = кількість записів x розмір запису.

Тип змінної, що використовується як буфер введення-виведення, має бути таким, аби обсягу пам'яті, відведеної для збереження значень змінної, вистачило для розміщення всіх байтів під час читання чи запису даних. Обсяг даних, що передаються під час однієї операції обміну, не може перевищувати 64 Кбайт. s

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]