Wie wird Mutlithreading in C realisiert?



  • Hallo Leute,

    wie kann ich in C Munlitthreading realisieren, d.h. pseude-parallelverarbeitung von Code?

    Im C11 Standert gibt ja sogar Threading-Libs , was ja Compiler abhängig ist!?

    Wie sieht es auf einfachen Mircocontrollern aus? da wird ja über eine scheduler und interrups multithreding eumuliert!? Wie genau funktioniert das den?

    Grüße und schönes Wochenende;)



  • CDiscoverer schrieb:

    wie kann ich in C Munlitthreading realisieren, d.h. pseude-parallelverarbeitung von Code?

    Pthreads unter *nix. Unter Windows halt deren Thread-Implementierung.

    CDiscoverer schrieb:

    Im C11 Standert gibt ja sogar Threading-Libs , was ja Compiler abhängig ist!?

    Es ist dahingehend Compilerabhängig da nicht jeder Compiler C11 unterstützen wird.

    CDiscoverer schrieb:

    Wie sieht es auf einfachen Mircocontrollern aus? da wird ja über eine scheduler und interrups multithreding eumuliert!? Wie genau funktioniert das den?

    Hängt von der Anwendung ab.



  • Ok, nehmen wir an, ich möchte eine OS für nen Mircocontroller schreiben, dazu is ja ein kernel, scheduler etc. notwendig für den threadin mechanismus.

    Wo gibt denn so bischen einen einstieg in das ganze?



  • Ich würde mal die Manuals der jeweiligen Mikroarchitektur zu Rate ziehen...



  • CDiscoverer schrieb:

    Ok, nehmen wir an, ich möchte eine OS für nen Mircocontroller schreiben, dazu is ja ein kernel, scheduler etc. notwendig für den threadin mechanismus.

    Wo gibt denn so bischen einen einstieg in das ganze?

    Über Betriebssysteme gibt es ganze Bücher, das würde hier den Rahmen sprengen und ich bin da gewiss nicht der richtige Ansprechpartner.

    Für die wahrscheinlich meisten µC-Anwendungen benötigt man aber gar kein "richtiges" OS. Meist tut es da in der Tat das Scheduling via Interrupts (getriggert von Timern, Signalflangen/schwellen, A/D-Wandlern, etc...).



  • Meist tut es da in der Tat das Scheduling via Interrupts

    Also mein Scheduler arbeitet auch hauptsaechlich mit Interrupts.



  • Nehmen wir mal an , ich hab zwei Funktionen mit jeweils einer Schleife. Wie funktioniert es dann rein Technisch oder Progammatisch wenn ich die beiden Scheifen "Parallel" ablaufen lassen will? Ich muss ja den Programmzeiger einer Schleife "Pausieren" und den in der anderen Funktione einen Zyklus weiter laufen lassen.. und das hin und her..

    die koordination macht ja dann der scheduler oder!?



  • CDiscoverer schrieb:

    Nehmen wir mal an , ich hab zwei Funktionen mit jeweils einer Schleife. Wie funktioniert es dann rein Technisch oder Progammatisch wenn ich die beiden Scheifen "Parallel" ablaufen lassen will? Ich muss ja den Programmzeiger einer Schleife "Pausieren" und den in der anderen Funktione einen Zyklus weiter laufen lassen.. und das hin und her..

    die koordination macht ja dann der scheduler oder!?

    Wow - ein ganzer Post ohne unsern alten Freund, den Mircocontroller!



  • CDiscoverer schrieb:

    Nehmen wir mal an , ich hab zwei Funktionen mit jeweils einer Schleife. Wie funktioniert es dann rein Technisch oder Progammatisch wenn ich die beiden Scheifen "Parallel" ablaufen lassen will? Ich muss ja den Programmzeiger einer Schleife "Pausieren" und den in der anderen Funktione einen Zyklus weiter laufen lassen.. und das hin und her..

    Ja, genau so funktioniert das und ja, genau das ist die Aufgabe eines Schedulers...



  • Verstehe, und wie bringt man es fertig (C) Code bzw. Anweisungn /Kontrollstrukturen zu stückeln bei der Abarbeitung?



  • 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...;)


Log in to reply