Головна |
Буферизація дискового введення-виведенняДисковий введення-виведення в DOS виконується з буферизацією. Необхідність буферизації пояснюється перш за все такими міркуваннями. Оскільки одиницею інформації при обміні з дисками є сектор, то при надходженні запиту на читання даних з диска (нехай навіть одного байта), DOS читає весь сектор - 512 байт, а потім передає затребованное число байт в програму. При наступному запиті даних з того ж сектора у DOS вже немає необхідності звертатися до диска. Вона передає програмі дані з буфера. Аналогічним чином при запису дані накопичуються в буфері, поки весь буфер НЕ буде запомнен, і лише потім виводяться на диск. Крім того, при наявності великого числа буферів DOS використовує їх в основному для збереження вмісту FAT, а також каталогів, що може істотно підвищити швидкість пошуку файлів на диску. Буферизація (число буферів) задається командою BUFFERS файлу CONFIG.SYS. В оперативній пам'яті можна розмістити від 2 до 99 буферів. При завданні занадто великого числа буферів крім того, що витрачається оперативна пам'ять проявляється також і зниження ефективності, пов'язане з витратами часу на обслуговування буферного пулу. Довідники рекомендують такі значення для числа буферів:
Для AT число буферів в основний пам'яті може бути істотно зменшена, якщо використовується утиліта FASTOPEN, за допомогою якої можна зберігати інформацію про файлах і каталогах в додатковій (expanded) пам'яті, або драйвер SMARTDRV.SYS, що створює додаткового або розширеної (extended) пам'яті кеш -память для дисків. Буферизація забезпечується наступними внутрішніми структурами даних DOS. Кожен буфер в оперативній пам'яті передує Блоком Управління Буфера (BCB - Buffer Control Block). Поля drive і sect включають логічний номер диска і номер сектора цього диска, вміст якого скопійовано в даний буфер (в жодного разу не використаних буферах drive = 0xff), поле dpb - посилання на DPB цього пристрою. Поле стану буфера - flag - буде нами розглянуто нижче. Поле copies містить число копій даного сектора на диску (воно відмінно від 1 тільки для секторів, що входять до складу FAT), а поле sect_off - зміщення на диску другий копії щодо першої (в секторах). В DOS 5 всі буфери розташовані в одному сегменті пам'яті. Поля next і prev в BCB пов'язують їх в двохзв'язной список. Ці поля містять тільки зміщення, так як сегментна адреса у всіх буферів один і той же. Для цієї версії поле CVT зі зміщенням 0x12 включає адресу області пам'яті, в якій зберігається адреса початку списку, для виходу на перший елемент списку необхідна подвійна адресація. Список - кільцевої, тобто поле next його останнього елемента вказує на перший елемент, а поле prev першого - на останній. Тепер про інтерпретацію розрядів байта стану буфера. Його біти мають таке призначення: 0 w r 0 a d f 0,де Функції вводу-виводу | Функції роботи з файлами і каталогами | Програмний сегмент і програмний ідентифікатор | COM- і EXE-файли | Запуск програми з програми | Блоки управління пам'яттю | Функції pаспpеделения пам'яті DOS | Системні керуючі блоки DOS | драйвери пристроїв | Блоки параметрів дисків і масив поточних каталогів | |