Кэширование операций ввода-вывода при работе с накопителями на магнитных дисках

Как известно, накопители на магнитных дисках обладают крайне низким быстро­действием по сравнению с процессорами и оперативной памятью. Разница состав­ляет несколько порядков. Например, современные процессоры за один такт рабо­ты, а они работают уже с частотами в несколько гигагерц, могут выполнять по две операции, и, таким образом, время выполнения операции (с позиции внешнего на-

Кэширование операций ввода-вывода____________________________________ 157

блюдателя, который не видит конвейеризации при выполнении машинных команд, позволяющей увеличить производительность в несколько раз) может составлять менее 0,5 нc (!). В то же время переход магнитной головки с дорожки на дорожку занимает несколько миллисекунд; подобная же задержка требуется и на поиск нуж­ного сектора данных. Как известно, в современных приводах средняя длительность на чтение случайным образом выбранного сектора данных составляет около 20 мс, что существенно медленнее, чем выборка команды или операнда из оперативной памяти и уж тем более из кэш-памяти. Правда, после этого данные читаются боль­шим пакетом (сектор, как мы уже говорили, имеет размер 512 байт, а при операци­ях с диском часто читаются или записываются сразу несколько секторов). Таким образом, средняя скорость работы процессора с оперативной памятью на 2-3 по­рядка выше, чем средняя скорость передачи данных из внешней памяти на маг­нитных дисках в оперативную память.

Для того чтобы сгладить такое сильное несоответствие в производительности основных подсистем, используется буферизация и/или кэширование данных в дис­ковом кэше (disk cache). Простейшим вариантом ускорения дисковых операций чтения данных можно считать использование двойной буферизации. Ее суть за­ключается в том, что пока в один буфер заносятся данные с магнитного диска, из второго буфера ранее считанные данные могут быть прочитаны и переданы в за­просившую их задачу. Аналогично и при записи данных. Буферизация использу­ется во всех операционных системах, но помимо буферизации применяется и кэ­ширование. Кэширование исключительно полезно в том случае, когда программа неоднократно читает с диска одни и те же данные. После того как они один раз будут помещены в кэш, обращений к диску больше не потребуется, и скорость ра­боты программы значительно возрастет.

Упрощая, можно сказать, что под дисковым кэшем можно понимать некий пул буферов, которыми мы управляем с помощью соответствующего системного про­цесса. Если считывается какое-то множество секторов, содержащих записи того или иного файла, то эти данные, пройдя через кэш, там остаются (до тех пор, пока другие секторы не заменят эти буферы). Если впоследствии потребуется повтор­ное чтение, то данные могут быть извлечены непосредственно из оперативной па­мяти без фактического обращения к диску. Ускорить можно и операции записи: данные помещаются в кэш, и для запросившей эту операцию задачи получается, что фактически они уже записаны. Задача может продолжить свое выполнение, а системные внешние процессы через некоторое время запишут данные на диск. Это называется отложенной записью (lazy write1). Если режим отложенной записи от­ключен, только одна задача может записывать на диск свои данные. Остальные приложения должны ждать своей очереди. Это ожидание подвергает информацию риску не меньшему (если не большему), чем сама отложенная запись, которая к то­му же и более эффективна по скорости работы с диском.

Интервал времени, после которого данные будут фактически записываться, с од­ной стороны, желательно выбрать большим, поскольку это позволило бы не чи­тать (если потребуется) эти данные заново, так как они уже и так фактически на-

Кэширование операций ввода-вывода при работе с накопителями на магнитных дисках - student2.ru 1 Дословно — «ленивая» запись.

158_____________ Глава 5. Управление вводом-выводом в операционных системах

ходятся в кэше. И после их модификации эти данные опять же помещаются в бы­стродействующий кэш. С другой стороны, для большей надежности, желательно поскорее отправить данные во внешнюю память, поскольку она энергонезависи­ма, и в случае какой-нибудь аварии (например, нарушения питания) данные в опе­ративной памяти пропадут, в то время как на магнитном диске они с большой ве­роятностью останутся в безопасности.

Поскольку количество буферов, составляющих кэш, ограничено, может возник­нуть ситуация, когда считываемые или записываемые данные потребуют замены данных в этих буферах. При этом возможны различные дисциплины выделения буферов под вновь затребованную операцию кэширования.

Кэширование дисковых операций может быть существенно улучшено за счет упреж­дающего чтения (read ahead), которое основано па чтении с диска гораздо больше­го количества информации, чем на самом деле запрошено приложением или опе­рационной системой. Когда некоторой программе требуется считать с диска только один сектор, программа кэширования читает несколько дополнительных блоков данных. При этом, как известно, операции последовательного чтения нескольких секторов фактически несущественно замедляют операцию чтения затребованного сектора с данными. Поэтому, если программа вновь обратится к диску, вероятность того, что нужные ей данные уже находятся в кэше, будет достаточно высока. По­скольку передача данных из одной области памяти в другую происходит во много раз быстрее, чем чтение их с диска, кэширование существенно сокращает время выполнения операций с файлами.

Итак, путь информации от диска к прикладной программе пролегает как через буфер, так и через дисковый кэш. Когда приложение запрашивает с диска данные, программа кэширования перехватывает этот запрос и читает вместе с необходи­мыми секторами еще и несколько дополнительных. Затем она помещает в буфер требующуюся задаче информацию и ставит об этом в известность операционную систему. Операционная система сообщает задаче, что ее запрос выполнен, и дан­ные с диска находятся в буфере. При следующем обращении приложения к диску программа кэширования прежде всего проверяет, не находятся ли уже в памяти затребованные данные. Если это так, то она копирует их в буфер, если же их в кэше нет, то запрос на чтение диска передается операционной системе. Когда задача из­меняет данные в буфере, они копируются в кэш.

Важно заметить, что простое увеличение объема памяти, отводимого под кэширо­вание файлов, может и не привести к росту быстродействия системы. Другими словами, наблюдается далеко не прямо пропорциональная зависимость ускорения операций с файлами от размера кэша. Кривая этой зависимости достаточно скоро перестает расти, а затем и вовсе эффективность кэширования начинает снижать­ся. Объяснение этому заключается в том, что поиск нужного фрагмента данных в буферах кэша осуществляется путем их полного перебора. Поэтому с ростом числа буферов кэша затраты на их перебор становятся значительными. И поскольку не­возможно обеспечить 100-процентного кэш-попадания искомых данных, то есте­ственно наступает момент, когда среднее время доступа к данным перестает сни­жаться с увеличением кэша. Очевидно, что оптимальный размер дискового кэша

Кэширование операций ввода-вывода____________________________________ 159

зависит от очень многих факторов, в том числе и от частоты повторных обраще­ний к недавно прочитанным данным, и от среднего объема обрабатываемых фай­лов, и от разницы в быстродействии центральной части компьютера и дисковой подсистемы.

В ряде операционных систем имеется возможность указать в явном виде парамет­ры кэширования, в то время как в других за эти параметры отвечает сама операци­онная система.

Так, в системах семейства Windows 9x мы можем указать и объем памяти, отводи­мый для кэширования, и объем порции (chunk) данных, из которых набирается кэш, и предельное количество имен файлов, и параметры кэширования каталогов. В файле SYSTEM.INI, расположенном в основном каталоге такой операционной сис­темы (обычно это каталог Windows), в секции [vcache] есть возможность прописать, например, следующие значения:

[vcache]

MinFileCache=4096

MaxFileCache=32768

ChunkSize=512

Здесь указано, что минимально под кэширование данных зарезервировано 4 Мбайт оперативной памяти, максимальный объем кэша может достигать 32 Мбайт, а раз­мер данных, которыми манипулирует менеджер кэша, равен одному сектору. Следу­ет заметить, что поскольку в современных компьютерах нередко устанавливается большой объем оперативной памяти, порой существенно превосходящий 256 Мбайт, то для обеспечения корректной работы подсистемы кэширования обязательно нуж­но указывать в явном виде значение MaxFileCache. Оно ни в коем случае не должно превышать величину 262 144 Кбайт. Это ограничение следует из-за особенностей программной реализации подсистемы кэширования2 — при превышении этого зна­чения происходят нарушения в работе подсистемы памяти и вычислительные про­цессы могут быть разрушены.

Во всех операционных системах от Microsoft принята стратегия активного кэши­рования файлов, при которой для кэширования отводится вся свободная память. Поэтому без явного ограничения объема памяти, отводимой под кэширование фай­лов, мы можем столкнуться с ситуацией, когда рост дискового кэша приводит к зна­чительному росту числа страниц памяти, «сброшенных» в файл подкачки. По­следнее может привести к заметному замедлению работы системы, несмотря на то что кэширование имеет целью именно ускорение в работе дисковой подсистемы.

В операционных системах Windows NT 4.0, Windows 2000 и Windows XP также имеется возможность управлять некоторыми параметрами кэширования. Правда, сделать это можно только путем редактирования реестра.

Например, если в разделе [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Ses-sion Manager\Memory Management] реестра найти параметр IOPageLockLimit и присво­ить ему значение 163777216, то это будет означать, что 16 384 Кбайт будут отведе-

Кэширование операций ввода-вывода при работе с накопителями на магнитных дисках - student2.ru ' Дословно — «кусочек».

2 Драйвер VCACHE разрабатывался в то время, когда объем памяти в 256 Мбайт казался недостижи­мым.

160_____________ Глава 5. Управление вводом-выводом в операционных системах

ны в физической памяти для хранения буферов дискового кэша. Эта память не может быть выгружена в файл подкачки. Дело в том, что, к большому сожалению, разработчики из Microsoft приняли решение, согласно которому кэшируемые фай­лы отображаются на виртуальное адресное пространство, а не на физическую па­мять компьютера, как это сделано в других операционных системах. Это означает, что некоторые страничные кадры этого виртуального адресного пространства мо­гут быть отображены не на реальную оперативную память компьютера, а размеще­ны во внешней памяти (попасть в страничный файл подкачки). Очевидно, что это может сильно замедлять работу рассматриваемой подсистемы. Поэтому блокиро­вание некоторого числа страниц файлового кэша от перемещения их во внешнюю память должно приводить к повышению эффективности кэширования. В качестве рекомендации можно заметить, что упомянутое значение в 16 Мбайт можно выде­лять для компьютеров с объемом памяти более 128 Мбайт.

В других операционных системах можно указывать больше параметров, определя­ющих работу подсистемы кэширования (см., например, раздел «Файловая систе­ма HPFS» в главе 6).

Помимо описанных действий, связанных с кэшированием файлов, операционная система может оптимизировать перемещение головок чтения/записи данных, свя­занное с выполнением запросов от параллельно выполняющихся задач. Время, необходимое на получение данных с магнитного диска, складывается из времени перемещения магнитной головки на требуемый цилиндр и времени поиска задан­ного сектора; а временем считывания найденного сектора и временем передачи этих данных в оперативную память мы можем пренебречь. Таким образом, основные затраты времени уходят на поиск данных. В мультипрограммных операционных системах при выполнении многих задач запросы на чтение и запись данных могут идти таким потоком, что при их обслуживании образуется очередь. Если выпол­нять эти запросы в порядке поступления их в очередь, то вследствие случайного характера обращений к тому или иному сектору магнитного диска потери времени на поиск данных могут значительно возрасти. Напрашивается очевидное реше­ние: поскольку переупорядочивание запросов с целью минимизации затрат вре­мени на поиск данных можно выполнить очень быстро (практически этим време­нем можно пренебречь, учитывая разницу в быстродействии центральной части компьютера и устройств ввода-вывода), то необходимо найти метод, позволяю­щий выполнить такое переупорядочивание оптимальным образом. Изучение этой проблемы позволило найти наиболее эффективные дисциплины планирования.

Перечислим известные дисциплины, в соответствии с которыми можно перестра­ивать очередь запросов на операции чтения/записи данных [11].

- SSTF (Shortest Seek Time First — запрос с наименьшим временем позициони­рования выполняется первым). В соответствии с этой дисциплиной при пози­ционировании магнитных головок следующим выбирается запрос, для которо­го необходимо минимальное перемещение с цилиндра на цилиндр, даже если этот запрос не был первым в очереди на ввод-вывод. Однако для этой дисцип­лины характерна сильная дискриминация некоторых запросов, а ведь они мо­гут идти от высокоприоритетных задач. Обращения к диску проявляют тен-

Контрольные вопросы и задачи_________________________________________ 161

денцию концентрироваться, в результате чего запросы на обращение к самым внешним и самым внутренним дорожкам могут обслуживаться существенно дольше, и нет никакой гарантии обслуживания. Достоинством такой дисцип­лины является максимально возможная пропускная способность дисковой под­системы.

- Scan (сканирование). При сканировании головки поочередно перемещаются то
в одном, то в другом «привилегированном» направлении, обслуживая «по пути»
подходящие запросы. Если при перемещении головок чтения/записи более нет
попутных запросов, то движение начинается в обратном направлении.

- Next-Step Scan (отложенное сканирование). Отличается от предыдущей дис­
циплины тем, что на каждом проходе обслуживаются только те запросы, кото­
рые уже существовали на момент начала прохода. Новые запросы, появляющи­
еся в процессе перемещения головок чтения/записи, формируют новую очередь
запросов, причем таким образом, чтобы их можно было оптимально обслужить
на обратном ходу.

- C-Scan (циклическое сканирование). По этой дисциплине головки перемеща­ются циклически с самой наружной дорожки к внутренним, по пути обслужи­вая имеющиеся запросы, после чего вновь переносятся к наружным цилиндрам. Эту дисциплину иногда реализуют таким образом, чтобы запросы, поступаю­щие во время текущего прямого хода головок, обслуживались не попутно, а при следующем проходе, что позволяет исключить дискриминацию запросов к са­мым крайним цилиндрам. Эта дисциплина характеризуется очень малой дис­персией времени ожидания обслуживания [11]. Ее часто называют «элеватор­ной».

Контрольные вопросы и задачи Вопросы для проверки

1. Почему создание подсистемы ввода-вывода считается одной из самых слож­
ных областей проектирования операционных систем?

2. Почему операции ввода-вывода в операционных системах объявляются при­
вилегированными?

3. Перечислите основные задачи, возлагаемые на супервизор ввода-вывода?

4. В каких случаях устройство ввода-вывода называется инициативным?

5. Какие режимы управления вводом-выводом вы знаете? Опишите каждый из них.

6. Что означает термин «spooling» и что означает термин «swapping»?

7. Чем обеспечивается независимость пользовательских программ от устройств
ввода-вывода, подключенных к компьютеру?

8. Что такое синхронный и асинхронный ввод-вывод?

9. Опишите структуру магнитного диска (разбиение дисков на разделы). Сколь­
ко (и каких) разделов может быть на магнитном диске?

162_____________ Глава 5. Управление вводом-выводом в операционных системах

10. Как в общем случае осуществляется загрузка операционной системы после
включения компьютера? Что такое начальный, системный и внесистемный за­
грузчики? Где они располагаются?

11. Расскажите о кэшировании операций ввода-вывода при работе с накопителя­
ми на магнитных дисках.

Задания

Используя специально выделенный для этих целей компьютер, изучите структу­ру диска и освойте работу с программой Disk Editor.

1. Включите компьютер. Во время выполнения программы самотестирования
войдите в BIOS и установите возможность загрузки с дискеты.

2. Загрузите операционную систему, расположенную на магнитном диске.

3. Загрузитесь с системной дискеты (на ней должна быть система MS DOS с не­
обходимыми утилитами).

4. Запустите программу Disk Editor из комплекта утилит Питера Нортона. С по­
мощью встроенной справочной системы изучите основные возможности этой
утилиты.

5. Посмотрите структуру диска. Сохраните MBR и загрузочный сектор на своей
дискете.

6. Найдите таблицы размещения файлов для указанного раздела магнитного дис­
ка. Сохраните их на дискете. Выйдите из программы Disk Editor.

7. Запустите программу FDisk. Изучите структуру диска, посмотрите, сколько и
каких разделов на нем расположено?

8. Удалите все логические диски с помощью программы FDisk.

9. Перезапустите компьютер и убедитесь, что операционная система, располо­
женная раньше на магнитном диске, больше не функционирует.

10. Используя программу Disk Editor, восстановите операционную систему, а так­же файлы, расположенные на магнитном диске и созданные ранее с помощью программы Disk Editor.

Глава6. Файловыесистемы

Система управления файлами является основной в абсолютном большинстве со­временных операционных систем. Например, операционные системы UNIX ни­как не могут функционировать без файловой системы, ибо понятие файла для них является одним из самых фундаментальных. Все современные операционные сис­темы используют файлы и соответствующее программное обеспечение для рабо­ты с ними. Дело в том что, во-первых, через файловую систему связываются по данным многие системные обрабатывающие программы. Во-вторых, с помощью этой системы решаются проблемы централизованного распределения дискового пространства и управления данными. Наконец, пользователи получают более про­стые способы доступа к своим данным, которые они размещают на устройствах внешней памяти.

Существует большое количество файловых систем, созданных для разных уст­ройств внешней памяти и разных операционных систем. В них используются, соответственно, разные принципы размещения данных на носителе. В данной главе мы ограничимся рассмотрением наиболее распространенных файловых систем, с которыми мы сталкиваемся при работе на персональных компьютерах. Это системы FAT, FAT32 и NTFS. Знание основных принципов их построения необходимо не только специалисту в области вычислительной техники, но и обыч­ному пользователю. Особенно актуальными становятся знания возможностей файловой системы NTFS, которая сегодня получает все большее распростране­ние.

Наши рекомендации