Сторінковий кеш

Як випливає з назви, сторінковий кеш (page cache) – це кеш сторінок памяті Відповідні сторінки памяті виходять в результаті читання і запису звичайних файлів на файлових системах, спеціальних файлів блочних пристроїв і файлів, що відображаються в память Таким чином, в сторінковому кеші містяться сторінки памяті, повністю заповнені даними з файлів, до яких тільки що проводився доступ Перед виконанням операції сторінкового введення-виведення, як, наприклад, read () 1, ядро ​​перевіряє, чи є ті дані, які потрібно вважати, в сторінковому кеші Якщо дані знаходяться в кеші, то ядро ​​може швидко повернути необхідну сторінку памяті

Обєкт address_space

Фізична сторінка памяті може містити дані з декількох несуміжних

фізичних дискових блоков2

1 Як було показано в главі 12, Віртуальна файлова я система , операци і сторінкового введення-виведення безпосередньо про виполняютса я не системним і викликами read () і write (), а специфічним і для файлових систем методамиfile-&gtf_op-&gtread( )          іfile~&gtf_op-&gtwriie()

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

512 байт Отже, в одній сторінок е памят і може зберігатися 8 блоків Блок і не обовязково повинні бути суміжними, так як один фай л може бути фізична і розкиданим по диску

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

Більш того, сторінковий кеш ядра Linux є сховищем даних досить загального характеру відносно того, які сторінки памяті в ньому можуть кешуватися Спочатку сторінковий кеш був запропонований в операційній системі System V (SVR 4) для кешування тільки даних з файлових систем Отже, для управління сторінковим кешем операційної системи SVR 4 використовувався еквівалент файлового обєкта, який називався struc t vnode Кеш операційної системи Linux розроблявся з метою кешування будь-яких обєктів, заснованих на сторінках памяті, що включає безліч типів файлів і відображень в память

Для отримання необхідної спільності в сторінковому кеші операційної системи Linux використовується структура address_space (адресний простір), яка дозволяє ідентифікувати сторінки памяті, що знаходяться в кеші Ця структура визначена у файлі таким чином

struct address_space {

struct inode          *host struct radix_tree_root page_tree spinlock_ t            tree_lock unsigned int         i_mmap_wrltable

struct prio_tree_root i_mmap

struct list_head      i_mmap_nonlinear spinlock_t           i_mmap_lock atomic_t             truncate_counl unsigned long        nrpages

pgoff_t              writeback_index

struct address_space_operations *a_ops

unsigned long        flags

/ * Файловий індекс, якому належить обєкт * /

/ * Базисне дерево всіх сторінок * /

/ * Блокування для захисту поля page_tree * /

/ * Кількість областей памяті

з прапором VM_SHARED * /

/ * Список всіх відображень * /

/ * Список областей памяті

з прапором VM_NONLINEAR * /

/ * Блокування поля i_mmap * /

/ * Лічильник запитів truncate * /

/ * Загальна кількість сторінок * /

/ * Зміщення початку зворотного запису * /

/ * Таблиця операцій * /

/ * Маска gfp_mask і прапори помилок * /

struct backing_dev_info * backing_dev_info / * Інформація попереджувального читання * /

spinlock_t          private_lock struct list_head   private_list struct address_spacs   *assoc_mapping

}

/ * Блокування для приватних відображень * /

/ * Список приватних відображень * /

/ * Відповідні буфери * /

Поле i_mmap – це Дерепи пошуку за пріоритетами для всіх спільно використовуваних і приватних відображень Дерево пошуку за пріоритетами-це хитра суміш базисних і частково впорядкованих бінарних деревьев3

Всього в адресному просторі nrpages сторінок памяті

3 реалізацій я ядра заснована на базисному дерев е пошуку за пріоритетами, запропонованого м в робіт е

Edward M McCreight, опубліковано й в журналі SIAM Journa l of Computing, May 1985, vol 14

№2 , P 257-276

Обєкт addressspac e повязаний з деяким іншим обєктом ядра, зазвичай з файловим індексом Якщо це так, то поле hos t вказує на відповідний файловий індекс Якщо значення поля hos t одно NULL, то відповідний обєкт не є файловим індексом наприклад, обєкт address_space може бути повязаний з процесом підкачки сторінок (swapper)

Поле a_ops вказує на таблицю операгцій з адресним простором так само, як і у випадку обєктів підсистеми VFS Таблиця операцій представлена ​​за допомогою структури struc t address_space_operations, яка визначена у файлі

таким чином

struct address_space_operations {

int (*writepage) (struct page *, struct writeback_control *)

int (*readpage) (struct file *, struct page *)

int (*sync_page) (struct page *)

int (*writepages) (struct address_space *, structwriteback_control*)

int (*set_page_dirty) (struct page *)

int (*readpages) (struct file *, struct address_space *, struct list_head *, unsigned)

int (*prepare_write) (struct file *, struct page *, unsigned, unsigned)

int (*commit_write) (struct file *, struct page *, unsigned, unsigned)

sector_t (*bmap)(struct address_space *, sector_t) int (*invalidatepage) (struct page *, unsigned long) int (*releasepage) (struct page *, int)

int (*direct_IO) (int, struct kiocb *, const struct iovec *,

loff_t, unsigned long)

}

Методи read_pag e і write_pag e є найбільш важливими Розглянемо кроки, які виконуються при сторінкової операції читання

Методу читання в якості параметрів передається пара значень: обєкт address _ spac e і зсув Ці значення використовуються таким чином для пошуку необхідних даних в сторінковому кеші

page = find_get_page(mapping, index)

де параметр mapping – це заданий адресний простір, a inde x задана позиція у файлі

Якщо в кеші немає необхідної сторінки памяті, то нова сторінка памяті виділяється і додається в кеш таким чином

struct page *cached_page

int error

cached_page = page_cache_alloc_cold (mapping)

if (cached_page)

/ * Помилка виділення памяті * /

error = add_to_page_cache_lru (cached_page, mapping, index, GFP_KERNEL)

if (error)

/ * Помилка додавання сторінки памяті в сторінковий кеш * /

Нарешті, необхідні дані можуть бути лічені з диска, додані в сторінковий кеш і повернуті користувачеві Це робиться таким чином

error = mapping-&gta_ops-&gtreadpage(file, page)

Операції запису дещо відрізняються Для відображуваних в память файлів при зміні сторінки памяті система управління віртуальною памяттю просто викликає наступну функцію

SetPageDirty(page)

Ядро виконує запис цієї сторінки памяті пізніше за допомогою виклику методу writepag e () Операції запису для файлів, відкритих звичайним чином (без відображення в память), виконуються більш складним шляхом В основному, загальна операція запису, яка реалізована у файлі mm / filemapс, включає наступні кроки

page =  grab_cache_page(mapping, index, &ampcached_page, &amplru_pvec) status a_ops-&gtprepare_write(file, page, offset, offset+bytes) page_fault = filemap_copy_from_user(page, offset, buf, bytes) status = a_ops-&gtcommit_write(file, page, offset, offset+bytes}

Виконується пошук необхідної сторінки памяті в кеші Якщо така сторінка в кеші не знайдено, то створюється відповідний елемент кеша Потім викликається метод prepare_writ e (), щоб підготувати запит на запис Після цього дані копіюються з простору користувача в буфер памяті в просторі ядра І нарешті дані записуються на диск за допомогою функції comnit_writ e ()

Оскільки всі описані кроки виконуються при всіх операціях сторінкового введення-виведення, то всі операції сторінкового введення-виведення виконуються тільки через сторінковий каш Ядро намагається виконати всі запити читання з сторінкового кеша Якщо цього зробити не вдається, то сторінка зчитується з диска і додається в сторінковий кеш Для операцій запису сторінковий кеш виконує роль стартовою майданчика . Отже, всі записані сторінки також додаються в сторінковий кеш

Джерело: Лав, Роберт Розробка ядра 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>

*

*