Ha schedulazione cooperativa sospendere i processi quando eseguono un'operazione di I / O?

cs.stackexchange https://cs.stackexchange.com/questions/5

Domanda

molti sistemi operativi riferimenti dicono che con cooperativa (al contrario di preemptive) multitasking, un processo mantiene la CPU fino a quando non esplicitamente si sospende volontariamente. Se un esecuzione processo esegue una richiesta di I / O che non possono essere immediatamente soddisfatta (ad esempio, chiede un colpo chiave che non è ancora disponibile), non lo scheduler sospendere, o fa davvero mantenere la CPU fino a quando la richiesta può essere riparato?

[A cura di sostituire "blocchi su I / O" con "esegue una richiesta di I / O che non possono essere immediatamente soddisfatto".]

È stato utile?

Soluzione

In un ambiente davvero "cooperativa", e se non vi era alcuna protezione hardware, un processo potrebbe certamente blocco sulla I / O e non il controllo relinquish fino a quando l'I / O è stato fatto (o non controllo relinquish a tutti). Ad esempio, Windows 3.1 è stato in questo modo: se un singolo processo utente ha voluto prendere in consegna l'intero computer, e prevenire qualsiasi altra cosa l'esecuzione, potrebbe.

Ma su un sistema con multitasking si aspetta l'API sistema di I / O comandi per controllare relinquish del processore quando sono chiamati. Così, quando una esecuzione blocchi di processo di I / O, partendo dal presupposto che il processo utilizza le normali API di sistema, altri processi potranno correre fino a quando l'I / O è completa, e alla fine il processo originale riprenderà una volta che l'I / O è fatto . In altre parole, chiamando una funzione di blocco I / O è un modo che un processo su un sistema cooperativo può sospendere volontariamente stessa.

Altri suggerimenti

Se un running blocchi di processo di I / O

Blocco su Io è più o meno equivalente a sospendere il processo. Nel contesto del kernel di Linux, l'esecuzione di alcune chiamate di sistema IO come read() causerà un sysenter o gestore di interrupt per innesco di guardare dopo IO, chiamando do_sys_read() definitiva. Qui, se la richiesta corrente non può essere immediatamente soddisfatta, la funzione chiama sched() che poi può eseguire un altro processo.

Nel contesto di un sistema cooperativo, mi aspetterei che quando si effettua una chiamata di sistema per qualche ragione IO, se la richiesta non può essere soddisfatta picconi kernel altro compito ed esegue il. Questo documento fornisce alcuni retroscena - in sostanza, se aspettato su Io, si potrebbe essere appeso sempre in attesa di quel IO. L'idea di scheduling cooperativo è che si chiama di frequente sched() o il metodo relinquish-the-cpu equvalent, se fare i compiti CPU-intensive.

considerazioni in modalità kernel si fanno più interessanti. Su architetture dove sono disponibili come alcune piattaforme embedded , interrupt gestori saranno ancora essere invocati in risposta ad interrupt hardware o software. Di solito è possibile implementazione-saggio, per disattivare interrupt movimentazione , ma che ha anche inconvenienti.

Nella schedulazione cooperativa (preferibilmente cooperative multitasking) modello, non esiste il concetto di uno scheduler in un senso che il sistema operativo non ha alcun controllo di quanto tempo viene eseguito il processo.

applicazione

Una programmato correttamente avrebbe volontariamente rinunciare alla CPU su di I / O. Ma, applicazioni mal scritte potrebbero solo continuare in attesa di I / O, bloccando così altri processi.

PS:. Questo approccio è stato poi abbandonato dalla maggior parte del sistema operativo a favore di preventivo-programmazione (che ha avuto un programmatore esterno) e ora abbiamo tutti i tipi di diversi algoritmi di scheduling usati dal sistema operativo diverso

Modifica La mia risposta è stata basata sulla programmazione, come descritto nella sua forma originale (anni fa: P). Come Gilles commentato alcuni sistemi ancora usare la pianificazione cooperativa. E c'è un programmatore. Non sono sicuro se gli impianti uso COS nella sua forma pura e originale.

multitasking cooperativa implica che un contesto dell'esecuzione deve controllo esplicitamente relinquish allo scheduler, e se lo desidera, può impedire un cambio di contesto si verifichi.

La maggior parte delle implementazioni di eseguire in modo esplicito un cambio di contesto per qualsiasi chiamata di sistema che non restituisce prontamente, e spesso anche se lo fanno, per aumentare l'equità di allocazione del processore.

Di solito è possibile solo per i processi falliti (o intenzionalmente servizio al resto del sistema negare) per impedire frequenti compito commutazione.

prelazione, come spiegato di Gilles, è una limitazione dell'architettura del sistema che impedisce temporizzati interruzione del compito attivo ed interruttori contesto forzato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a cs.stackexchange
scroll top