неэффективность структуры buffer_head - PullRequest
1 голос
/ 30 марта 2011

Кто-нибудь может сказать причину, по которой структура struct buffer_head, которая использовалась до Linux Kernel 2.4, неэффективна и что реализовано в структуре struct bio, используемой в новом обновленном блочном слое из ядра 2.5.1?

Ответы [ 2 ]

4 голосов
/ 26 апреля 2012

В ядрах до 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 для записи (или чтения), и, следовательно, ввод-вывод будет выполняться в истинно параллельном режиме.

2 голосов
/ 30 марта 2011

Используйте источник, Люк!

С include/linux/buffer_head.h:

/*
 * Historically, a buffer_head was used to map a single block
 * within a page, and of course as the unit of I/O through the
 * filesystem and block layers.  Nowadays the basic I/O unit
 * is the bio, and buffer_heads are used for extracting block
 * mappings (via a get_block_t call), for tracking state within
 * a page (via a page_mapping) and for wrapping bio submission
 * for backward compatibility reasons (e.g. submit_bh).
 */
struct buffer_head {
[ ... ]

А из linux/include/bio.h:

/*
 * main unit of I/O for the block layer and lower layers (ie drivers and
 * stacking drivers)
 */
struct bio {
[ ... ]

Две функции и операции разделения ввода-вывода для «более высоких уровней» (ввод-вывод через файловые системы) и «низких уровней» (ввод-вывод через блочные устройства). Это позволяет повысить производительность, поскольку ожидающий где-то буферный слой не мешает блочному уровню выполнять работу в другом месте. Некоторое объяснение этому можно найти здесь , и Дженс Аксбо говорит об этом в этом интервью кратко.

...