GNU/Linux >> Linux Esercitazione >  >> Linux

Linux:come interagiscono Pdflush, Kjournald, Swapd, ecc?

Recentemente ho visto una domanda che ha acceso questo pensiero. Non sono riuscito a trovare davvero una risposta qui o tramite la macchina di Google. Fondamentalmente, mi interessa sapere come è strutturata l'architettura I/O del kernel. Ad esempio, kjournald spedisci a pdflush o viceversa? La mia ipotesi è che pdflush (essendo più generico per l'I/O di archiviazione di massa) si collocherebbe a un livello inferiore e attiverebbe i comandi SCSI/ATA/qualsiasi cosa necessaria per eseguire effettivamente le scritture e kjournald gestisce le strutture di dati del filesystem di livello superiore prima di scrivere. Potrei vedere anche il contrario, però, con kjournald interfacciandosi direttamente con le strutture dati del filesystem e pdflush svegliarsi ogni tanto per scrivere pagine sporche di pagecache sul dispositivo tramite kjournald . È anche possibile che i due non interagiscano affatto per qualche altro motivo.

Fondamentalmente: Ho bisogno di un modo per visualizzare (grafico o solo una spiegazione) l'architettura di base utilizzata per inviare l'I/O alla memoria di massa all'interno del kernel Linux.

Risposta accettata:

Prima di discutere le specifiche relative a pdflush , kjournald, and kswapd`, per prima cosa facciamo un po' di background sul contesto di cosa esattamente stiamo parlando in termini di kernel Linux.

L'architettura GNU/Linux

L'architettura di GNU/Linux può essere pensata come 2 spazi:

  • Utente
  • kernel

Tra lo Spazio utente e Spazio del kernel si trova la libreria GNU C (glibc ). Ciò fornisce l'interfaccia di chiamata di sistema che connette il kernel alle applicazioni dello spazio utente.

Il Kernel Space può essere ulteriormente suddiviso in 3 livelli:

  • Interfaccia di chiamata di sistema
  • Codice del kernel indipendente dall'architettura
  • Codice dipendente dall'architettura

Interfaccia di chiamata di sistema come suggerisce il nome, fornisci un'interfaccia tra glibc e il nocciolo. Il Codice del kernel indipendente dall'architettura comprende le unità logiche come VFS (Virtual File System) e VMM (Virtual Memory Management). Il codice dipendente dall'architettura sono i componenti che costituiscono il codice specifico del processore e della piattaforma per una determinata architettura hardware.

Diagramma dell'architettura GNU/Linux

Per il resto di questo articolo, concentreremo la nostra attenzione sulle unità logiche VFS e VMM all'interno dello spazio del kernel.

Sottosistemi del kernel GNU/Linux

Sottosistema VFS

Con un concetto di alto livello di come è strutturato il kernel GNU/Linux possiamo approfondire un po' il sottosistema VFS. Questo componente è responsabile di fornire l'accesso ai vari dispositivi di archiviazione a blocchi che alla fine vengono mappati su un filesystem (ext3/ext4/ecc.) su un dispositivo fisico (HDD/ecc.).

Diagramma di VFS

Questo diagramma mostra come un write() dal processo di un utente attraversa il VFS e alla fine arriva al driver del dispositivo dove viene scritto sul supporto di archiviazione fisico. Questo è il primo posto in cui incontriamo pdflush . Questo è un demone che è responsabile dello svuotamento dei dati sporchi e dei blocchi del buffer dei metadati sul supporto di memorizzazione in background. Il diagramma non lo mostra ma c'è un altro demone, kjournald , che si trova accanto a pdflush , eseguendo un'attività simile scrivendo blocchi di giornale sporchi su disco. NOTA: I blocchi del diario sono il modo in cui i filesystem come ext4 e JFS tengono traccia delle modifiche al disco in un file, prima che avvengano.

Correlati:Cheat Sheet dei comandi della CLI di Linux

I dettagli di cui sopra sono discussi ulteriormente in questo documento.

Panoramica di write() passaggi

Per fornire una semplice panoramica delle operazioni del sistema di I/O, utilizzeremo un esempio in cui la funzione write() viene chiamato da un'applicazione User Space.

  1. Un processo richiede di scrivere un file tramite write() chiamata di sistema.
  2. Il kernel aggiorna la cache della pagina mappata sul file.
  3. Un thread del kernel pdflush si occupa di svuotare la cache della pagina su disco.
  4. Il livello del file system mette insieme ogni buffer di blocco in una bio struct (fare riferimento a 1.4.3, "Livello blocco" a pagina 23) e invia una richiesta di scrittura al livello dispositivo a blocchi.
  5. Il livello del dispositivo a blocchi riceve le richieste dai livelli superiori ed esegue un'operazione di I/O elevator e inserisce le richieste nella coda delle richieste I/O.
  6. Un driver di dispositivo come SCSI o altri driver specifici del dispositivo si occuperà dell'operazione di scrittura.
  7. Un firmware del dispositivo disco esegue operazioni hardware come la ricerca della testina, la rotazione e il trasferimento dei dati al settore sul piatto.

Sottosistema VMM

Continuando la nostra immersione più approfondita, ora possiamo esaminare il sottosistema VMM. Questo componente è responsabile del mantenimento della coerenza tra la memoria principale (RAM), lo scambio e il supporto di archiviazione fisico. Il meccanismo principale per mantenere la coerenza è bdflush . Poiché le pagine di memoria sono ritenute sporche, devono essere sincronizzate con i dati presenti sul supporto di archiviazione. bdflush si coordinerà con pdflush demoni per sincronizzare questi dati con il supporto di memorizzazione.

Diagramma di VMM

Scambia

Quando la memoria di sistema diventa scarsa o il timer di scambio del kernel scade, kswapd demone tenterà di liberare le pagine. Finché il numero di pagine libere rimane al di sopra di free_pages_high , kswapd non farà nulla. Tuttavia, se il numero di pagine libere scende al di sotto, allora kswapd avvierà il processo di reclamo della pagina. Dopo kswapd ha contrassegnato le pagine per il trasferimento, bdflush si occuperà di sincronizzare eventuali modifiche in sospeso sul supporto di memorizzazione, tramite il pdflush demoni.

Riferimenti e ulteriori letture

  • Architettura concettuale del kernel Linux
  • Il diagramma dello stack di I/O di Linux – ver. 0.1, 2012-03-06 – delinea lo stack di I/O Linux a partire dal kernel 3.3
  • Aggiornamento dei file system locali, in particolare diapositiva n. 7
  • Mappa interattiva del kernel Linux
  • Capire la memoria virtuale in Red Hat Enterprise Linux 4
  • Linee guida per l'ottimizzazione e le prestazioni di Linux, in particolare le pagine 19-24
  • Anatomia del kernel Linux
  • Il caso della replica remota sensibile alla semantica

Linux
  1. Come gestire un panico del kernel Linux

  2. Linux:come ricaricare correttamente un modulo del kernel?

  3. Come codificare un modulo del kernel Linux?

  4. Come può un kernel Linux essere così piccolo?

  5. Come posso verificare se KPTI è abilitato su Linux?

Come installare Linux Kernel 4.10.1 in Ubuntu 16.04

Come installare il kernel Linux 5.15 su Ubuntu 20.04

Come installare Linux Kernel 5.15 su AlmaLinux 8

Come installare Linux Kernel 5.15 su Debian 11

Come costruire il kernel Linux da zero

Come aggiornare il kernel Linux su varie distribuzioni [Tutorial]