Кэширование операций ввода/вывода при


Работе с накопителями на магнитных

Дисках

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

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

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

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

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

В ряде ОС имеется возможность указать в явном виде параметры кэширования, в то время как в других за эти параметры отвечает сама ОС. Так, например, в системе Windows NT нет возможности в явном виде управлять ни объёмом файлового кэша, ни параметрами кэширования. В системах Windows 95/98 та­кая возможность уже имеется, но она представляет не слишком богатый выбор. Фактически мы можем указать только объём памяти, отводимый для кэширова­ния, и объём порции данных (буфер или chunk1), из которых набирается кэш. В файле System.ini есть возможность в секции [VCACHE] прописать, например, сле­дующие значения:

[vcache]

MinFileCache=4096

MaxFileCache=32768

ChunkSize=512

Здесь указано, что минимально под кэширование данных зарезервировано 4 Мбайт оперативной памяти, максимальный объём кэша может достигать 32 Мбайт, а раз­мер данных, которыми манипулирует менеджер кэша, равен одному сектору.

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

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

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

¨ SSTF (shortest seek time – first) – с наименьшим временем поиска – первым. В соответствии с этой дисциплиной при позиционировании магнитных голо­вок следующий выбирается запрос, для которого необходимо минимальное перемещение с цилиндра на цилиндр, даже если этот запрос не был первым в очереди на ввод/вывод. Однако для этой дисциплины характерна резкая дис­криминация определенных запросов, а ведь они могут идти от высокоприори­тетных задач. Обращения к диску проявляют тенденцию концентрироваться, в результате чего запросы на обращение к самым внешним и самым внутрен­ним дорожкам могут обслуживаться существенно дольше и нет никакой гаран­тии обслуживания. Достоинством такой дисциплины является максимально возможная пропускная способность дисковой подсистемы.

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

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

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



Дата добавления: 2022-02-05; просмотров: 275;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.01 сек.