Nedávno jsem viděl otázku, která vyvolala tuto myšlenku. Zde nebo prostřednictvím stroje Google jsem skutečně nenašel odpověď. V podstatě mě zajímá, jak je architektura I/O jádra vrstvená. Například kjournald
odeslat do pdflush
nebo naopak? Můj předpoklad je, že pdflush
(je obecnější k I/O velkokapacitního úložiště) by seděl na nižší úrovni a spouštěl příkazy SCSI/ATA/cokoli, co je nezbytné k provedení zápisu, a kjournald
zpracovává datové struktury souborového systému vyšší úrovně před zápisem. Viděl jsem to ale i obráceně, s kjournald
přímé propojení s datovými strukturami souborového systému a pdflush
každou chvíli se probouzet a zapisovat do zařízení špinavé stránky mezipaměti pomocí kjournald
. Je také možné, že tito dva spolu z nějakého jiného důvodu vůbec neinteragují.
V zásadě: Potřebuji nějaký způsob, jak vizualizovat (graf nebo jen vysvětlení) základní architekturu používanou pro odesílání I/O do velkokapacitního úložiště v rámci linuxového jádra.
Přijatá odpověď:
Než probereme specifika týkající se pdflush
, kjournald, and
kswapd`, pojďme nejprve získat trochu pozadí kontextu toho, o čem přesně mluvíme v souvislosti s linuxovým jádrem.
Architektura GNU/Linux
Architekturu GNU/Linuxu si lze představit jako 2 prostory:
- Uživatel
- Jádro
Mezi Uživatelským prostorem a Kernel Space sídlí v knihovně GNU C (glibc
). To poskytuje rozhraní systémového volání, které spojuje jádro s aplikacemi v uživatelském prostoru.
Prostor jádra lze dále rozdělit do 3 úrovní:
- Rozhraní systémového volání
- Architectural Independent Kernel Code
- Architectural Dependent Code
Rozhraní systémového volání jak název napovídá, poskytuje rozhraní mezi glibc
a jádro. Architectural Independent Kernel Code se skládá z logických jednotek, jako je VFS (Virtual File System) a VMM (Virtual Memory Management). Architectural Dependent Code jsou komponenty, které jsou kódem specifickým pro procesor a platformu pro danou hardwarovou architekturu.
Schéma architektury GNU/Linux
Po zbytek tohoto článku se zaměříme na logické jednotky VFS a VMM v prostoru jádra.
Subsystémy jádra GNU/Linux
Podsystém VFS
S konceptem vysoké úrovně struktury jádra GNU/Linux se můžeme ponořit trochu hlouběji do subsystému VFS. Tato komponenta je zodpovědná za poskytování přístupu k různým blokovým úložným zařízením, která se nakonec mapují na souborový systém (ext3/ext4/atd.) na fyzickém zařízení (HDD/atd.).
Schéma VFS
Tento diagram ukazuje, jak write()
z uživatelského procesu prochází VFS a nakonec se propracuje až k ovladači zařízení, kde je zapsán na fyzické paměťové médium. Toto je první místo, kde se setkáváme s pdflush
. Toto je démon, který je zodpovědný za vyprázdnění špinavých dat a bloků vyrovnávací paměti metadat na paměťové médium na pozadí. Diagram to neukazuje, ale existuje další démon, kjournald
, který se nachází vedle pdflush
, provádějící podobnou úlohu zapisování špinavých bloků žurnálu na disk. POZNÁMKA: Žurnálové bloky je způsob, jakým souborové systémy jako ext4 a JFS sledují změny na disku v souboru předtím, než k těmto změnám dojde.
Výše uvedené podrobnosti jsou dále diskutovány v tomto dokumentu.
Přehled funkce write()
kroky
Abychom poskytli jednoduchý přehled operací I/O sybsystému, použijeme příklad, kde funkce write()
je volána aplikací uživatelského prostoru.
- Proces požaduje zapsání souboru pomocí
write()
systémové volání. - Jádro aktualizuje mezipaměť stránky namapovanou na soubor.
- O vyprázdnění mezipaměti stránek na disk se stará vlákno jádra pdflush.
- Vrstva souborového systému spojuje každý blokový buffer do
bio struct
(viz 1.4.3, „Vrstva blokování“ na straně 23) a odešle požadavek na zápis do vrstvy blokového zařízení. - Vrstva blokového zařízení přijímá požadavky z vyšších vrstev a provádí operaci výtahu I/O a umísťuje požadavky do fronty požadavků I/O.
- O operaci zápisu se postará ovladač zařízení, například SCSI nebo jiné ovladače specifické pro zařízení.
- Firmware diskového zařízení provádí hardwarové operace, jako je vyhledávací hlava, rotace a přenos dat do sektoru na plotně.
Podsystém VMM
Pokračujeme v hlubším ponoru a nyní se můžeme podívat do subsystému VMM. Tato komponenta je zodpovědná za udržování konzistence mezi hlavní pamětí (RAM), swapem a fyzickým paměťovým médiem. Primárním mechanismem pro udržení konzistence je bdflush
. Protože jsou stránky paměti považovány za nečisté, je třeba je synchronizovat s daty, která jsou na paměťovém médiu. bdflush
bude koordinovat s pdflush
démony pro synchronizaci těchto dat s paměťovým médiem.
Schéma VMM
Vyměnit
Když dojde k nedostatku systémové paměti nebo vyprší časovač swapování jádra, kswapd
démon se pokusí uvolnit stránky. Pokud počet volných stránek zůstane nad free_pages_high
, kswapd
neudělá nic. Pokud však počet volných stránek klesne níže, pak kswapd
zahájí proces obnovení stránky. Po kswapd
označil stránky pro přemístění, bdflush
se postará o synchronizaci všech zbývajících změn na paměťovém médiu prostřednictvím pdflush
démoni.
Odkazy a další informace
- Konceptuální architektura linuxového jádra
- Linuxový I/O Stack Diagram – ver. 0.1, 2012-03-06 – popisuje linuxový I/O stack od jádra 3.3
- Aktualizace místního souborového systému – konkrétně snímek č. 7
- Interaktivní mapa jádra Linuxu
- Porozumění virtuální paměti v Red Hat Enterprise Linux 4
- Pokyny pro výkon a ladění Linuxu – konkrétně strany 19–24
- Anatomie linuxového jádra
- Případ pro sémantické vědomé vzdálené replikace