206
Например, современные процессоры за один такт работы, а они работают
уже с частотами в 1 ГГц и более, могут выполнять по две операции. Таким
образом, время выполнения операции (с позиции внешнего наблюдателя,
не видящего конвейеризации при выполнении машинных команд, благо-
даря которой производительность возрастает в несколько раз) может со-
ставлять 0,5 нс (!). В
то же время переход магнитной головки с дорожки на
дорожку составляет несколько миллисекунд. Такие же временные интер-
валы имеют место и при ожидании, пока под головкой чтения/ записи не
окажется нужный сектор данных. Как известно, в современных приводах
средняя длительность на чтение случайным образом выбранного сектора
данных составляет около 20 мс,
что существенно медленнее, чем выборка
команды или операнда из оперативной памяти и уж тем более из кэша.
Правда, после этого данные читаются большим пакетом (сектор, как мы
уже говорили, имеет размер в 512 байтов, а при операциях с диском часто
читается или записывается сразу несколько секторов). Таким образом,
средняя скорость работы процессора
с оперативной памятью на 2-3 поряд-
ка выше, чем средняя скорость передачи данных из внешней памяти на
магнитных дисках в оперативную память.
Для того чтобы сгладить такое сильное несоответствие в производи-
тельности основных подсистем, используется буферирование и/или кэши-
рование данных. Простейшим вариантом ускорения дисковых операций
чтения данных можно считать использование
двойного буферирования.
Его суть заключается в том, что пока в один буфер заносятся данные с
магнитного диска, из второго буфера ранее считанные данные могут быть
прочитаны и переданы запросившей их задаче. Аналогичный процесс про-
исходит и при записи данных. Буферирование используется во всех опе-
рационных системах, но помимо буферирования применяется и
кэширо-
вание. Кэширование исключительно полезно в том случае, когда програм-
ма неоднократно читает с диска одни и те же данные. После того как они
один раз будут помещены в кэш, обращений к диску больше не потребу-
ется и скорость работы программы значительно возрастет.
Если не вдаваться в подробности, то под
кэшем можно понимать некий
пул буферов, которыми мы управляем с помощью соответствующего сис-
темного процесса. Если мы считываем какое-то множество секторов, со-
держащих записи того или иного файла, то эти данные, пройдя через кэш,
там остаются (до тех пор, пока другие секторы не заменят эти буферы).
Если впоследствии потребуется повторное
чтение, то данные могут быть
извлечены непосредственно из оперативной памяти без фактического об-
ращения к диску. Ускорить можно и операции записи: данные помещают-
ся в кэш, и для запросившей эту операцию задачи можно считать, что они
уже фактически и записаны. Задача может продолжить свое выполнение, а
системные внешние процессы через
некоторое время запишут данные на
диск. Это называется операцией отложенной записи (lazy write, “ленивая
запись”). Если отложенная запись отключена, только одна задача может