GNU/Linux >> Linux Esercitazione >  >> Linux

Perché gli spin lock sono una buona scelta in Linux Kernel Design invece di qualcosa di più comune nel codice userland, come semaphore o mutex?

Poiché la domanda implica nel dire che gli spinlock sono uno "spreco", gli spinlock dovrebbero essere tenuti solo brevemente.

Gli spinlock non sono l'unico modo per sincronizzare più thread. Anche i mutex/semafori sono usati nel kernel Linux, così come altre primitive di sincronizzazione (ad es. waitqueues, events).

Tuttavia il kernel ha a che fare con casi che lo spazio utente non vede mai, uno comune sono i gestori di interrupt. I gestori di interrupt non possono essere riprogrammati su Linux, ma spesso devono utilizzare alcune primitive di sincronizzazione (ad esempio per aggiungere un elemento di lavoro a un elenco collegato che un altro thread elaborerà ulteriormente). Poiché i gestori di interrupt non sono in grado di dormire, non possono utilizzare mutex, waitqueue, ecc. Ciò lascia praticamente spinlock. Se un thread deve sincronizzare l'accesso con un gestore di interrupt, allora deve anche utilizzare lo stesso spinlock.

Gli spinlock non sono necessariamente uno spreco. Sono ottimizzati per il caso di non contesa/non attesa e possono essere prelevati e rilasciati molto rapidamente. In tal caso sono più veloci e comportano un sovraccarico minore rispetto ad altre primitive di sincronizzazione.


La scelta tra uno spinlock e un altro costrutto che fa sì che il chiamante blocchi e rinunci al controllo di una cpuèin gran parte governata dal tempo necessario per eseguire un cambio di contesto (salvare registri/stato nel thread di blocco e ripristinare registri/stato in un altro thread). Il tempo necessario e anche il costo della cache per farlo possono essere significativi.

Se uno spinlock viene utilizzato per proteggere l'accesso ai registri hardware o simili in cui qualsiasi altro thread a cui sta accedendo impiegherà solo una questione di millisecondi o meno prima che rilasci il blocco, allora è un uso molto migliore del tempo della CPU per girare in attesa piuttosto che cambiare contesto e andare avanti.


Altri hanno risposto. Riassumerò i casi in cui useresti lo spinlock e le regole per usare lo spinlock.

1. Quando si usa lo spinlock ?

Risposta:Nelle seguenti situazioni.

  1. Il thread che detiene il lucchetto non è autorizzato a dormire.
  2. Il thread che è in attesa di un lock non dorme, ma gira in un loop stretto.

Se usato correttamente, spinlock può fornire prestazioni più elevate rispetto a semaphore.Es:gestore di intrrrupt.

2. Quali sono le regole per utilizzare gli spinlock?

Risposta:

Regola - 1:Qualsiasi codice che trattiene lo spinlock, non può cedere il processore per nessun motivo se non per interrompere il servizio (a volte nemmeno allora). Quindi il codice che contiene lo spinlock non può dormire.

Motivo:supponiamo che il tuo conducente con lo spinlock si addormenti. Es:chiama la funzione copy_from_user() o copy_to_user() , o la prelazione del kernel si attiva in modo che il processo con priorità più alta abbia messo da parte il tuo codice. Effettivamente il processo rinuncia alla CPU che trattiene lo spinlock.

Ora non sappiamo quando il codice rilascerà il lucchetto. Se qualche altro thread tenta di ottenere lo stesso blocco, girerebbe per molto tempo. Nel peggiore dei casi risulterebbe in un deedlock.

Il caso di prelazione del kernel è gestito dal codice spinlock stesso. Ogni volta che il codice del kernel contiene uno spinlock, la prelazione viene disabilitata sul relativo processore. Anche il sistema uniprocessore deve disabilitare la prelazione in questo modo.

Regola - 2:disabilita gli interrupt sulla CPU locale, mentre viene mantenuto lo spinlock.

Motivo:aiuta il tuo driver a prendere uno spinlock che controlla l'accesso al dispositivo e quindi emette un'interruzione. Ciò causa l'esecuzione del gestore di interrupt. Ora anche il gestore dell'interrupt ha bisogno del blocco per accedere al dispositivo. Se il gestore di interrupt viene eseguito sullo stesso processore, inizierà a girare. Anche il codice del driver non può essere eseguito per rilasciare il blocco. COSÌ il processore girerà per sempre.

Regola - 3:gli spinlock devono essere mantenuti per il minor tempo possibile.

Motivo:lunghi tempi di attesa del blocco impediscono anche al processore corrente di programmare, il che significa che un processo con priorità più alta potrebbe dover attendere per ottenere la CPU.

Quindi ha un impatto sulla latenza del kernel (tempo che un processo potrebbe dover attendere per essere pianificato). In genere, gli spinlock dovrebbero essere mantenuti per la durata del tempo, inferiore a quella impiegata dalla CPU per eseguire un cambio di contesto tra i thread.

Regola -4:se hai semafori e spinlock entrambi da prendere. Quindi prendi prima il semaforo e poi lo spinlock.


Linux
  1. Linux:perché Linux mostra sia più che meno memoria di quella che ho installato fisicamente?

  2. Quali sono le principali differenze tra Bsd e Gnu/linux Userland?

  3. Linux:parti proprietarie o chiuse del kernel?

  4. Linux – I diversi kernel Linux/unix sono intercambiabili?

  5. Cosa sono i codici di uscita Bash in Linux

Perché uso exa invece di ls su Linux

Linux:perché il kernel non può eseguire Init?

Linux vs Mac OS:15 motivi per utilizzare Linux invece di Mac OS

6 motivi per cui Linux non ha più app

Perché alcune persone pensano che gli account di macchine Linux con password siano più sicuri degli account senza password?

Perché il video tearing è un tale problema in Linux?