69118

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

Лекция

Информатика, кибернетика и программирование

При зчитувані даних із файла зна чення його чергового компонента копіюється в поточний елемент буфера. У відповідь на цей запит операційна система виділяє буфер із буферного пула і в нього зчитується певна кількість блоків даних із фізичного файла.

Украинкский

2014-09-30

56 KB

1 чел.

Лекція 27.Тема: Буферізація даних. Натипізовані файли.

План:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Обсяг буфера можна визначити за такою формулою:

                Обсяг буфера = кількість записів • размір запису.

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

Приклад 9.10

Розв'яжемо задачу поділу файла на дві частини, розмір першої з яких задається користувачем. Для зв'язування логічних файлів із фізичними використаємо змінні fmain, fpart1 i fpart2 типу file. Роль буфера відіграватиме масив байтів bufer, а його розмір визначатиметься константою const. У змінних sizemain, size1  та size2 типу longint зберігатимуться розміри вхідного файла та його частин.

Найпершою дією програми має бути зв'язування логічних файлів із фізичними. Виконавши зв'язування, один файл відкриємо для читання, два іншнх — для запису. Розмір вхідного файла визначимо за допомогою функції filesize. Виділення частини файла fmain виконаємо у процедурі DinFile, що викликатиметься  двічі. Оскільки процедура BlockRead, як і будь-яка інша процедура запису або зчитування компоненте файла, збільшує значення файлового покажчика на довжину зчитаної делянки, то під час другого виклику процедури DivFile зчитування файла fmain продовжиться з того байта, на якому воно припинилося під час першого виклику DivFile.

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

program ex9_10;

const count=512;      {розмір буфера}

        recordssize=1;   {розмір запису, що зчитується}

var fmain,      {вхідний файл}

     fpart1,fpart2:file;   {вихідні файли}

     bufer:array[1..count] of byte;   {буфер}

     sizemain,      {розмір вхідного файла}

     size1,size2:longint;     {розміри вихідних файлів}

{=============виділення частини файла==================}

procedure DivFile(var f:file;var extent:longint);

                   {f – файл, що утворюється, extent – його розмір}

var i,        {параметр циклу}

      kbuf1,      {кількість блоків}

      kbuf2:word;    {залишок байтів}

begin

      kbuf1:=extent div count;

      kbuf2:=extent mod count;

      for i:=1 to kbuf1 do    {зчитати та записати блоки}

      begin

        BlockRead(fmain, bufer, count);

        BlockWrite(f.buter.count);

        writeln(‘write block=’,i,’ size of block=’,count*recordsize);

      end;

      if kbuf<>20 then

      begin                   {зчитати та записати залишок байтів}

        BlockRead(fmain, bufer, kbuf2);

        BlockWrite(f.befer,kbuf2);

        writeln(‘write residual bytes = ’,kbuf2);

      end;

end;

{===============основна програма===================}

begin

    writeln(‘divide file into 2 files’);

    Assign(fmain, ‘fmain.dat’);

    Assign(fpart, ‘f11.dat’);

    Assign(fpart2,’f21.dat’);

    Reset(fmain,recordsize);     {відкрити вхідний файл}

    Rewrite(fpart1, recordsize);   {відкрити файл для запису}

    Rewrite(fpart2,recordsize);     {частин вхідного файла}

    sizemain:=filesize(fmain);       {розмір вхідного файла}

     writeln(‘sizemain=’, sizemain, ‘bytes’);

     repeat             {вводити розмір першого файла доти,}

         writeln(‘enter sise of file 1’);

         readln(size1);       {доки не буде введене коректне}

     until size1<=sizemain;   {значення}

     size2:=sizemain=size1;        {розмір другого файла}

     writeln(‘created file 1:’);

     DivFile(fpart1,size1);      {виділити першу частину}

     writeln(‘created file 2:’);

     DivFile(fpart2,size2);           {виділити другу частину}

     size1:=filesize(fpert1);      {розмір файла першої частини}

     write(‘created file1: ’);

     writeln(‘size1=’,size1, ‘bytes’);

     size2:=filesize(fpart2);     {розмір файла другої частини}

     write(‘created file2: ’);

     writeln(‘size2=’, size2, ‘bytes’);

     Close(fmain);       {закрити файли}

     Close(fpart1);

     Close(fpart2);

     readln;

end.

Контрольні питання

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

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


 

А также другие работы, которые могут Вас заинтересовать

31343. АНТИЧНЫЙ МИФ ОБ АТЛАНТЕ И АТЛАНТИДЕ: ОПЫТ ФОЛЬКЛОРИСТИЧЕСКОГО РАССМОТРЕНИЯ 2.61 MB
  Образ Атланта в античном мифе и эпосе - это ярчайший пример олицетворения в ми-фо-поэтической форме догреческой неведической культуры и культа, с которыми ведические греки вели ожесточенную борьбу, и от которых в то же время они заимствовали множество их достижений
31344. КУЛЬТ АРЕСА В РЕЛИГИОЗНЫХ ПРЕДСТАВЛЕНИЯХ СКИФСКИХ ПЛЕМЕН СЕВЕРНОГО ПРИЧЕРНОМОРЬЯ (V-III вв. до н.э.) 3.56 MB
  Неудивительно что у скифов главным занятием которых была война совершенно особое место занимал культ бога войны Ареса. С точки зрения марксистской концепции религии перед нами яркое подтверждение того что религиозные верования вызревают и принимают различные формы под воздействием определенных социальных условий достигнутой обществом степени развития. Здесь же отметим что важнейшие аспекты скифского военного культа остаются недостаточно разработанными. Считается что до нас не дошло ни одного скифского мифа связанного с Аресом.
31345. ГЕНЕЗИС И ЭВОЛЮЦИЯ СОЛЯРНЫХ АСПЕКТОВ МИФОЛОГИИ АПОЛЛОНА 9.61 MB
  Лосев писал что широкая публика а значительной мере также и наука отождествляет Аполлона и Солнце1. Цель предлагаемой им реконструкции состоит в том чтобы дать правдоподобное объяснение известному и довольно странному факту: по сравнению с восточными религиозными системами в Греции в историческую эпоху культ Солнца как и других астральных божеств был очень мало развит. Рапп объясняет это тем что известный нам греческий Гелиос был последним звеном цепи развития мифологических представлений и именно поэтому сохранил в своей мифологии...
31346. МЕТАФИЗИКА КУЛЬТУРЫ. ОПЫТ СИСТЕМАТИЗАЦИИ ИДЕЙ РУССКИХ РЕЛИГИОЗНЫХ МЫСЛИТЕЛЕЙ 9.52 MB
  Духовная скудость текущей повседневности российского социума ужасает. Сейчас уже мало кто сомневается в бесперспективности новейшего российского либерализма. Дело не только в его роковой беспочвенности, в отрыве от национальных культурно-исторических корней, но и в каком-то совершенно немыслимом ранее «либеральном варварстве», выражающемся и в переходе от преклонения перед Западом к расовой ненависти к Востоку
31347. Образ птицы Бену в контексте древнеегипетской религии и мифологии 3.8 MB
  Важность специального исследования образа Бену обусловлена не только стремлением подробнее осветить его значение, но, и уходит гораздо глубже. На наш взгляд, объяснив закономерности развития и функционирования этого образа в системе древнеегипетских религиозно-мифологических представлений, мы во многом приблизимся к решению проблем, касающихся некоторых аспектов культа животных; и шире, к выявлению закономерностей мифотворчества в древнем Египте.
31348. ЭКРАННАЯ КУЛЬТУРА КАК НОВАЯ МИФОЛОГИЯ (НА ПРИМЕРЕ КИНО) 6.3 MB
  Экранная культура: основные понятия история развития и специфика современного состояния Понятие экранной культуры и основные этапы ее развития Экранная культура и современное коммуникативное пространство Экранная культура в контексте средств массовой коммуникации. Мифы в экранной культуре: традиции и современность Понятие мифа применительно к экранной культуре Новая мифология как способ...
31349. Фантастика и миф : использование мифологических образов в современной фантастической литературе 571.13 KB
  Тем не менее мы видим здесь не хронику давно забытых событий а историю о подлой неблагодарности королей об интриганахпридворных о законниках выворачивающих истину наизнанку чтобы отправить на тот свет неугодного им человека. И теперь перед нами возникает следующий не менее интересный вопрос: зачем же понадобилось невероятное в романе изображающем человека Всем известно что Свифт не единственный писатель который вводил в свои произведения фантастические образы. Вспомним лермонтовского Демона пушкинскую Русалку в повести Гоголя...
31350. РАЗВИТИЕ ИССЛЕДОВАТЕЛЬСКОЙ ИНИЦИАТИВНОСТИ В ДЕТСКОМ ВОЗРАСТЕ 9.73 MB
  Структура и функции исследовательской инициативности в деятельности человека . Психологические исследования деятельности человека по изучению сложных многосвязных объектов . В настоящее время развитие общества характеризуется все возрастающей динамичностью проникновением на новые уровни познания природы изменением социального устройства и возникновением качественно новых видов деятельности в ранее неизвестных областях. Особое значение здесь приобретает стремление и способность личности активно исследовать новизну и сложность меняющегося...
31351. КОММУНИКАТИВНЫЕ СТРАТЕГИИ И ТАКТИКИ АГИТАЦИОННОГО ТЕКСТА И ИХ СТИЛИСТИЧЕСКАЯ РЕПРЕЗЕНТАЦИЯ 850 KB
  Формирование в стране новой коммуникационной среды, новых форм коммуникационного обмена, становление системы активных публичных коммуникаций обусловило актуальность социопрагматического аспекта анализа феноменов вербальной коммуникации. По выражению О.С. Иссерс, «в сегодняшнем обществе сформировался социальный заказ на знание закономерностей общения»