Frage zu mehrere Threads in Assembler
-
Hallo,
ich beschäftige mich sein knapp einem Jahr mit Assembler und habe in meinem Büchern ein wenig über Threadprogrammierung gelesen.
Nun weiß ich aus anderen Artikeln das eine Prozessor immer nur eine Aufgabe bearbeiten kann und die Threads im wechsel abgearbeitet werden.
Bei den Dual- oder Quadcor Prozessoren sollte es wohl so sein das die Programme wirklich parallel laufen können.Nun habe ich ein Programm mit 2 zusätzlichen Threads erstellt. Im ersten wird ebx von 1000 bis 0 herabgezählt und im zweiten von 0 bis 1000 herauf.
In beiden wird jeweils 20 ms gewartet um auch eine Verzögerung zu erkennen.Zum ersten mal bin ich überrascht das es funktioniert.
Aber warum?Ich habe doch nur ein ebx Register im Prozessor. Wenn einer was draufpackt und der andere was runternimmmt sollte es doch eine Endlosschleife werden oder nicht?
Ich kann mir nicht vorstellen das jeder Kern ein EAX, EBX, ECX, EDX usw Register zur Verfügung hat oder liege ich da falsch?
Um Info wird gebeten...
Gruß, Nicky
-
supernicky schrieb:
Ich kann mir nicht vorstellen das jeder Kern ein EAX, EBX, ECX, EDX usw Register zur Verfügung hat [...]
Ja klar doch. Ein Kern ist eigentlich ein vollwertiger Prozessor. Eine Quadcore-CPU ist im Prinzip nix andres als 4 CPUs auf einem Chip...
-
IMO gibst ein Register-Set für eine CPU-Pipeline, oder? XD
-
Ja, wenn mans genau nimmt, dann gibts sogar schon innerhalb eines einzelnen Kerns die ganzen Register doppelt und dreifach, weil superskalare Architektur, und speculative Execution und so. Eigentlich gibts sowas wie das EAX Register etc. sowieso gar nicht, sondern nur ein Register File wo einfach mal ein "EAX Register" allokiert wird, wenn eins gebraucht wird. Aber ich denk, so genau wollte es der Threadersteller dann nicht wissen
-
dot schrieb:
supernicky schrieb:
Ich kann mir nicht vorstellen das jeder Kern ein EAX, EBX, ECX, EDX usw Register zur Verfügung hat [...]
Ja klar doch. Ein Kern ist eigentlich ein vollwertiger Prozessor. Eine Quadcore-CPU ist im Prinzip nix andres als 4 CPUs auf einem Chip...
Zum Einen das, zum Anderen ist es bei allen mir bekannten Multitaskingsystemen so, dass jeder Prozess (darunter fallen auch Threads) im Prinzip zunaechst aus seiner Sicht so laeuft, als haette er den Prozessor komplett fuer sich alleine.
D.h. praktisch wird fuer jeden Prozess bei einem Prozesswechsel der aktuelle Zustand der Laufzeitumgebung (allgemeine Register, Flags, etc.) gesichert, bzw. wiederhergestellt. Mit ein Grund, weshalb Prozesswechsel nicht ganz unaufwaendig sind.
-
Hallo nochmal,
Danke für die Antworten...
Also kann ich nach Lust und Laune alle Register in mehreren Threads gleichzeitig nutzen?
Trifft das auch auf die FPU zu wenn ich mehrere Berechnungen mit dieser ausführen möchte?
Nicky
-
Ja. Vorausgesetzt natürlich, dein Betriebsssystem kümmert sich drum, die Register bei einem Contextswitch zu sichern. Das trifft aber auf jedes Desktopbetriebssystem zu, sofern du nicht grad unbedingt irgendwo im Kernelmode unterwegs bist.
-
supernicky schrieb:
Also kann ich nach Lust und Laune alle Register in mehreren Threads gleichzeitig nutzen?
Trifft das auch auf die FPU zu wenn ich mehrere Berechnungen mit dieser ausführen möchte?
Jeder Thread hat einen sogenannten Kontext, welcher nichts weiter als eine Sicherungskopie der Register, Flags usw. ist. Dieser wird beim Wechsel von einem Thread zum andern gesichert, bzw. geladen - So ist sicher gestellt, das ein Thread niemals seinen 'Zustand' verliert oder das es zu Vermischungen kommt. Dies Gilt nicht für den Speicher (globale Variablen) in einem Prozess: hier kann es tatsächlich zu den von dir genannten Problem kommen (Stichwort: thread save).