Riguarda il sovraccarico della pianificazione e il modo in cui alcune soluzioni rispondono a problemi specifici meglio di altri.
La pianificazione è l'attività di decidere chi sta eseguendo in questo momento e il passaggio tra processi / thread. La pianificazione cooperativa è semplice da implementare e richiede che ogni thread partecipante debba cedere allo scheduler quando viene raggiunto uno stato di pausa ragionevole. Immagina alcuni thread in una discussione:
A: So, how was your day? YIELD
B: Today I visited a zoo. YIELD
A: YIELD
B: There were kangaroos and llamas. YIELD
A: Can you pass me the butter? YIELD
B: Here you are :) YIELD
Certo, ora c'è un problema quando il processo B
non restituisce mai:
A: So, how was your day? YIELD
B: Today I visited a zoo and there were like kangaroos and llamas and all kinds of animals and stuff and…
(A tries to make themselves noticed and raises a hand, but B never stops)
B: … their fluffy fur and I took tons of pictures and do you want to see them here they are this is me next to a …
(A would really like that butter, but B still won't stop)
B: … and here I made a selfie with an orang-utan and look how it …
(at this point, A starts plotting to kill B)
La pianificazione cooperativa funziona solo quando possiamo fare affidamento su tutti per ottenere regolarmente la possibilità di dare agli altri la possibilità di eseguire anche. Ciò funziona bene per un singolo programma che è stato progettato da una singola organizzazione che ha il controllo su tutte le parti ed è consapevole di quali specifici requisiti soft in tempo reale devono essere soddisfatti. Ma per la maggior parte dei sistemi operativi, i programmi possono essere scritti da terze parti e questi potrebbero dimenticare di produrre regolarmente. Pertanto, costruiamo uno scheduler preventivo che produce per loro. Idealmente, la conversazione funziona così:
A: So, how was your day? dum dee dum
Scheduler: NEXT
B: Today I visited a zoo. There were
Scheduler: NEXT
A: dum dee dum twiddly thumb
Scheduler: NEXT
B: kangaroos and llamas. dum dee dum
Scheduler: NEXT
A: Can you pass me the butter? dum dee dum
Scheduler: NEXT
B: Here you are :) dum dee dum
Tuttavia, lo scheduler potrebbe interrompere tutti i processi quando si trovano nel mezzo di un pensiero. Successivamente devono ricordare da dove si sono interrotti.
A: So, how was your
Scheduler: NEXT!
A: I was asking: How was your day?
Scheduler: NEXT!
B: Today I visited a
Scheduler: NEXT!
B: A zoo. I visited a zoo. And there were
Scheduler: NEXT!
B: Will you let me talk! There were kangaroos and
Scheduler: NEXT!
B: Where was I? There were kangaroos and llamas.
Scheduler: NEXT!
etc.
Lo scheduler rallenta: non solo la pianificazione richiede del tempo che altrimenti sarebbe stata utilizzata in modo produttivo, ma richiede anche lo stato del thread da ripristinare. Ciò comporta l'impostazione dei registri della CPU sui valori precedenti dai valori in memoria, richiede il reset del puntatore dell'istruzione e il lavaggio della pipeline dell'istruzione della CPU. E quando l'esecuzione continua, la chache della CPU conterrà dati inutili da altri thread, quindi la lettura dalla memoria sarà lenta.
Questi interruttori di contesto sono ciò che rende la programmazione preventiva così terribilmente costosa. Quindi, mentre le interruzioni di contesto preventive sono sbagliate, sono migliori dell'alternativa: un computer che si blocca perché alcuni processi scritti male dimenticano di cedere. Questo può essere regolato cambiando la frequenza degli interrupt, ma una frequenza più bassa significa anche che il computer impiega più tempo a reagire all'input, ecc.