Недавно увидел вопрос, который вызвал эту мысль. Не могу найти ответ здесь или через Google. По сути, мне интересно знать, как устроена архитектура ядра ввода / вывода. Например, kjournald
отправка pdflush
или наоборот? Мое предположение состоит в том, что pdflush
(будучи более общим для ввода-вывода для запоминающих устройств большой емкости) будет сидеть на более низком уровне и запускать команды SCSI / ATA / любые другие, необходимые для фактического выполнения записи, и kjournald
обрабатывать структуры данных файловой системы более высокого уровня перед записью. Я мог видеть это и с другой стороны, однако, с kjournald
непосредственным взаимодействием со структурами данных файловой системы и pdflush
просыпаясь время от времени, чтобы записать грязные страницы кэша страниц на устройство черезkjournald
, Также возможно, что эти два не взаимодействуют вообще по некоторой другой причине.
По сути: мне нужен какой-то способ для визуализации (графика или просто объяснения) базовой архитектуры, используемой для распределения ввода-вывода в массовое хранилище в ядре Linux.
Ответы:
Прежде чем мы обсудим особенности , касающиеся
pdflush
,kjournald, and
kswapd`, давайте сначала получить немного о контексте того , что именно мы говорим в терминах ядра Linux.Архитектура GNU / Linux
Архитектура GNU / Linux может рассматриваться как 2 пространства:
Между пользовательским пространством и пространством ядра находится библиотека GNU C (
glibc
). Это обеспечивает интерфейс системного вызова, который соединяет ядро с приложениями пользовательского пространства.Пространство ядра может быть разделено на 3 уровня:
Интерфейс системного вызова, как следует из его названия, обеспечивает интерфейс между
glibc
ядром и. Архитектурный Независимый Kernel Код состоит из логических единиц , таких как VFS (Virtual File System) и VMM (Virtual Memory Management). Архитектурный зависимый код является компонентами, процессор и платформо-зависимый код для конкретной аппаратной архитектуры.Схема архитектуры GNU / Linux
В оставшейся части этой статьи мы сосредоточим наше внимание на логических единицах VFS и VMM в пространстве ядра.
Подсистемы ядра GNU / Linux
Подсистема VFS
С концепцией высокого уровня того, как структурировано ядро GNU / Linux, мы можем углубиться в подсистему VFS. Этот компонент отвечает за предоставление доступа к различным блочным устройствам хранения, которые в конечном итоге отображаются на файловую систему (ext3 / ext4 / etc.) На физическом устройстве (HDD / etc.).
Схема ВФС
На этой диаграмме показано, как
write()
пользовательский процесс проходит через VFS и, в конечном счете, переходит к драйверу устройства, где он записывается на физический носитель данных. Это первое место, где мы встречаемсяpdflush
. Это демон, который отвечает за сброс грязных блоков буфера данных и метаданных на носитель данных в фоновом режиме. На диаграмме это не показано, но есть еще один демон,kjournald
который сидит рядомpdflush
, выполняя аналогичную задачу записи грязных блоков журнала на диск. ПРИМЕЧАНИЕ. Журнальные блоки - это то, как файловые системы, такие как ext4 и JFS, отслеживают изменения на диске в файле до того, как эти изменения произойдут.Вышеуказанные детали обсуждаются далее в этой статье .
Обзор
write()
шаговЧтобы обеспечить простой обзор операций системы ввода-вывода, мы будем использовать пример, когда функция
write()
вызывается приложением пространства пользователя.write()
системный вызов.bio struct
( см. 1.4.3, « Уровень блока» на стр. 23 ) и отправляет запрос на запись на уровень блочных устройств.Подсистема VMM
Продолжая наше более глубокое погружение, теперь мы можем заглянуть в подсистему VMM. Этот компонент отвечает за поддержание согласованности между основной памятью (ОЗУ), подкачкой и физическим носителем данных. Основным механизмом поддержания согласованности является
bdflush
. Поскольку страницы памяти считаются грязными, их необходимо синхронизировать с данными, находящимися на носителе.bdflush
будет координироваться сpdflush
демонами для синхронизации этих данных с носителем данных.Схема ВММ
Обмен
Когда системной памяти становится мало или истекает таймер подкачки ядра,
kswapd
демон будет пытаться освободить страницы. Пока количество свободных страниц остается вышеfree_pages_high
,kswapd
ничего не поделаешь. Однако, если количество свободных страниц упадет ниже, тоkswapd
начнется процесс восстановления страницы. После того,kswapd
как пометил страницы для перемещения,bdflush
позаботится о синхронизации любых ожидающих изменений на носителе черезpdflush
демоны.Рекомендации и дальнейшие чтения
источник