Премного благодарю за обьяснение, сударь (или мсье?)
Позвольте обратить Ваше внимание на следующий момент:
В любой момент времени для даной очереди запросов к даному устройству есть только один активный запрос (который сейчас отрабатывает механика устройства).
Все остальные запросы ждут своей очереди в очереди устройства (хардварной очереди самого устройства если это например scsi-винт или рейд или софтовой очереди драйвера устройства, например ata() для каждого канала держит свою очередь)Задержка отправки запроса на устройство приводит к тому, что его в очереди самого устройства не будет вообще эти 2-5ms.
А теперь рассмотрим последовательное выполнение запросов из очереди в порядке возрастания offset каждого bio
пусть в очереди лежат запросы ... , A < B, ...
пришел запрос Y , такой что A < Y < B - мы отложили этот запрос Y в надежде что появится другой перед ним, не шлем его драйверу устройства
но допустим что нагрузка есть, очередь устройства не пуста, драйвер шлет запросы из нее по одному, и вот он выполнил последний запрос A у которого offset меньше чем у запроса Y
что теперь ?
теперь драйвер пошлет устройству запрос B у которого offset больше A
даже если теперь положить Y в очередь - ему придется ждать полного цикла пока очередь опять дойдет к нему.
Даже если после выполнения A появится запрос X, который имеет offset A < X < Y < B - его уже бесполезно слать вместе с Y устройству в его очередь, поскольку устройство уже занято B
Согласен, что если X появится до выполнения A, то его можно успеть положить с Y вместе в очередь и оптимальный порядок нарушен не будет, но это произошло бы и в том случае если бы мы вообще не вводили никаких задержек.