В ядрах до 2.5, buffer_head был единицей ввода-вывода.Однако выполнение операций ввода-вывода в терминах buffer_head может быть неэффективным.Например, одна запись, охватывающая несколько блоков, приведет к созданию нескольких объектов buffer_head, тратя таким образом пространство и время.Таким образом, структура buffer_head лучше всего использовать для обеспечения сопоставления блочной и физической памяти , которое является именно тем, что оно делает (и то, что делает only ), начиная с ядра 2.5 и далее..
С другой стороны, struct bio разработана как единица ввода-вывода в последующих выпусках ядра. ** Она представляет active IO в настоящее время находятся в ядре . ** Обратите внимание, что отображение блока в память все еще поддерживается в buffer_head.Тем не менее, buffer_head теперь не перегружен полями, которые содержат информацию о текущем активном IO.Таким образом, когда код более высокого уровня, такой как файловая система, выдает IO, запрос добавляется в request_queue.Запрос в свою очередь содержит указатель на биоструктуру.Драйвер устройства, управляющий устройством, на котором выдается IO, принимает запрос и обслуживает его.
Структура struct bio также используется для разделения ввода-вывода, например, драйверами дисковых устройств RAID.Посмотрите на определение struct bio и вы обнаружите, что оно поддерживает массив io_vectors (которые являются ничем иным, как смещением страниц памяти).Кроме того, bi_idx используется для индексации этих io_vec.Используя разные значения bi_idx для разных дисков, каждый диск получит свой набор io_vec для записи (или чтения), и, следовательно, ввод-вывод будет выполняться в истинно параллельном режиме.