indiv bietet eine sehr gute Antwort, aber es ist nur teilweise genau.
Die eigentliche Arbeit des Systems ist etwas komplexer.
Der Scheduler kann entweder als Ergebnis von synchronen oder asynchronen Operationen ausgeführt werden.
Synchron bezieht sich auf Vorgänge, die als Ergebnis des Codes in der aktuell ausgeführten Aufgabe verursacht werden. Ein gutes Beispiel dafür wäre ein Semaphor (semTake).
Wenn der Semaphor nicht verfügbar ist, bleibt die aktuell ausgeführte Aufgabe hängen und ist nicht mehr zur Ausführung verfügbar. An diesem Punkt wird der Scheduler aufgerufen und bestimmt die nächste Task, die ausgeführt werden soll und führt einen Kontextwechsel durch.
Asynchrone Operationen beziehen sich im Wesentlichen auf Interrupts.Timer Interrupts wurden sehr gut von indiv beschrieben. Eine Reihe verschiedener Elemente könnte jedoch einen Interrupt auslösen: Netzwerkverkehr, Sensor, serielle Daten, usw.
Es ist auch gut daran zu denken, dass der Timer-Interrupt nicht unbedingt einen Kontextwechsel verursacht! Ja, der Interrupt wird auftreten, und die verzögerte Task und die Zeitscheibenzähler werden dekrementiert. Wenn die Zeitscheibe jedoch nicht abgelaufen ist oder keine vorrangige Aufgabe vom Übergabepunkt in den Bereitschaftszustand übergeht, wird der Scheduler nicht tatsächlich aufgerufen, und Sie kehren genau dort an die ursprüngliche Aufgabe zurück, wo Die Ausführung wurde unterbrochen.
Beachten Sie, dass der Scheduler keinen eigenen Kontext hat; Es ist keine Aufgabe. Es ist einfach Code, der in dem Kontext ausgeführt wird, aus dem er aufgerufen wird. Entweder aus dem Interrupt-Kontext (asynchron) oder aus dem Kontext der aufrufenden Task (synchron).
Während ich VxWorks nicht kenne, wird der Scheduler in anderen Betriebssystemen normalerweise von einem Timer-Interrupt aufgerufen, so dass er Aufgaben wechseln kann, selbst wenn gerade eine Task aktiv ist. – Rudi