Структура bi o

Основним контейнером для операцій введення-виведення в ядрі є структура bio, яка визначена у файлі Ця структура являє активні операції блочного введення-виведення в вигляді списку сегментів (segment) Сегмент – це ділянка буфера, який є безперервним у фізичній памяті, тобто окремі буфери не обовязково повинні бути безперервними в фізичної памяті Завдяки тому, що буфер може представлятися у вигляді декількох ділянок, структура bi o дасть можливість виконувати операції блочного введення-виведення, навіть якщо дані одного буфера зберігаються в різних місцях памяті Нижче показана структура bi o з коментарями, що описують призначення кожного поля

struct bio {

*/

unsigned short bi_idx / * Поточний індекс у масиві bi_io_vec * / unsigned short bi_phys_segments / * Кількість сегментів після обєднання * / unsigned short bi_hw_segments / * Кількість сегментів після

перебудови відображення * / unsigned int bi_size / * Обсяг даних для введення-виведення * / unsigned int bi_hw_front_size / * розмір першого обєднаного сегмента * / unsigned int bi_hw_front_size / * розмір останнього обєднаного

сегмента * /

unsigned int bi_max_vecs / * Максимально можлива кількість структур bio_vecs * /

struct bio_vec * bi_io_vec / * Масив структур bio_vec * /

bio_end_io_t * bi_end_io / * Метод завершення введення-виведення * /

atomic_t bi_cnb / * Лічильник використання * /

void * bi_private / * Поле для інформації творця * /

bio_destructor_t * bi_destructor / * Деструктор * /

}

Головне призначення структури bi o – це подання активною (виконується) операції блочного введення-виведення У звязку з цим більшість полів цієї структури є службовими Найбільш важливі поля – Це bi_io_vecs, bi_vcn t і bi_idx

Структура bio

bi_io_vec         bi idx

bio_vec bio vec bio_vec bio_vec

Масив структур biovec, що містить bio_vcnt елементів

Структура page

Структура page

Структура page

Сгруктура page

Структури page, задіяні

в операції блочного введення-виведення

Рис 132 Звязок між структурами struct bio, struct b, io_vec u struct page

Поле bi_io_vec s вказує па початок масиву структур bio_vec, Ці структури використовуються як списку окремих сегментів у відповідній операції блочного введення-виведення Кожен екземпляр структури bio_vec являє собою вектор такого вигляду: <сторінка пам'яті, зсув, розмір>, який описує певний сегмент, відповідно сторінку памяті, де цей сегмент зберігається, положення блоку – зміщення всередині сторінки – і розмір блоку Масив розглянутих векторів описує весь буфер повністю Структура bio_vec визначена у файлі таким чином

struct bio_vec {

/ * Покажчик на сторінку фізичної памяті, де знаходиться цей буфер * /

struct   page   *bv_page

/ * Розмір буфера в байтах * / Unsigned int bv_len

/ * Зміщення в байтах всередині сторінки памяті, де знаходиться буфер * /

unsigned  int  bv_offset

}

Для кожної операції блочного введення-виподят створюється масив з bi_vcn t елементів типу bio_vec, початок якого міститься в поле bi _io_vecs У процесі виконання операції блочного введення-виведення поле bi_id x використовується для вказівки па поточний елемент масиву

Загалом, кожен запит на виконання блочного введення-виведення представляється за допомогою структури bio Кожен такий запит складається з одного або більше блоків, які зберігаються в масиві структур bio_vec Кожна з цих структур являє собою вектор, який описує становище у фізичній памяті кожного сегмента запиту На перший сегмент для операції введення-виведення вказує поле bi_io_vec Кожен наступний сегмент слід відразу за попереднім Всього

в масиві bi_vcn t сегментів У процесі того, як рівень блочного введення-виведення обробляє сегменти запиту, оновлюється значення поля bi_idx, щоб його значення відповідало номеру поточного сегмента На рис 132 показано звязок між структурами bio, bio_ve c і page

Поле bi_id x вказує на поточну структуру bio_ve c в масиві, що дозволяє рівню блочного введення-виведення підтримувати частково виконані операції блочного введення-виведення Однак більш важливе використання полягає в тому, що драйвери таких пристроїв, як RAID (Redundant Array of Inexpensive / Independent Disks, масив недорогих / незалежних дискових пристроїв з надмірністю – Спеціальний спосіб використання жорстких дисків, при якому один логічний тому може бути розподілений але кільком фізичним дискам для збільшення надійності або продуктивності), можуть одну структуру bio, яка спочатку була адресована одному пристрою, розбивати на кілька частин, які призначаються різним дискам RAID масиву Все, що необхідно зробити драйверу RAID, це створити необхідну кількість копій структури bio, яка призначалася для одного пристрою, і змінити для кожної копії значення поля bi_idx, щоб воно вказувало на ту частину масиву, звідки кожен диск має розпочати свою операцію введення-виведення

містить лічильник використання, яка й хранітс я в поле bi_cnt Коли значення цього поля стає рівним нулю, структура видаляється, і зайнята память звільняється Наступні дві функції дозволяють управляти лічильником використання

void bio_get(struct bio *bio)

void bio_put(struct bio *bio)

Перша збільшує на одиницю значення лічильника використання, а друга зменшує значення цього лічильника на одиницю і, якщо це значення стає рівним нулю, знищує відповідну структуру bio Перед тим як працювати з активною структурою bio, необхідно збільшити лічильник використання, щоб гарантувати, що екземпляр структури не буде видалений під час роботи Після закінчення роботи необхідно зменшити лічильник використання

І нарешті, поле bio_privat e – це поле даних творця (власника) структури Як правило, це поле необхідно зчитувати або записувати тільки тому, хто створив даний екземпляр структури bio

Порівняння старої і нової реалізацій

Між заголовками буферів і новою структурою bi o існують важливі відмінності представляє операцію введення-виведення, яка може включати одну або більше сторінок у фізичній памяті З іншого боку, заголовок буфера повязаний з одним дисковим блоком, який займає не більше однієї сторінки памяті Тому використання заголовків буферів призводить до непотрібного поділу запиту вводу-виводу на частини, розміром в один блок, тільки для того, щоб їх потім знову обєднати Робота зі структурами bi o виконується швидше, ця структура може описувати несуміжні блоки і не вимагає без необхідності розбивати операції введення-виведення на частини

Перехід о т структури struc t buffer_hea d до структур struc t bi o дозволяє отримати також й інші переваги

• може легко представляти верхню память (див главу 11), так як структура struc t bi o працює тільки зі сторінками фізичної памяті, а не з покажчиками

• може представляти як звичайні сторінкові операції вводавивода, так і операції безпосереднього (direct) введення-виведення (тобто ті, які не проходять через сторінковий кеш сторінковий кеш обговорюється в главі 15)

• дозволяє легко виконувати операції блочного введення-виведення типу розподілу-акумуляції (scatter-gather), в яких дані знаходяться в декількох сторінках фізичної памяті

• значно простіше заголовка буфера, тому що вона містить тільки мінімум інформації, необхідної для подання операції блочного введення-виведення, а не інформацію, яка повязана з самим буфером

Проте заголовки буферів все ще необхідні для функцій, які виконують відображення дискових блоків на сторінки фізичної памяті не містить ніякої інформації про стан буфера, це просто масив векторів, які описують один або більше сегментів даних однієї операції блочного введення-виведення, плюс відповідна додаткова інформація Структура buffer_hea d необхідна для зберігання інформації про буферах Застосування двох окремих структур дозволяє зробити розмір обох цих структур мінімальним

Джерело: Лав, Роберт Розробка ядра Linux, 2-е видання : Пер з англ – М: ТОВ «ІД Вільямс »2006 – 448 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*