Wie funktioniert Multitasking?

15

Ich bin völlig ahnungslos über das Innenleben eines Betriebssystems, aber ich kann mehr oder weniger das ungefähre Verhalten vieler Funktionen erraten. Eine Sache, die ich nicht herausfinden kann, ist Multitasking.

Theoretisch verwaltet das Betriebssystem die Zeit, je nach CPU für kleine Intervalle, bis zu den verschiedenen Programmen, die ausgeführt werden. Aber es ist nicht klar, wie das wirklich funktioniert.

Angenommen, das Betriebssystem möchte mein Programm starten. Der Maschinencode wird irgendwo im RAM ab einer bestimmten Adresse geladen. Ich denke, dann sollte ein Sprung zu dieser Adresse ausgeführt werden, damit mein Code ausgeführt werden kann. Aber auf diese Weise kann das Betriebssystem die Kontrolle nicht wiedererlangen, bis ich zurückspringe.

Grundsätzlich kann ich mir nur zwei Möglichkeiten vorstellen, um diese Arbeit zu machen, aber keine scheint wirklich geeignet zu sein:

  • Das Betriebssystem könnte die Maschinenanweisungen lesen, die ich ausführen möchte, und sie emulieren, anstatt sie direkt auszuführen. Ich bin absichtlich vage, da ich nicht weiß, wie das funktionieren würde, aber es scheint, als würde es das Programm erheblich verlangsamen.

  • Alternativ könnte das Betriebssystem warten, bis ich einen Systemaufruf tätige. In diesem Moment erlangt es wieder die Kontrolle und kann überprüfen, wie lange ich schon gelaufen bin und seine Timesharing-Aufgaben erledigen. Dies mag funktionieren, scheint aber unzuverlässig zu sein, da ich eine lange Berechnung durchführen könnte, bei der keine Systemaufrufe erforderlich sind und nicht alles für eine Weile hängen bleibt.

Es scheint also, dass keiner der Mechanismen sehr gut funktionieren würde. Wie wird eigentlich Multitasking durchgeführt?

Andrea
quelle
Obwohl Ihre Vermutung nicht genau stimmt, ist das Problem, auf das Sie hinweisen, nun ja: "Ich könnte eine lange Berechnung durchführen, bei der keine Systemaufrufe erforderlich sind und für eine Weile alles hängen bleibt."
jhocking
Ein Schlüsselwort zu suchen:interrupt
SK-Logik
Ja, aber wer startet den Interrupt? Wenn mein Code ausgeführt wird, kann das Betriebssystem keine INTAnweisung ausführen . Mir ist noch etwas rätselhaft
Andrea
@Andrea, die Harware-Uhr löst einen Interrupt aus. So einfach ist das. en.wikipedia.org/wiki/Scheduling_%28computing%29
SK-logic
Ok, jetzt verstehe ich. Wenn ich das richtig verstehe, handelt es sich also um eine hardwarebasierte Funktion, die man nicht nur im Betriebssystem implementieren kann.
Andrea

Antworten:

21

Das Betriebssystem programmiert einen Timer, der alle paar Mikrosekunden (oder Millisekunden, abhängig von der Systemgeschwindigkeit) ausgelöst wird. Dieser Timer löst den Hardware-Interrupt aus, wodurch die CPU anhält, was auch immer sie gerade tut, ihren gesamten Inhalt auf den Stapel legt und die Interrupt-Routine abarbeitet, die durch die von der Interrupt-Steuerung bereitgestellte Adresse angezeigt wird. Diese Routine kann den Stapel und verschiedene andere Variablen untersuchen, um zu entscheiden, welcher laufende Prozess als nächstes wieder in Betrieb genommen werden soll. Wenn es der gleiche Prozess ist, kehrt die Interruptroutine einfach zurück. Wenn es sich um einen anderen handelt, werden die relevanten Teile des Stapels gespeichert und dann durch den Inhalt eines zuvor unterbrochenen Prozesses ersetzt. Wenn also die Interruptroutine zurückkehrt, wird dieser Prozess fortgesetzt. Abgesehen von der Tatsache, dass einige Zeit vergangen ist,

Dies ist (für moderne CPUs) eine SEHR SEHR vereinfachte Version dessen, was passiert, aber sie erklärt das Prinzip. Zusätzlich zu diesen betriebssystemgesteuerten Interrupts gibt es auch Interrupts, die durch externe Ereignisse (Maus, Tastatur, serielle Anschlüsse, Netzwerkanschlüsse usw.) verursacht werden und mit separaten Interruptroutinen verarbeitet werden, die normalerweise mit Ereignishandlern verbunden sind.

Sehr oft basiert das Umschalten von Prozessen / Aufgaben / Kontexten auch auf der Verfügbarkeit externer Ressourcen. In der Regel wird bei einem Prozess, der Daten aus dem Speicher benötigt (dh nicht im RAM), die Anforderung in eine Warteschlange gestellt, eine Ereignisbehandlungsroutine für den Hardware-Interrupt festgelegt, die angibt, dass die Anforderung zugestellt wurde, und anschließend die Steuerung an den Task-Scheduler übergeben (da keine vorhanden ist) Punkt im Warten). Wieder eine sehr vereinfachte Beschreibung dessen, was tatsächlich vor sich geht, die jedoch den Zwecken dieser Antwort dienen sollte.

wolfgangsz
quelle
5

Es variiert von System zu System.

In nicht vorbeugenden Multitasking-Systemen (wie dem ursprünglichen Oberon oder dem ursprünglichen Apple Macintosh) "fragt" das Betriebssystem regelmäßig alle Aufgaben ab und gibt ihnen die Möglichkeit, Arbeiten auszuführen. Es wird erwartet, dass die Aufgaben gut zusammenspielen. Wenn sie nur ein bisschen Arbeit zu erledigen haben, erledigen sie dies und kehren zum Betriebssystem zurück. Wenn eine Aufgabe einen GROSSEN Teil zu erledigen hat, wird erwartet, dass er in kleine Stücke zerlegt und jedes Mal, wenn er abgefragt wird, ein kleines Stück bearbeitet wird.

Hardware-Interrupts (DMA-Vervollständigungen des Festplattenlaufwerks, Interrupts der seriellen Schnittstelle, was haben Sie) führen zur Ausführung von Interrupt-Routinen. Diese Interruptroutinen können wiederum Aufgaben über zu erledigende Arbeit benachrichtigen, wenn die Aufgabe das nächste Mal ausgeführt wird.

In nicht vorbeugenden Multitasking-Systemen hat das Auftreten oder Nicht-Auftreten eines Interrupts keinen Einfluss darauf, welche Task ausgeführt wird, nachdem die Interruptroutine beendet ist.

In präventiven Multitasking-Systemen ist es möglich, dass eine Interruptroutine eine Planungsänderung erzwingt. In einem traditionellen preemptiven Round-Robin-Multitasking-System macht ein periodischer Timer-Interrupt genau das. Der Timer-Interrupt wird ausgelöst, und die Timer-Interrupt-Routine führt schwarze Magie aus, um zu bewirken, dass der Rücksprungbefehl zum vorbeugenden Zeitplan des Betriebssystems und nicht zur ausgeführten Task zurückkehrt, wodurch der Prozessor von der aktuellen Task entfernt wird. (MÖGLICH ) es einer anderen Aufgabe geben. Wenn zu diesem Zeitpunkt keine andere Task zur Ausführung bereit ist, erhält die aktuelle Task den Prozessor erneut, da sie nur einige Zeit verloren hat.

Präventives Multitasking kann viele Probleme verursachen. All das nervige Zeug über Mutexe und kritische Abschnitte und tödliche Umarmungen und Prioritätsumkehrungen und ... taucht auf, wenn der Prozessor ohne Vorwarnung von Ihnen weggenommen wird. Sie müssen all diese Dinge verwenden, um dem Betriebssystem mitzuteilen, dass Sie gerade dabei sind, Nitroglycerin zu mischen, und dass das Entfernen des Prozessors von Ihnen im Moment wahrscheinlich zu einem großen virtuellen Rauchloch in der Mitte des Serverraumbodens führt.

John R. Strohm
quelle
Was kann passieren, wenn der Prozessor ohne Vorwarnung von Ihnen entfernt wird? Ich vermute, Sie werden wieder die Kontrolle über den Prozessor mit den gleichen Werten in den Registern bekommen. Wie unterscheidet sich das davon, nur Ihre Berechnung zu behalten?
Andrea
@Andrea: Gegenseitiger Ausschluss und kritische Abschnitte sorgen dafür, dass der Prozessor in einem kritischen Moment nicht verloren geht. Wenn in Ihrem Prozess etwas gesperrt ist und Sie den Prozessor verlieren, bleibt das gesperrt, bis Sie den Prozessor erneut erhalten. Dies kann zu Problemen führen.
John R. Strohm
@Andrea Sie erhalten wieder die Kontrolle über den Prozessor, und ein anderer Prozess hat möglicherweise mit dem Speicher, den Sie verwenden wollten, experimentiert.
User253751
4

Zeitgeberunterbrechungen können von Computerhardware erzeugt werden, um die CPU zu unterbrechen. Auf diese Weise kann das Betriebssystem basierend auf dem vom Betriebssystem verwendeten Planungsalgorithmus entscheiden, ob das aktuelle Programm weiterhin ausgeführt werden soll oder ob der Kontextwechsel zu einem anderen Programm erfolgt, das zur Ausführung bereit ist.

nevayeshirazi
quelle