Wie wird Mutlithreading in C realisiert?
-
Das liegt außerhalb des Scope von Standard C. Wie und ob das geht hängt von deiner Hardwarearchitektur ab. Normalerweise bedient man sich eines periodischen Interrupt...
-
Ok, der Window oder Linux Kernel, welche ja den Scheduler enhält ist ja in C geschrieben!? Und die müssen sich doch auch damit beschäftigen, wie der Code zur laufzeit gestückelt wird!?
-
Und die verwenden einen periodischen Interrupt wie z.B. den da...
-
Bräuchste ich pro thread einen interrupt? ich versteh das ganze wohl noch nich ganz^^ Grundlagen, was würdet ihr diesbezüglich empfehln?
-
Normalerweise implementiert man präemptives Multitasking so: Der Timerinterrupt wird periodisch ausgelöst. Im Interrupthandler dazu kannst du dann deinen Scheduler aufrufen. Der kann dann entscheiden ob er den aktuellen Thread weiterlaufen lässt, oder den Zustand sichert und zu einem anderen Thread wechselt.
Die Frage ist, ob du auf deinem Mikrocontroller wirklich präemptives Multitasking implementieren willst und kannst. Die Alternative wäre kooperatives Multitasking. Das erfordert aber, dass deine Threads freiwillig die CPU an den Scheduler abgeben, also den Scheduler explizit aufrufen. Für dein Vorhaben evtl. besser geeignet, da einfacher zu implementieren.
-
Ja die beiden unterschiedlichen strategien der scheduler hab ich schon angelesen. Aber wenn ich den praemtive strategie verwende, muss ich mich in der thread-funktion um nichts kümmern!?
irgnedwie muss doch beim abarbeiten des (C) Codes in einem thread der programmzeiger angehalten wärden, und der programmzeiger in ner anderen threadfunkioen weiter laufen lassen.. aber genau diese mechanisch muss reint echnisch würde mich interessieren.. wie das geht?!?!
grüße
-
CDiscoverer schrieb:
irgnedwie muss doch beim abarbeiten des (C) Codes in einem thread der programmzeiger angehalten wärden, und der programmzeiger in ner anderen threadfunkioen weiter laufen lassen.. aber genau diese mechanisch muss reint echnisch würde mich interessieren.. wie das geht?!?!
Das kann man allgemein nicht sagen, das hängt von deiner konkreten Hardwarearchitektur ab und du wirst da normalerweise ein wenig Assembler brauchen...
-
Hmm ok, sowas hab ich mir schon gedacht.. es gibt ja einige ovensoruce RTOS für controller..müsste ich mir den code mal ansehen!?
Ist ein sehr interessantes Thema:)
Ich habe schon gegoogelt, aber finde eifnach kein passendes beispiel wie ein scheduler technisch beschrieben wird bzw. mit beispielcode etc.
-
Hier wär vielleicht ein guter Punkt um anzufangen: http://wiki.osdev.org/Main_Page
-
Normalerweise springt man, Zustand sichernd, woanders hin und an die gleiche Stelle zurück. Oder alles wird auf irgendwelche Parallelpiplines verteilt. Hängt auch ein wenig davon ab, was der Compiler "meint" bzw. "kann", wie was parallelisiert werden kann.
Man stelle sich ein einfaches Loop-Unrolling oder so vor oder eine Schlange im Supermarkt...;)
-
Was hat das mit dem Compiler zu tun? Kanns sein dass du da etwas Multithreading mit etwas Autovektorisierung durcheinanderbringst?
-
Danke dot!:) Ich hab glaub was gefunden
http://wiki.osdev.org/Multitasking_Systems unter "How does its work!?"
-
dot schrieb:
Was hat das mit dem Compiler zu tun? Kanns sein dass du da etwas Multithreading mit etwas Autovektorisierung durcheinanderbringst?
Das war eher hardwaretechnisch bzw. betriebssystemtechnisch gemeint bzw. wenn der Compiler z.B. kein OpenMP o.ä. unterstützt, dann kann man damit auch nicht arbeiten.
Ach, und hier wieder mal was herrlich esoterisches: http://de.wikipedia.org/wiki/Soundmonitor
-
Viel interessanter wird Multitasking doch erst zu implementieren, wenn man in Interrupthandlern Interrupts aufdreht.