Multithreading
-
byto schrieb:
rapso schrieb:
byto schrieb:
;fricky schrieb:
bei single-core systemen bringts geschwindigkeitsmässig sowieso nix
Das ist falsch, denn es gibt auch noch Sachen wie I/O, wodurch auch ein Kern mal nichts zu tun hat.
das war richtig, auf applikationsseite bringen mehrere threads in dem fall nichts, denn jedes OS kuemmert sich schon mit threads um die sache.
Klar kümmert sich das OS darum. Ändert trotzdem nichts, dass der Worker-Thread Deiner Applikation u.U. blockiert, bis der I/O Vorgang beendet ist.
sorry, aber wieso sollte man das machen? es waere doch dumm mehr aus dem I/O zu schoepfen als moeglich ist.
in dem fall haettest du natuerlich recht. du kannst auch einen thread machen der auf vsync wartet um zur richtigen zeit die zeichen auf dem bildschirm zu bringen. Einen thread der auf user keyboard-input wartet. doch das ist reine faulheit und hat nichts performancemaessiges gebracht, es kommen lediglich die kosten vom OS hinzu die threads zu verwalten, die threadsafe datenkapselung und die zusaetzlichen buffer hinzu. denn genauso gut kann der buffer deines extra threads ueberlaufen mit dem dein hauptthread kommuniziert und dann hast du nichts gewonnen, nur die folgen verschoben.Lässt Du also einen zweiten Thread laufen, kannst Du den entstandenen Leerlauf sinnvoll nutzen.
wenn du was zu tun hast, hast du keinen leerlauf.
schau dir einfach an wie nutzlos ein extra thread ist.
ohne thread: (die eckigen klammern sollen den OS bereich representieren)
[hardware <--OS/driver-thread/interrupt--> buffer/cache] <--APP--> variablen@application
mit thread
[hardware <--OS/driver-thread/interrupt--> buffer/cache] <--I/O-thread--> buffer/cache <--memcpy/bufferswap-APP--> variablen@application
wenn das zweite schneller/besser waere auf einem singlecore system, dann waere es doch ratsam noch mehr thread zu generieren:
[hardware <--OS/driver-thread/interrupt--> buffer/cache] <--I/O-thread0--> buffer/cache <--I/O-thread1--> buffer/cache <--memcpy/bufferswap-APP--> variablen@application
sicher sagst du jetzt "das ist doch bloedsinn", ja, weil du sehr offensichtlich siehst, dass der gewinn nicht durch mehr threads entstehen kann, bestennfalls durch mehr buffer, aber du siehst hoffentlich auch, dass genau diese im OS schon vorhanden sind. du kannst, wenn es dir drauf ankommt, den fuellstand abfragen und nur dann schreiben/lesen, denn ganau das selbe wuerde dein hauptthread auch machen wenn er die daten aus dem "I/O-thread" nutzen will, denn ansonsten wuerdest du genau den selben buffer over bzw underflow haben.
Der Overhead des OS-Schedulers bei einem Thread mehr oder weniger ist im Übrigen verschwindend gering.
das problem ist nicht wieviel man damit verliert, sondern dass man auf jeden fall damit verliert und nie performance gewinnt. es ist einfach nur ein thread der daten kopiert.
Anderes Beispiel wären GUI Applikationen. Hier stehts wohl ausser Frage, dass man auch bei einem Kern Multithreading benötigt.
wenn man es nicht anders hinbekommt responsibilitaet zu haben, kann man das machen, wuerde ich auch.
das wird aber nicht performanter laufen und steht in keinem kontext zu dem was ich sagte, denn das gequotete war "...geschwindigkeitsmässig...".Der irrglaube mit I/O threads stammt aus zeiten als ein OS keine caches und oft keine threads hatte. wenn man sound abspielen wollte, oder von der festplatte lud oder uebers modem daten empfing, dann war man grundsaetzlich immer geblockt, es gab schlichtweg keinen ausreichenden puffer dazwischen, oft nur ein paar byte(z.b. maus input) bis wenige kb (z.b. beim sound), weil man eben direkt auf die hardware zugriff.
In dem falle musstest du einen "thread" oder eher interrupthandler( hiess TSR, terminate but stay resistant, unter dos) implementieren, es war oft garnicht anders moeglich, denn ansonsten gingen die daten sogar verloren weil das OS keinen handler dafuer hatte.
aber genau das macht heutzutage ein OS bzw die treiber, und zwar weit aus effektiver.deswegen macht ein extra thread auf applikationsseite keinen sinn wenn man damit auf einem single-core system performance erhalten will.
arbeitest du auf nem embeded system, kann das sehr wohl einen sinn machen.
-
rapso schrieb:
deswegen macht ein extra thread auf applikationsseite keinen sinn wenn man damit auf einem single-core system performance erhalten will.
arbeitest du auf nem embeded system, kann das sehr wohl einen sinn machen.auch nicht. pro zeiteinheit kann 'ne CPU nur soundsoviele befehle ausführen. mit multithreading auf nur einer CPU ist gewinnt man luxus für programmierer (dass die schöne schleifen coden können), aber niemals geschwindigkeit.
-
hier gibts ne ganze menge klugscheißer und erbsenzähler
-
zusammenfassung schrieb:
hier gibts ne ganze menge klugscheißer und erbsenzähler
muss manchmal sein und manchmal auch nicht. hauptsache, wir haben alle spass dabei.
-
byto schrieb:
Manche geben auch einfach zu, wenn sie unrecht hatten.
Die, die meinen, dass man für GUIs Multithreading braucht?
-
;fricky schrieb:
rapso schrieb:
deswegen macht ein extra thread auf applikationsseite keinen sinn wenn man damit auf einem single-core system performance erhalten will.
arbeitest du auf nem embeded system, kann das sehr wohl einen sinn machen.auch nicht. pro zeiteinheit kann 'ne CPU nur soundsoviele befehle ausführen. mit multithreading auf nur einer CPU ist gewinnt man luxus für programmierer (dass die schöne schleifen coden können), aber niemals geschwindigkeit.
Eine CPU wird durch einen thread aber in der Regel nicht voll ausgelastet, z.B. wenn daten aus dem Arbeitsspeicher geladen werden müssen muss der Prozessor warten. Manche Prozessoren können in so einem Fall dann mit einem zweiten thread die Wartezeit überbrücken.
-
;fricky schrieb:
hustbaer schrieb:
ganz ohne multithreading/multitasking müsste man auf die platte warten.
auch ohne multitasking kann man die wartezeit nutzen, um was anderes zu machen. das ist nur etwas aufwendiger (schrieb ich ja bereits).
nein fricky. wie nennt man es noch schnell im englischen wenn man mehrere dinge gleichzeitig macht? hmmm....
achja: multitaskingdu ziehst hier vollkommen willkürlich eine grenze, die da IMO nicht hingehört.
-
Grohool schrieb:
Eine CPU wird durch einen thread aber in der Regel nicht voll ausgelastet, z.B. wenn daten aus dem Arbeitsspeicher geladen werden müssen muss der Prozessor warten. Manche Prozessoren können in so einem Fall dann mit einem zweiten thread die Wartezeit überbrücken.
ok, ein gut gemachtes multitasking-system bringt die CPU in einen stromsparmodus, wenn kein thread was zu tun hat. ich hab' z.b. den 'TNKernel' (auf meinem LPC23XX-system) dahingehend erweitert, dass er keine low-priority 'idle-loop' durchläuft, wenn nichts zu tun ist, sondern die CPU abschaltet, bis der nächste interrupt eintrifft (also mindestens ein timer-interrupt, der den scheduler antickert). das ist natürlich auch ein vorteil eines multitasking-systems, der hier bisher nicht genannt wurde. aber mal angenommen, du hast ein system, bei dem ständig irgendwelche daten durchgepumpt werden und bei dem energieverbrauch egal ist, dann biste ohne preemptives multitasking besser dran, weil die ganze rechenzeit für nützliche dinge benutzt wird, und nicht z.b. für's umschalten von tasks usw.
-
ownpwnd schrieb:
byto schrieb:
Manche geben auch einfach zu, wenn sie unrecht hatten.
Die, die meinen, dass man für GUIs Multithreading braucht?
Alle mir bekannten aktuellen UI Frameworks sind multithreaded: QT, WPF, Cocoa, SWT, Swing, ... aber laber ruhig.
-
byto schrieb:
ownpwnd schrieb:
byto schrieb:
Manche geben auch einfach zu, wenn sie unrecht hatten.
Die, die meinen, dass man für GUIs Multithreading braucht?
Alle mir bekannten aktuellen UI Frameworks sind multithreaded: QT, WPF, Cocoa, SWT, Swing, ... aber laber ruhig.
Und? Soll das dein Beweis sein, dass man Multithreading für GUIs braucht?
-
ownpwnd schrieb:
byto schrieb:
ownpwnd schrieb:
byto schrieb:
Manche geben auch einfach zu, wenn sie unrecht hatten.
Die, die meinen, dass man für GUIs Multithreading braucht?
Alle mir bekannten aktuellen UI Frameworks sind multithreaded: QT, WPF, Cocoa, SWT, Swing, ... aber laber ruhig.
Und? Soll das dein Beweis sein, dass man Multithreading für GUIs braucht?
Warum sollte ich Dir irgendwas beweisen? Hast du schon irgendwas Konstruktives beigetragen?
-
Schleife: Bild in Grafikspeicher schreiben Tasten Interrupts lesen Bild entsprechend anpassen
GUI fertig, ohne Threads
-
Schleife: Bild in Grafikspeicher schreiben Tasten Interrupts lesen Lange Berechnung Bild entsprechend anpassen
Während der langen Berechnung wird die Gui nicht aktualisiert, gaaaaanz toll.
-
Eben. Der Event Dispatcher der GUI muss in irgendeiner Weise halbwegs flott neue Events verarbeiten. Das kann er schlecht, wenn eine lange Operation den selben Thread blockiert. Deswegen muss man in aktuellen UI-Frameworks lange Operationen in einen eigenen Thread auslagern. Tut man das nicht, friert die GUI bei langen Operationen ein.
-
byto schrieb:
Eben. Der Event Dispatcher der GUI muss in irgendeiner Weise halbwegs flott neue Events verarbeiten. Das kann er schlecht, wenn eine lange Operation den selben Thread blockiert. Deswegen muss man in aktuellen UI-Frameworks lange Operationen in einen eigenen Thread auslagern. Tut man das nicht, friert die GUI bei langen Operationen ein.
ALso hast DU schonmal eingesehen, daß "Von daher brauchst Du bei GUI Anwendungen immer Multithreading, egal ob ein oder mehrere Kerne." in dieser ALlgemeinheit falsch war.
Außerdem bist bestimmt Du am Rande der Erkenntnis, daß fähige Programmierer, naja, alle nicht vollkommen unfähigen Programmierer, die langen Operatopnen aufteilen können in kleine Happen, indem man alle 10ms yield() aufruft.
-
Wie willst Du z.B. einen Datenbankzugriff in kleine Happen einteilen? Im übrigen verstehe ich nicht, was Dein yield() machen soll. Mein yield() gibt die Kontrolle an andere Threads ab - bringt also gar nix, wenn die Anwendung nur in einem Thread läuft.
Aber um dieses mühselige Thema endlich zu beerdigen: Ja Ihr habt recht, ich habe mich nicht 100% korrekt ausgedrückt. Man kann auch ohne Multithreading GUI Logik programmieren, wenns auch total sinnfrei ist.
Aber was wäre ein Forum wie dieses, ohne auf Sinnfreiheit zu beharren, nur um Recht zu behalten.
-
Du könntest ja statt Threads Prozesse nehmen. Bei nem OS mit preemptiven Multitasking brauchste dann auch kein yield mehr. Aber das ist eher ungemütlich auf exotischen Systemen wie MS Windows, weil dort die Prozeßerzeugung so lahm ist.
-
Man kann sich auch von hinten durch die Brust ins Auge schießen, nur um zu beweisen das es möglich ist. Sinn macht es aber dadurch noch lange nicht.
Klar kann man sich irgendwie auch in der GUI Programmierung ohne Threads behelfen. Ändert aber nichts an der Tatsache, das moderne UI-Frameworks ALLE Multithreading benutzen. Wer also heutzutage GUIs programmiert, wird zwangsläufig auf kurz oder lang mit Multithreading zu tun bekommen (egal ob 1 oder 2 Kerne). Wenn nicht, dann macht er was Grundlegendes falsch (man siehts leider noch viel zu oft, dass Actions nicht in Threads ausgelagert werden).
Oder kann mir jemand ein aktuelles UI-Framework nennen, dass gänzlich ohne Multithreading arbeitet? Mir fällt spontan nur Javascript ein (damit könnte man ja auch ein UI im Browser bauen), aber das möchte ich hier mal aussen vor lassen (zu speziell).
-
@byto:
Es gab GUIs lange bevor es Betriebssysteme gab, die einem das Multitasking/-threading abnehmen.
Diese GUIs waren auch sinnvoll.Und selbst heute noch macht es bei einigen Tools wenig Sinn Multitasking/-threading zu verwenden, weil einfach nirgendwo Wartezeiten entstehen die ausreichend gross wären.
Beispielsweise ein Text-Editor, Taschenrechner o.ä.
@Tyrdal:
Huch?
-
byto schrieb:
Wie willst Du z.B. einen Datenbankzugriff in kleine Happen einteilen?
anfrage abschicken und dann in kleinen abständen abfragen, ob die antwort schon da ist. ginge z.b. unter windows mit dem SetTimer()-befehl und in der wndproc hätteste dann regelmässig einen event, bei dem du die DB pollen könntest.
btw, der timer-mechnismus unter win braucht keine separaten threads.Tyrdal schrieb:
Du könntest ja statt Threads Prozesse nehmen.
ein prozess braucht mindestens einen thread, damit er was tun kann. damit hätteste nichts gewonnen.