Come funziona il multitasking

14

Sono completamente all'oscuro del funzionamento interno di un sistema operativo, ma posso più o meno intuire il comportamento approssimativo di molte funzioni. Una cosa che non riesco a capire, però, è il multitasking.

In teoria, il sistema operativo gestisce il tempo, in base alla CPU per piccoli intervalli ai vari programmi in esecuzione. Ma non è chiaro come funzioni veramente .

Supponiamo che il sistema operativo voglia avviare il mio programma. Il codice macchina viene caricato da qualche parte nella RAM, a partire da un determinato indirizzo. Immagino quindi che un salto debba essere eseguito a quell'indirizzo, permettendo al mio codice di essere eseguito. Ma in questo modo, il sistema operativo non può riprendere il controllo finché non salto indietro.

Fondamentalmente, posso immaginare solo due modi per farlo funzionare, ma nessuno dei due sembra davvero adatto:

  • Il sistema operativo può leggere le istruzioni della macchina che voglio eseguire ed emularle invece di eseguirle direttamente. Sono intenzionalmente vago, dal momento che non so come funzionerebbe, ma sembra che rallenterebbe notevolmente il programma.

  • In alternativa, il sistema operativo potrebbe attendere fino a quando effettuo una chiamata di sistema. In quel momento riprende il controllo e può controllare per quanto tempo sono stato in esecuzione e fare il suo materiale timesharing. Questo potrebbe funzionare, ma sembra inaffidabile, dato che potrei fare un lungo calcolo che non comporta chiamate di sistema e bloccare tutto per un po '.

Quindi, sembra che nessuno dei due meccanismi funzionerebbe molto bene. Come viene effettivamente eseguito il multitasking?

    
posta Andrea 08.06.2011 - 13:41
fonte

3 risposte

19

Il sistema operativo programma un timer per eseguire il kick in ogni pochi microsecondi (o millisecondi, a seconda della velocità del sistema). Questo timer solleva l'interrupt hardware, che fa sì che la CPU interrompa qualsiasi cosa stia facendo, riversa tutto il suo contenuto nello stack ed elabora la routine di interrupt indicata dall'indirizzo fornito dal controller di interrupt. Questa routine può ispezionare lo stack e varie altre variabili per prendere una decisione su quale processo di esecuzione dovrebbe essere messo nuovamente in azione. Se è lo stesso processo, la routine di interrupt ritorna semplicemente. Se è diverso, le parti rilevanti dello stack vengono salvate e quindi sostituite con il contenuto di un processo precedentemente interrotto, quindi quando la routine di interrupt ritorna, quel processo continua. A parte il fatto che è trascorso un po 'di tempo, quel processo non è consapevole di essere stato interrotto e / o messo in pausa per un po' di tempo.

Questo è (per le moderne CPU) una versione MOLTO MOLTO semplificata di ciò che accade, ma spiega il principio. Oltre a questi interrupt controllati dal sistema operativo, ci sono anche interruzioni causate da eventi esterni (mouse, tastiera, porte seriali, porte di rete, ecc.) Che vengono elaborati con routine di interrupt separate, che di solito sono collegate ai gestori di eventi.

Molto spesso la commutazione di processo / compito / contesto si basa anche sulla disponibilità di risorse esterne. In genere un processo che richiede i dati dalla memoria (cioè non nella RAM) posizionerà la richiesta su una coda, imposterà un gestore di eventi per l'interrupt hardware che indica che la richiesta è stata servita e poi cede il controllo all'utilità di pianificazione (poiché non c'è punto in attesa). Ancora una volta, una descrizione molto semplificata di ciò che effettivamente accade, ma dovrebbe servire agli scopi di questa risposta.

    
risposta data 08.06.2011 - 14:22
fonte
5

Varia da sistema a sistema.

Nei sistemi multitasking non preventivi (come Oberon originale o Apple Macintosh originale), il sistema operativo periodicamente "registra" tutte le attività, dando loro l'opportunità di lavorare. Ci si aspetta che i compiti giochino bene insieme. Se hanno solo un po 'di lavoro da fare, lo fanno e tornano al sistema operativo. Se un compito ha un grosso pezzo da fare, ci si aspetta di romperlo in piccoli pezzi e lavorare un pezzettino ogni volta che viene interrogato.

Gli interrupt hardware (completamenti DMA dell'unità disco, interrupt della porta seriale, cos'hai) provocano l'esecuzione di routine di interrupt. Queste routine di interruzione possono a sua volta notificare le attività di lavoro da eseguire quando viene eseguita l'attività successiva.

Nei sistemi multitasking non preponderanti, l'occorrenza o la non occorrenza di un interrupt non influisce su quale attività è in esecuzione al termine della routine di interrupt.

Nei sistemi di multitasking preventivi, è possibile che una routine di interrupt imponga una modifica della pianificazione. In un sistema multitasking preemptive round-robin tradizionale, un interrupt periodico del timer fa esattamente questo. L'interrupt del timer scatta, la routine di interrupt del timer fa un po 'di magia nera per far sì che l'istruzione return-from-interrupt ritorni alla pianificazione preventiva del sistema operativo, piuttosto che all'attività in esecuzione, portando il processore lontano dall'attività corrente e (POSSIBILMENTE) ) dandogli un altro compito. Se nessun'altra attività è pronta per essere eseguita in quel punto, l'operazione corrente riavrà il processore, avendo perso solo un po 'di tempo.

Il multitasking preventivo può causare MOLTI problemi. Tutta questa roba fastidiosa su mutex e sezioni critiche e abbracci mortali e inversioni prioritarie e ... si presentano quando il processore viene portato via da te senza preavviso. Devi usare tutte queste cose per dire al sistema operativo che sei nel mezzo della miscelazione della nitroglicerina e portare il processore lontano da te in questo momento rischia di provocare un grande buco virtuale nel bel mezzo della stanza del server.

    
risposta data 08.06.2011 - 18:24
fonte
4

Gli interrupt del timer possono essere generati dall'hardware del computer per interrompere la CPU. In questo modo, in base all'algoritmo di pianificazione utilizzato dal sistema operativo, il sistema operativo può decidere se continuare a eseguire il programma corrente o commutatore di contesto ad un altro pronto per essere eseguito.

    
risposta data 08.06.2011 - 14:09
fonte

Leggi altre domande sui tag