Планировщик ввода/вывода
Хотя драйверы блочных устройств способны передавать один сектор за раз, общий слой работы с блочными устройствами не выполняет отдельную операцию для каждого сектора. Это сильно понизило бы производительность диска, поскольку поиск физического положения сектора на поверхности диска требует много времени. Ядро пытается, по возможности, сгруппировать несколько секторов и обрабатывать их как единое целое, уменьшая тем самым среднее число перемещений головки.
Когда компоненту ядра нужно прочитать или записать какие-то данные, он фактически создает запрос к блочному устройству. Этот запрос описывает потребность в секторах, и какая операция (чтение или запись) должна быть выполнена над ними. Однако ядро не удовлетворяет запрос непосредственно после его создания. Операция ввода/вывода планируется, но будет выполнена позже. Эта искусственная задержка парадоксальным образом повышает производительность блочных устройств. Когда запрашивается передача нового блока, ядро проверяет, можно ли его удовлетворить, чуть расширив предыдущий запрос, который еще ждет своего выполнения (то есть можно ли выполнить новый запрос без дополнительных операций поиска). Поскольку обращения к диску, как правило, являются последовательно, этот механизм очень эффективен.
Откладывание запросов на более позднее время усложняет работу с блочными устройствами. Предположим, например, что процесс открывает обычный файл, и, следовательно, драйвер файловой системы хочет прочитать с диска соответствующий индексный дескриптор. Драйвер блочного устройства ставит запрос в очередь, и процесс приостанавливается, пока не будет передан блок, в котором хранится индексный дескриптор. Однако драйвер блочного устройства сам не может быть блокирован, потому что тогда любой другой процесс, пытающийся обратиться к тому же диску, тоже будет блокирован.
Чтобы не допустить приостановки драйвера блочного устройства, каждая операция ввода/вывода обрабатывается асинхронно. В частности, драйверы блочных устройств управляются прерываниями Общий слой работы с блочными устройствами вызывает планировщик ввода/вывода для создания нового запроса к блочному устройству или расширения уже существующего запроса и заканчивает свою работу. Драйвер блочного устройства, активизируемый чуть позже, вызывает процедуру-стратега, чтобы та выбрала "подвешенный" запрос и удовлетворила его, выдав необходимые команды контроллеру диска. Когда операция ввода/вывода завершается, контроллер диска возбуждает прерывание, и соответствующий обработчик снова вызывает процедуру-стратега для обработки другого ждущего запроса, если это необходимо.
Каждый драйвер блочного устройства поддерживает собственную очередь запросов, которая содержит список запросов к устройству, ожидающих выполнения. Если контроллер диска управляет несколькими дисками, то для каждого физического блочного устройства обычно существует одна очередь запросов. Планирование ввода/вывода выполняется для каждой очереди запросов отдельно, что повышает производительность.
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница