indiv fornisce un'ottima risposta, ma è solo parzialmente accurata.
Il funzionamento effettivo del sistema è leggermente più complesso.
Lo scheduler può essere eseguito come risultato di operazioni sincrone o asincrone.
Synchronous fa riferimento alle operazioni causate dal codice nell'attività attualmente in esecuzione. Un primo esempio di questo sarebbe prendere un semaforo (semTake).
Se il semaforo non è disponibile, l'attività attualmente in esecuzione verrà sospesa e non sarà più disponibile per l'esecuzione. A questo punto, lo scheduler verrà richiamato e determinerà l'attività successiva che dovrebbe essere eseguita ed eseguirà un cambio di contesto.
Le operazioni asincrone si riferiscono essenzialmente agli interrupt.Gli interrupt del timer sono stati descritti molto bene da indiv. Tuttavia, un certo numero di elementi diversi potrebbe causare un interrupt da eseguire: traffico di rete, sensore, dati seriali, ecc ...
È anche opportuno ricordare che l'interruzione del timer non causa necessariamente un interruttore di contesto! Sì, l'interruzione si verificherà e l'attività ritardata e i contatori di intervalli di tempo verranno decrementati. Tuttavia, se la sezione temporale non è scaduta o non c'è più alta transizioni di attività prioritarie dallo stato sospeso allo stato pronto, quindi lo scheduler non verrà effettivamente richiamato e si tornerà all'attività originale, nel punto esatto in cui l'esecuzione è stata interrotta.
Si noti che lo scheduler non ha il proprio contesto; non è un compito. È semplicemente un codice che viene eseguito in qualunque contesto venga invocato. O dal contesto di interrupt (asincrono) o dal contesto dell'attività di richiamo (sincrono).
Mentre non conosco VxWorks, in altri sistemi operativi lo scheduler viene in genere chiamato da un interrupt del timer, in modo che possa passare alle attività anche se un'attività è attualmente occupata. – Rudi