Un kernel del sistema operativo è un singleton?

1

A mio modo di vedere, un modello di progettazione singleton è dove abbiamo solo un'istanza di un oggetto in un sistema.

Non sono sicuro su questa parte della definizione, ma credo che in un sistema operativo ci sia solo un kernel in esecuzione in modalità supervisore.

Quindi, è corretto dire che un kernel del sistema operativo è un esempio di un singleton?

    
posta Decimak 14.08.2018 - 03:54
fonte

3 risposte

10

No. Un Singleton è un modello per la programmazione orientata agli oggetti. La maggior parte dei sistemi operativi non sono progettati in questo modo. In effetti, pochissimi sistemi operativi utilizzano la programmazione orientata agli oggetti nel kernel. Linux è noto per non usare consapevolmente C ++ (orientato agli oggetti) e attaccato a C (procedurale).

Anche se pensavi a un kernel del sistema operativo come solo uno di qualcosa, in cui ne vorresti uno solo, l'intero concetto di virtualizzazione si trasforma poi in quello che è all'orecchio. Le macchine virtuali ospitano altri kernel nello stesso hardware. Quindi quando parli di containerizzazione, hai altri kernel ospitati nel tuo sistema operativo.

Per essere onesti, un singleton come pattern dovrebbe essere uno dei modelli meno utilizzati, anche se si desidera solo uno di qualcosa nella propria applicazione. L'accessor statico può causare l'accoppiamento indiretto tra codice apparentemente non correlato tra loro.

Quando ti fermi a considerare cosa sia veramente un kernel , scoprirai che il pattern Singleton è ancora più lontano dalla giusta comprensione. Il kernel fornisce molte funzioni, ma è un'API di per sé.

Il kernel:

  • Gestisce le risorse
  • Pianifica i thread e i tempi di esecuzione per i processi
  • Cambia il contesto per il processo attualmente in esecuzione
  • Gestisce la memoria e controlla dove vengono caricate le applicazioni
  • Gestisce I / O per tutti i dispositivi (disco, grafica, audio, ecc.)

Molti kernel definiscono un'API per i driver di dispositivo (il codice che imposta effettivamente i registri e sposta i dati da e verso i dispositivi) e fornisce un'API coerente per le applicazioni da utilizzare. Il risultato netto è che la tua applicazione non deve essere riscritta solo perché hai una nuova scheda grafica.

Se dovessi provare a cogliere concetti orientati agli oggetti nel mondo di un kernel, i pattern migliori sarebbero interfaccia , adattatore e pochi altri. Ma non esiste un modello che tu possa dire rappresenta un kernel perché i kernel sono molto più complessi.

    
risposta data 14.08.2018 - 05:00
fonte
4

Il modello di progettazione singleton garantisce che vi sia una sola istanza di oggetto di una classe. Quindi, a meno che non si sviluppi una classe del kernel con un linguaggio di programmazione orientato agli oggetti, non è un singleton.

Tuttavia, il concetto di singleton è più generale di un semplice modello di progettazione: è un set contenente uno ed esattamente un elemento.

Secondo questa definizione, se si considera l'insieme di stati attivi del codice eseguito, un os microkernel potrebbe essere considerato come singleton perché ha solo uno stato attivo (mappa della memoria virtuale, elenco dei processi gestiti dallo scheduler, ecc ...) in qualsiasi momento. Tutti gli altri programmi o servizi possono avere più di uno stato attivo, se più processi eseguono lo stesso codice.

    
risposta data 14.08.2018 - 14:02
fonte
3

Per me, Singleton non è tanto una caratteristica del tipo stesso, ma piuttosto il modo in cui viene utilizzata. Quando accedi al tuo kernel come IKernel::Instance() , allora è un Singleton. Quando si ottiene dal chiamante come parametro di tipo IKernel , quindi non è un Singleton, anche se in realtà non si hanno più oggetti kernel nel programma.

Come dice l'altra risposta, si tratta più del codice orientato agli oggetti: è un modo per ottenere oggetto , che ha sia l'implementazione del metodo che lo stato interno che i metodi dovrebbero usare. Ma se hai, per esempio, "OOP in C", che usa le strutture dei puntatori di funzione come oggetti, potresti avere un "Singleton" get_kernel() , che ti ha restituito tale oggetto.

    
risposta data 14.08.2018 - 07:06
fonte

Leggi altre domande sui tag