Буферизация дискового ввода-вывода
13.5. Буферизация дискового ввода-вывода
Дисковый ввод-вывод в DOS выполняется с буферизацией. Необходимость буферизации объясняется прежде всего следующими соображениями. Поскольку единицей информации при обмене с дисками является сектор, то при поступлении запроса на чтение данных с диска (пусть даже одного байта), DOS читает весь сектор - 512 байт, а затем передает затребованное число байт в программу. При следующем запросе данных из того же сектора у DOS уже нет необходимости обращаться к диску. Она передает программе данные из буфера. Аналогичным образом при записи данные накапливаются в буфере, пока весь буфер не будет запомнен, и лишь затем выводятся на диск. Кроме того, при наличии большого числа буферов DOS использует их в основном для сохранения содержимого FAT, а также каталогов, что может существенно повысить скорость поиска файлов на диске.
Буферизация (число буферов) задается командой BUFFERS файла CONFIG.SYS. В оперативной памяти можно разместить от 2 до 99 буферов. При задании слишком большого числа буферов помимо того, что расходуется оперативная память проявляется также и снижение эффективности, связанное с затратами времени на обслуживание буферного пула. Справочники рекомендуют такие значения для числа буферов:
- AT с 20- или 30-мегабайтным твердым диском: 32;
- XT с 10-мегабайтным твердым диском: 16;
- PC (только гибкие диски): 4.
Для AT число буферов в основной памяти может быть существенно уменьшено, если используется утилита FASTOPEN, при помощи которой можно хранить информацию о файлах и каталогах в дополнительной (expanded) памяти, или драйвер SMARTDRV.SYS, создающей в дополнительной или расширенной (extended) памяти кэш-память для дисков.
Следует иметь в виду, что буферизация применяется только при выполнении файловых операций ввода-вывода. Секторы читаемые/ записываемые по прямым обращениям из программы к прерываниям DOS 0x25/0x26 через систему буферизации не проходят.
При закрытии файла все связанные с ним буфера сбрасываются на диск. Но в DOS (начиная с 3.30) имеется функция 0x68, позволяющая принудительно записать на диск все буфера, связанные с заданным файлом - ее целесообразно применять, если есть риск потери накопленной в буферах информации при выключении или сбое питания. Кроме того, функция 0x6C (расширенное открытие файлов - начиная с DOS 4.0) позволяет открыть файл без буферизации.
Буферизация обеспечивается следующими внутренними структурами данных DOS. Каждый буфер в оперативной памяти предваряется Блоком Управления Буфера (BCB - Buffer Control Block). Нам не удалось найти в источниках удовлетворительных описаний формата и назначений полей BCB, следующие описания базируются в основном на наших собственных экспериментах в DOS 3.30 и DOS 5.0. Источники утверждают, что во всех вариантах DOS 3.x буферизация построена одинаково, и также одинакова она в DOS 4.x и DOS 5.x, однако, мы не можем ручаться за истинность этого утверждения.
Для DOS 3.30 структура BCB следующая: