Sono processi e demoni dei thread del kernel?


10

Dall'architettura del kernel Linux di Mauerer,

I thread del kernel sono processi avviati direttamente dal kernel stesso. Delegano una funzione del kernel a un processo separato e la eseguono lì in '' parallelo '' agli altri processi nel sistema (e, di fatto, parallelamente all'esecuzione del kernel stesso). I thread del kernel sono spesso indicati come demoni (kernel) . Sono utilizzati per eseguire, ad esempio, le seguenti attività:

  • Sincronizzare periodicamente le pagine di memoria modificate con il dispositivo a blocchi da cui provengono le pagine (ad es. File mappati usando mmap).
  • Scrivere pagine di memoria nell'area di scambio se vengono utilizzate di rado.
  • Per gestire le azioni differite.
  • Implementare i journal delle transazioni per i filesystem.

Fondamentalmente, ci sono due tipi di thread del kernel:

  • Tipo 1: il thread viene avviato e attende fino a quando non viene richiesto dal kernel per eseguire un'azione specifica.
  • Tipo 2: una volta avviato, il thread viene eseguito a intervalli periodici, verifica l'utilizzo di una risorsa specifica e interviene quando l'utilizzo supera o scende al di sotto di un valore limite impostato. Il kernel utilizza questo tipo di thread per attività di monitoraggio continuo.
  1. Poiché il libro di Mauerer afferma che i thread del kernel sono processi, penso che debbano essere eseguiti in modalità utente, anziché in modalità kernel. (o sbaglio? Un processo può essere eseguito in modalità utente o kernel in momenti diversi o solo una modalità?)

    Ma il kernel Linux di comprensione di Bovet afferma che i thread del kernel sono in esecuzione solo in modalità kernel (vedere la citazione seguente). I concetti di "thread del kernel" nei due libri sono lo stesso concetto?

    I sistemi Unix tradizionali delegano alcune attività critiche a processi in esecuzione intermittente, tra cui lo svuotamento delle cache del disco, lo scambio di pagine inutilizzate, la manutenzione delle connessioni di rete e così via. In effetti, non è efficiente eseguire questi compiti in modo rigorosamente lineare; sia le loro funzioni che i processi dell'utente finale ottengono una risposta migliore se sono programmati in background. Poiché alcuni dei processi di sistema vengono eseguiti solo in modalità kernel, i moderni sistemi operativi delegano le loro funzioni ai thread del kernel , che non sono gravati dal contesto della modalità utente non necessario. In Linux, i thread del kernel differiscono dai normali processi nei seguenti modi:

    • I thread del kernel vengono eseguiti solo in modalità kernel, mentre i processi regolari vengono eseguiti alternativamente in modalità kernel e in modalità utente.
    • Poiché i thread del kernel vengono eseguiti solo in modalità kernel, utilizzano solo indirizzi lineari maggiori di PAGE_OFFSET. I processi regolari, d'altra parte, usano tutti e quattro i gigabyte di indirizzi lineari, sia in modalità utente che in modalità kernel.
  2. Il libro di Mauerer dice che i thread del kernel sono avviati direttamente dal kernel e sembra anche che i demoni siano sinonimi dei thread del kernel. Quindi penso che i demoni debbano essere avviati direttamente dal kernel.

    Ma https://unix.stackexchange.com/a/193918/674 afferma che screenil demone è avviato dall'interfaccia screenutente (vedere la citazione seguente). Penso che screenl'interfaccia utente sia un processo, anziché il kernel. I concetti di daemonnel libro di Mauerer e nella risposta collegata sono lo stesso concetto?

    Al primo avvio screen, in realtà stai avviando un'interfaccia utente (ui), che per impostazione predefinita creerà un demone (il gestore della sessione).

  3. In generale, come comprendi i concetti di "thread del kernel", "processo" e "demone", le loro relazioni e le loro differenze?


Tim, wow, stai facendo delle grandi ricerche mentre ti guardo da pochi giorni.
rɑːdʒɑ

Risposte:


10

Primo: il credito va /programming/15983872/difference-between-user-level-and-kernel-supported-threads

I thread utente e i thread del kernel sono esattamente gli stessi. (Puoi vedere guardando in / proc / e vedere che ci sono anche i thread del kernel.)

Un thread utente è uno che esegue il codice dello spazio utente. Ma può chiamare nello spazio del kernel in qualsiasi momento. È ancora considerato un thread "Utente", anche se sta eseguendo il codice del kernel a livelli di sicurezza elevati.

Un thread del kernel è uno che esegue solo il codice del kernel e non è associato a un processo dello spazio utente. Questi sono come "demoni UNIX", tranne per il fatto che sono demoni solo kernel. Quindi potresti dire che il kernel è un programma multi-thread. Ad esempio, esiste un thread del kernel per lo scambio. In questo modo tutti i problemi di scambio vengono "serializzati" in un singolo flusso.

Se un thread utente ha bisogno di qualcosa, chiamerà nel kernel, che segna quel thread come inattivo. Successivamente, il thread di scambio trova i dati, quindi contrassegna il thread utente come eseguibile. Più tardi, ancora, il "thread utente" ritorna dal kernel in userland come se non fosse successo nulla.

In effetti, tutti i thread iniziano nello spazio del kernel, poiché l'operazione clone () avviene nello spazio del kernel. (E c'è un sacco di account del kernel da fare prima di poter "tornare" a un nuovo processo nello spazio utente.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.