Буферы и заголовки буферов

Буферы и заголовки буферов

Когда блок хранится в памяти (скажем, после считывания или в ожидании записи), то он хранится в структуре данных, называемой буфером (buffer). Каждый буфер связан строго с одним блоком. Буфер играет роль объекта, который представляет блок в оперативной памяти. Вспомним, что блок состоит из одного или больше секторов, но по размеру не может быть больше одной страницы памяти. Поэтому одна страница памяти может содержать один или больше блоков. Поскольку для ядра требуется некоторая управляющая информация, связанная с данными (например, какому блочному устройству и какому блоку соответствует буфер), то каждый буфер связан со своим дескриптором. Этот дескриптор называется заголовком буфера (buffer head) и представляется с помощью структуры struct buffer_head.

Структура buffer_head содержит информацию, которая необходима ядру для управления буферами и определена в файле <linux/buffer_head.h>.

Рассмотрим эту структуру с комментариями, которые описывают назначение каждого поля.

struct buffer_head {

 unsigned long       b_state;         /* флаги состояния буфера */

 atomic_t            b_count;         /* счетчик использования буфера */

 struct buffer_head  *b_this_page;    /* список буферов в текущей

                                         странице памяти */

 struct page         *b_page;  /* соответствующая страница памяти */

 sector_t            b_blocknr;       /* логический номер блока */

 u32                 b_size;          /* размер блока (в байтах) */

 char                *b_data;  /* указатель на буфер в странице памяти */

 struct block_device *b_bdev;  /* соответствующее блочное устройство */

 bh_end_io_t         *b_end_io;       /* метод завершения ввода-вывода */

 void                *b_private;      /* данные метода завершения */

 struct list_head    b_assoc_buffers; /* список связанных отображений */

};

Поле b_state содержит состояние определенного буфера. Это значение может содержать один или несколько флагов, которые перечислены в табл. 13.1. Возможные значения флагов описаны в виде перечисления bh_state_bits, которое описано в файле <linux/buffer_head.h>.

Таблица 13.1. Значения флагов поля bh_state

Флаг состояния Назначение
BH_Uptodate Буфер содержит действительные данные
BH_Dirty Буфер изменен (содержимое буфера новее соответствующих данных на диске, и поэтому буфер должен быть записан на диск)
BH_Lock Для буфера выполняется операция чтения-записи дисковых данных, и буфер заблокирован, чтобы предотвратить конкурентный доступ
BH_Req Буфер включен в запрос
BH_Mapped Буфер является действительным и отображается на дисковый блок
BH_New Буфер только что выделен и к нему еще не было доступа
BH_Async_Read Для буфера выполняется асинхронная операция чтения
BH_Async_Write Для буфера выполняется асинхронная операция записи
BH_Delay С буфером еще не связан дисковый блок
BH_Boundary Буфер является последним в последовательности смежных блоков — следующий за ним блок не является смежным с этой серией

Перечисление bh_state_bits также содержит в качестве последнего элемента флаг BH_PrivateStart. Этот флаг не является разрешенным значением флага, а соответствует первому биту, который можно использовать по усмотрению разработчиков кода. Все биты, номер которых больше или равен значению BH_PrivateStart, не используются подсистемой блочного ввода-вывода и безопасно могут использоваться драйверами, которым необходимо хранить информацию в поле b_state.

Флаги, которые используются драйверами, могут быть определены на основании значения этого флага, что позволяет гарантированно избежать перекрытия с битами, которые официально используются уровнем блочного ввода-вывода.

Поле b_count — это счетчик использования буфера. Значение этого поля увеличивается и уменьшается двумя функциями, которые определены в файле <linux/buffer_head.h> следующим образом.

static inline void get_bh(struct buffer_head *bh) {

 atomic_inc{&bh->b_count);

}

static inline void put_bh(struct buffer_head *bh) {

 atomic_dec(&bh->b_count);

}

Перед тем как манипулировать заголовком буфера, необходимо увеличить значение счетчика использования с помощью функции get_bh(), что гарантирует, что во время работы буфер не будет освобожден. Когда работа с заголовком буфера закончена, необходимо уменьшить значение счетчика, ссылок с помощью функции put_bh().

Физический блок на жестком диске, которому соответствует буфер, — это блок с логическим номером b_blocknr, который находится на блочном устройстве b_bdev.

Физическая страница памяти, в которой хранятся данные буфера, соответствует значению поля b_page. Поле b_data — это указатель прямо на данные блока (которые хранятся где-то в странице памяти b_page), размер блока хранится в поле b_size. Следовательно, блок хранится в памяти, начиная с адреса b_data и заканчивая адресом (b_data + b_size).

Назначение заголовка буфера — это описание отображения между блоком на диске и буфером в физической памяти (т.е. последовательностью байтов, которые хранятся в указанной странице памяти). Выполнение роли дескриптора отображения буфер-блок — единственное назначение этой структуры данных ядра.

В ядрах до серии 2.6 заголовок буфера был значительно более важной структурой данных. По существу, это была единица ввода-вывода данных в ядре. Он не только выполнял роль дескриптора для отображения буфер-блок-страница физической памяти, но и выступал контейнером для всех операций блочного ввода-вывода. Это приводило к двум проблемам. Первая проблема заключалась в том, что заголовок буфера был большой и громоздкой структурой данных (сегодня он несколько уменьшился в размерах), а кроме того, выполнение операций блочного ввода-вывода в терминах заголовков буферов было непростой и довольно непонятной задачей. Вместо этого, ядру лучше работать со страницами памяти, что одновременно и проще и позволяет получить большую производительность. Использовать большой заголовок буфера, описывающий отдельный буфер (который может быть размером со страницу памяти), — неэффективно. В связи с этим в ядрах серии 2.6 было сделано много работы, чтобы дать возможность ядру выполнять операции непосредственно со страницами памяти и пространствами адресов, вместо операций с буферами. Некоторые из этих операций обсуждаются в главе 15, "Страничный кэш и обратная запись страниц", где также рассматривается структура address_space и демоны pdflush.

Вторая проблема, связанная с заголовками буферов, — это то, что они описывают только один буфер. Когда заголовок буфера используется в качестве контейнера для операций ввода-вывода, то это требует, чтобы ядро разбивало потенциально большую операцию блочного ввода-вывода на множество мелких структур buffer_head, что в свою очередь приводит к ненужным затратам памяти для храпения структур данных. В результате, основной целью при создании серии ядра 2.5 была разработка нового гибкого и быстрого контейнера для операций блочного ввода-вывода. В результат появилась структура bio, которая будет рассмотрена в следующем разделе.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

3.1 ЗАГОЛОВКИ БУФЕРА

Из книги Архитектура операционной системы UNIX автора Бах Морис Дж

3.1 ЗАГОЛОВКИ БУФЕРА Во время инициализации системы ядро выделяет место под совокупность буферов, потребность в которых определяется в зависимости от размера памяти и производительности системы. Каждый буфер состоит из двух частей: области памяти, в которой хранится


3.2 СТРУКТУРА ОБЛАСТИ БУФЕРОВ (БУФЕРНОГО ПУЛА)

Из книги Информационная технология ПРОЦЕСС СОЗДАНИЯ ДОКУМЕНТАЦИИ ПОЛЬЗОВАТЕЛЯ ПРОГРАММНОГО СРЕДСТВА автора Автор неизвестен

3.2 СТРУКТУРА ОБЛАСТИ БУФЕРОВ (БУФЕРНОГО ПУЛА) Ядро помещает информацию в область буферов, используя алгоритм поиска буферов, к которым наиболее долго не было обращений: после выделения буфера дисковому блоку нельзя использовать этот буфер для другого блока до тех пор,


8.2.3.7 Заголовки

Из книги Реферат, курсовая, диплом на компьютере автора Баловсяк Надежда Васильевна


8.2.4.3.5 Заголовки

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард


1.4. Заголовки

Из книги Серверные технологии хранения данных в среде Windows® 2000 Windows® Server 2003 автора Дайлип Наик

1.4. Заголовки Текст работы обычно разбивается на структурные части: содержание, введение, выводы, список использованных источников, приложения, а также на разделы и подразделы. Разделы нумеруют арабскими цифрами, начиная с единицы. В заголовке раздела указывают его номер,


10.11. Несколько буферов

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов. автора Дронов Владимир

10.11. Несколько буферов Во многих программах, обрабатывающих какие-либо данные, можно встретить цикл видаwhile ((n = read(fdin, buff, BUFFSIZE)) > 0) { /* обработка данных */ write(fdout, buff, n);}Например, программы, обрабатывающие текстовые файлы, считывают строку из входного файла, выполняют с ней


1.6 Драйверы и буферы ввода-вывода

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов автора Дронов Владимир

1.6 Драйверы и буферы ввода-вывода В этом разделе рассматриваются буферы ввода-вывода, которые уже упоминались ранее в главе. Драйверы используют буферы для осуществления ввода-вывода и управления им (IOCTL). Для этого драйверы посредством соответствующего объекта


Заголовки

Из книги Видеосамоучитель создания реферата, курсовой, диплома на компьютере автора Баловсяк Надежда Васильевна

Заголовки Помимо абзацев, большой текст для удобства чтения и поиска в нем нужного фрагмента обычно делят на более крупные части: параграфы, главы, разделы. HTML не предоставляет средств для такого структурирования текста. Но он позволяет создать заголовки, которые делят


Заголовки

Из книги Как раскрутить и разрекламировать Web-сайт в сети Интернет автора Загуменов Александр Петрович

Заголовки Помимо абзацев, большой текст для удобства чтения и поиска в нем нужного фрагмента обычно делят на более крупные части: параграфы, главы, разделы. HTML не предоставляет средств для такого структурирования текста. Но он позволяет создать заголовки, которые делят


1.4. Заголовки

Из книги Язык Си - руководство для начинающих автора Прата Стивен

1.4. Заголовки Текст работы обычно разбивается на структурные части: содержание, введение, разделы и подразделы, выводы, список использованных источников, приложения. Разделы нумеруют арабскими цифрами, начиная с единицы. В заголовке раздела указывают его номер, после


Заголовки

Из книги HTML5 для веб-дизайнеров автора Джереми Кит

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


БУФЕРЫ

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

БУФЕРЫ      При выполнении данной программы (любой из двух ее версий) вводимый символ в одних вычислительных системах немедленно появляется на экране ("эхо-печать"), в других же ничего не происходит до тех пор, пока вы не нажмете клавишу [ввод]. Первый случай относится к так


Заголовки

Из книги Операционная система UNIX автора Робачевский Андрей М.

Заголовки Браузеры еще не начали поддерживать новый алгоритм содержания в HTML5, но вы все равно можете начать использовать доступные вам дополнительные уровни заголовков.Джоффри Снеддон (Geoffrey Sneddon) написал очень полезную онлайн-утилиту, которая сгенерирует содержание


8.4. Функции fsync() и fdatasync(): очистка дисковых буферов

Из книги Готовимся к пенсии: осваиваем Интернет автора Ахметзянова Валентина Александровна

8.4. Функции fsync() и fdatasync(): очистка дисковых буферов В большинстве операционных систем при записи в файл данные не передаются на диск немедленно. Вместо этого операционная система помещает их в резидентный кэш-буфер с целью сокращения числа обращений к диску и повышения


Заголовки

Из книги автора

Заголовки Использование системных функций обычно требует включения в текст программы файлов заголовков, содержащих определения функций — число передаваемых аргументов, типы аргументов и возвращаемого значения. Большинство системных файлов заголовков расположены в


Заголовки

Из книги автора

Заголовки Обычно в каждом тексте имеются заголовки разных уровней. Самый крупный заголовок называется заголовком 1-го уровня, самый маленький — 6-го. Тегами заголовков служат парные теги <Hn> и </Hn>, где n — номер уровня заголовка. Вернемся к нашему шаблону shablon.html и