Come funziona il multitasking


15

Sono completamente all'oscuro del funzionamento interno di un sistema operativo, ma posso più o meno indovinare il comportamento approssimativo di molte funzioni. Una cosa che non sono in grado di capire, tuttavia, è il multitasking.

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

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 dovrebbe essere eseguito un salto a quell'indirizzo, consentendo l'esecuzione del mio codice. Ma in questo modo, il sistema operativo non può riprendere il controllo fino a quando non torno indietro.

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

  • Il sistema operativo potrebbe 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 eseguo una chiamata di sistema. In quel momento riprende il controllo e può controllare da quanto tempo sono in esecuzione e fare le sue cose in multiproprietà. Questo potrebbe funzionare, ma sembra inaffidabile, poiché 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?


Anche se la tua ipotesi non è esattamente corretta, il problema che fai notare è, beh, sì: "Potrei fare un lungo calcolo che non prevede chiamate di sistema e bloccare tutto per un po '".
jhocking

Una parola chiave da cercare:interrupt
SK-logic,

Sì, ma chi sta lanciando l'interrupt? Se il mio codice è in esecuzione, il sistema operativo non ha modo di eseguire INTun'istruzione. Qualcosa è ancora misterioso per me
Andrea

@Andrea, l'orologio harware sta innescando un interrupt. Semplice come quello. en.wikipedia.org/wiki/Scheduling_%28computing%29
SK-logic

Ok, ora vedo. Quindi, se ho capito bene, si tratta di una funzionalità basata su hardware, non qualcosa che si può semplicemente implementare nel sistema operativo.
Andrea

Risposte:


21

Il sistema operativo programma un timer per avviare ogni pochi microsecondi (o millisecondi, a seconda della velocità del sistema). Questo timer genera l'interruzione hardware, causando l'arresto della CPU in qualsiasi momento, scaricando tutto il suo contenuto nello stack ed elaborando la routine di interruzione indicata dall'indirizzo fornito dal controller di interruzione. Questa routine può ispezionare lo stack e varie altre variabili per prendere una decisione su quale processo in esecuzione dovrebbe essere rimesso in azione. Se è lo stesso processo, la routine di interruzione ritorna semplicemente. Se è diverso, le parti rilevanti dello stack vengono salvate e quindi sostituite con il contenuto di un processo precedentemente interrotto, quindi quando ritorna la routine di interruzione, quel processo continua. A parte il fatto che è passato del tempo,

Questa è (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, esistono anche interruzioni causate da eventi esterni (mouse, tastiera, porte seriali, porte di rete, ecc.) Che vengono elaborate con routine di interruzione separate, che di solito sono collegate ai gestori di eventi.

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


5

Varia da sistema a sistema.

Nei sistemi multitasking non preventivi (come l'originale Oberon o l'originale Apple Macintosh), il sistema operativo "interroga" periodicamente tutte le attività, offrendo loro l'opportunità di svolgere il proprio lavoro. I compiti dovrebbero svolgere bene insieme. Se hanno solo un po 'di lavoro da fare, lo fanno e tornano al sistema operativo. Se un'attività ha un grosso pezzo da fare, si prevede che lo spezzerà in piccoli pezzi e lavorerà un piccolo pezzo ogni volta che viene sottoposto a polling.

Gli interrupt di processo (completamenti DMA dell'unità disco, interruzioni della porta seriale, che cosa hai) causano l'esecuzione delle routine di interrupt. Queste routine di interruzione possono a loro volta notificare le attività da svolgere alla successiva esecuzione dell'attività.

Nei sistemi multitasking non preventivi, il verificarsi o il non verificarsi di un interrupt non influisce sull'attività in esecuzione al termine della routine di interrupt.

Nei sistemi multitasking preventivi, è possibile che una routine di interruzione imponga una modifica della pianificazione. In un tradizionale sistema multitasking preventivo round robin, un interruzione periodica del timer fa esattamente questo. L'interruzione del timer scatta, la routine di interruzione del timer fa un po 'di magia nera per far tornare l'istruzione di ritorno dall'interruzione alla pianificazione preventiva del sistema operativo, piuttosto che all'attività in esecuzione, allontanando il processore dall'attività corrente e (POSSIBILE ) assegnandolo a un altro compito. Se nessun'altra attività è pronta per essere eseguita a quel punto, l'attività corrente ripristinerà il processore, avendo perso solo un po 'di tempo.

Il multitasking preventivo può causare MOLTI problemi. Tutta quella 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 di nitroglicerina e che ti sta portando via il processore in questo momento è probabile che si traduca in un grande buco virtuale fumante nel mezzo del pavimento della sala server.


Che male può succedere se il processore viene portato via da te senza preavviso? Suppongo che otterrai nuovamente il controllo del processore con gli stessi valori nei registri. In che modo è diverso dal mantenere il tuo calcolo?
Andrea

@Andrea: l'esclusione reciproca e le sezioni critiche riguardano la perdita del processore in un momento critico. Se il processo ha qualcosa bloccato e si perde il processore, quel qualcosa rimane bloccato fino a quando non si ottiene nuovamente il processore. Ciò può causare problemi.
John R. Strohm,

@Andrea Riceverai nuovamente il controllo del processore e alcuni altri processi potrebbero essersi rovinati con la memoria che stavi per usare.
user253751

4

Le interruzioni del timer possono essere generate 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 l'esecuzione del programma corrente o passare a un altro programma pronto per l'esecuzione.

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.