Threads "von Hand"



  • Hallo,

    Bevor ich mit dieser Frage den Assembler Leuten gleich auf die Nerven gehe poste ich doch erstmal ganz allgemein hier:

    Wie wird Multithreading eigentlich umgesetzt? Das ganze ist ja in C plattformspeziefisch. Was passiert "unter der Haube" ? Besitzen die CPUs (Intel - Architektur) dafür eigene Assembler Befehlssätze?
    Hintergrund ist der, das ich jetzt in Windows eine ganze Zeit mit Multithreading gearbeitet habe und allgemein immer ganz gerne weiß, was denn im Hintergrund eigentlich abläuft.

    Wenns denn doch besser ins Assemler Forum paßt bitte einfach verschieben.



  • Kann ich dir auch nicht sagen, aber vielleicht findest du beim Prof. Winz was dazu...



  • also vielleicht läuft da heute ja anders, aber im prinzip wird das vom OS gesteuert, dieses verteilt die Rechnerzeit an die einzelnen Aplikationen und sorgt dafür das die CPU Register/Stacks etc. jeweils auf das richtige Programm 'zeigen' sprich, das OS speichert die ganzen CPU Sachen für die Aplikation und schreibt sie in dei CPU Register etc. zurück sobald die Aplikation rechenzeit bekommt, also dran ist und den Rechner benutzen darf. Dies wird insgesamt wohl über Interrupts gesteuert, denn bedenke die Programm laufen nur scheinbar nebeneinander. Aber keine garantie für das was ich hier gepostet hab, so war es auf dem Amiga früher aber ich dneke die Technik hat sich nicht grundlegend gewandelt.



  • aber im prinzip wird das vom OS gesteuert

    Hihi, das dachte ich mir schon fast :). Deinen weiteren Ausführungen entnehme ich, das das ja wirklich nur ein scheinbares nebeneinanderlaufen der einzelnen Routinen ist. Da IMHO Assembler ja nur streng prozedurale Programmierung - sprich einen geradlinigen Ablauf (in einem Verarbeitungszweig) zuläßt und alles andere ja nur darauf aufsetzt. Ich werde wohl doch mal ein bisschen mehr die Grundlagen durchforsten müssen, anstatt weiter durch Halbwissen zu glänzen... 🙄.

    @Hexagon : Danke für den Link - werde also doch mal die hohe Wissenschaft zu Rate ziehen...



  • Das funktioniert immer noch etwa so wie Joel gesagt hat... nix C-spezifisch. Das hängt am OS. Auch Assembler weiß nix von Threads. Es wird ein IRQ ausgelöst und danach alle Register gesichert für diesen Thread gesichert, in einer Liste nachgesehen wer als nächstes kommt, von dessen speziellen Speicher wird der letzte Zustand aller Register sowie die letzte Adresse des Programmcounter-Registers geladen, auch der Stackpointer wird gesichert, und dann geht's dort weiter. Bis der nächste IRQ kommt.



  • Wenn ich das richtig verstanden habe, ist Multithreading also nur eine reine Softwarelösung. Es wird also nichts wirklich parallel ausgeführt sondern nur zwischen verschiedenenen Tasks hin - und hergeswitched. Oder sehe ich das falsch?



  • Multitasking ist tatsächlich eine reine Softwarelösung - die allerdings vom Prozessor mit einigen speziellen Befehlen unterstützt oder vereinfacht werden kann. Siehe z.B. den neuen Hyperprocessing Mode der Intel CPUs. Oder wenn es spezielle CPU-Befehle gibt um die ganzen Register schneller zu sichern.

    Allerdings kann man das nicht rein auf die Software abladen, weil die Grenzen verschwimmen: nimm mal ein aktuelles OS, das läuft mit seinem Kernel auch auf Systemen mit Doppel-CPU. Der gleiche Kernel, die gleichen API-Funktionen um das Multithreading zu aktivieren, aber die Tasks werden dann gleichmäßig auf beide CPUs verteilt. Die Umschaltung, welche CPU mit welchem Task versorgt wird, da spielt dann auch noch der Chipsatz für die Synchronisation mit rein. Insofern wird die Umschaltung der CPUs letztlich in Hardware gemacht. Aber auch hier liegt die Entscheidung über "ob - wann - wer" letztlich bei der Software.



  • also das Buch "Linux Kernel Programmierung" ist sehr interessant zu dem Thema und beschreibt Threads und wie das im Linux Kernel gelöst wurde.

    @Marc++us
    naja soo aktuell muss das OS ja auch nicht sein, da dies ja schon in den 70ern gemacht wurde 😉



  • Nun also wenn ich mal mein Wissen dazu beitragen würde wäre es so...

    Parallel abgearbeitete Programme gibt es nicht auf einer ein Prozessor Maschine. Dort laufen alle Programme quasi Parallel. Wie richtig angesprochen wird dies durch das Betriebssystem realisiert.
    Bei Windows wird dies durch das Round Robin Verfahren erweitert mit einigen Modifikationen realisiert.

    ---- Round Robin = Zeitscheibenverfahren ----

    Die Programme bekommen durch das OS eine Zeitscheibe zugewiesen, ist diese abgelaufen wird der Applikation der Prozessor entzogen, sämtliche Registerinhalte und sonstige Sachen werden ausgelagert, anschließend werden die alten Registerinhalte des nächsten Programmes wieder hergestellt. Nun kann dieses wieder arbeiten.

    Es gibt Betriebssysteme die mit kooperativen Multitasking und welche die mit Präemptiven (glaube das war richtig geschrieben) Multitasking arbeiten.

    Windows wäre zum Beispiel Präemptives Multitasking.


Anmelden zum Antworten