Thread sleep



  • Hallo,

    wie funktioniert das eigentlich mit Thread sleep.
    Wenn ein Thread schlaeft bedeutet dass doch nichts anders als dass sein Programmcode fuer eine festgelegte Zeitdauer nicht mehr bearbeitet wird.
    currentThread.sleep(50ms) wuerde bedeuten der Thread schlaeft 50ms. Sein Programmcode wird mindestens 50ms nicht bearbeitet. Ob er genau 50ms nicht bearbeitet wird, ist nicht sicher es koennen auch 52ms sein.

    Wie prueft das Betriebssystem wann der Timer abgelaufen ist. Benutzt es den CPU Timer ? Laeuft das dann ueber einen Interrupt Service Request oder ueber ein Polling ?

    Uebrigends ich wusste gar nicht dass man in Java gleich eine ganze Methode als synchronised markieren kann. Das bedeutet wohl dass wenn ein Thread eine Methode aufruft diese von keinem anderen aufgerufen werden kann. Man sollte deshalb wohl auch nicht zuviel Programmcode dareinpacken..



  • Wie kann es eigentlich sein, dass sich Threads unterschiedlich verhalten. Rein theoretisch muesste doch jeder Thread die selbe Zeit bekommen. Aber das ist nicht so. Warum ? Woran liegt das. Sagen wir ich teste mein Program unter denselben Bedingen. Also es laufen genau die selben Windowsprozesse und ich mach auch kein Tastendruck oder so. Wahrscheinlich waere das Ergebnis der Threads trotzdem immer anders. hm. Ich schau grad in meinen Task Manager und da laufen so etwa 150 Prozesse. Wie macht das Windows. Bekommt jeder Prozess die gleiche Zeit. Gibt es Prioritaeten ? Wie ist das mit meinen Threads. Ich hab ein Java Program mit 2 Threads geschrieben. Soviel ich weiss managt die Java Virtual Machine die Threads selbst oder , und nicht das Betriebssystem..



  • computernerds schrieb:

    currentThread.sleep(50ms) wuerde bedeuten der Thread schlaeft 50ms. Sein Programmcode wird mindestens 50ms nicht bearbeitet. Ob er genau 50ms nicht bearbeitet wird, ist nicht sicher es koennen auch 52ms sein.

    Das ist soweit ich weiss das effektive Verhalten was du auf so ziemlich jedem OS bekommen wirst. Allerdings ist es laut MS Doku bei z.B. Windows nicht garantiert - d.h. es könnten auch weniger als 50ms sein. Was ich bekloppt finde, aber so steht's halt da: https://msdn.microsoft.com/en-us/library/windows/desktop/ms686298(v=vs.85).aspx

    computernerds schrieb:

    Wie prueft das Betriebssystem wann der Timer abgelaufen ist. Benutzt es den CPU Timer ? Laeuft das dann ueber einen Interrupt Service Request oder ueber ein Polling ?

    Auf "klassischen" Kernels (also nicht "tickless" Kernels) verwendet das OS einen Timer (irgendwas vom Chipset) der periodisch Interrupts auslöst. Im Interrupt wird dann geguckt welche Threads wieder aufgewecket werden müssen. Wie es mit "tickless" Kernels funktioniert weiss ich nicht. Du kannst dich aber darauf verlassen dass nicht einfach stupides Polling verwendet wird. Oder anders gesagt: Wenn du 10000 Threads hast die alle in einem Sleep(oneHour) hängen, dann kostet das kaum Rechenzeit.

    computernerds schrieb:

    Uebrigends ich wusste gar nicht dass man in Java gleich eine ganze Methode als synchronised markieren kann. Das bedeutet wohl dass wenn ein Thread eine Methode aufruft diese von keinem anderen aufgerufen werden kann.

    Es bedeutet dass kein Thread gleichzeitig irgend eine synchronised Methode auf dem selben Objekt ausführen kann.
    Wenn du also ein Objekt einer Klasse hast die mehrere synchronised Methoden hat, dann blockieren sich die verschiedenen synchronised Methoden gegenseitig. Wenn du allerdings mehrere Objekte einer Klasse mit synchronised Methoden hast, dann kann mit den verschiedenen Objekten sehr wohl gleichzeitig gerabeitet werden.

    Im Prinzip macht synchronised bei einer Methode das selbe, wie wenn du den gesamten Code in der Methode in ein

    synchronised (this) {
            // ...
        }
    

    packst.



  • computernerds schrieb:

    Wie kann es eigentlich sein, dass sich Threads unterschiedlich verhalten. Rein theoretisch muesste doch jeder Thread die selbe Zeit bekommen. Aber das ist nicht so. Warum ? Woran liegt das. Sagen wir ich teste mein Program unter denselben Bedingen.

    Das ist schonmal das grösste Problem bei der Sache: identische Bedingen. Die bekommst du nämlich nicht hin.
    Einer von vielen Gründen dafür ist schonmal dass du es nicht hinbekommen wirst dass dein Programm immer exakt gleich lange nach z.B. dem letzten Heartbeat Interrupt gestartet wird.
    1x startest du dein Programm 1.234 ms nach dem letzten Heartbeat Interrupt und 1x sind es 4.5 ms und dann wieder 0.2 ms. Da das Scheduling im Heartbeat Interrupt passiert kann es also gar nicht unter exakt identischen Bedingungen laufen wie beim letzten mal.

    Dann haben viele Dinge auf die Ausführungsdauer von Befehlen einen Einfluss. z.B. welche Daten im L1 Cache stehen, welche im L2 Cache, welche im L3 Cache und welche in gar keinem Cache. Und da moderne CPUs einigermassen komplex sind beeinflussen sich auch Threads die gleichzeitig laufen gegenseitig. Wenn dein Thread z.B. ganz alleine läuft, dann wird er weniger oft auf der frei werden einer bestimmten Recheneinheit warten müssen als wenn daneben noch haufenweise andere Threads laufen.

    Usw.

    Alles in allem summieren sich diese Effekte so weit dass es quasi unmöglich ist zwei Programmausführungen hinzubekommen die exakt identisch gescheduled wurden. Speziell wenn dein Programm selbst schon mehr als einen Thread verwendet.

    computernerds schrieb:

    Gibt es Prioritaeten ?

    Ja, es gibt auch Prioritäten.

    computernerds schrieb:

    Wie ist das mit meinen Threads.

    Wie ist was mit deinen Threads?

    computernerds schrieb:

    Ich hab ein Java Program mit 2 Threads geschrieben. Soviel ich weiss managt die Java Virtual Machine die Threads selbst oder , und nicht das Betriebssystem..

    Soviel ich weiss verwendet Java ganz normale OS Threads, die dann auch ganz normal vom OS verwaltet werden.



  • Diese Sleep Funktion befindet sich in der kernel.dll . Dort befinden sich fast 1600 Funktionen.
    Wie soll man bei dieser Menge jemals in der Lage sein, die volle Funktionalitaet von Windows zu nutzen.
    Wie bekommt das Betriebssystem ueberhaupt mit, dass ich eine API von ihr(also dem BS) aufgerufen habe. Funktioniert das ueber Sockets ?
    Das Betriebssystem muss ja irgendwie mitbekommen, dass jemand seine API aufruft...


  • Mod

    Du referenzierst eine DLL, die wird daher beim Programmstart geladen (bzw. ist schon geladen), wenn du nun einen System-Aufruf machst springt dein Programm einfach an die Stelle und schwupps bist du dort.

    Ich empfehle dir, bei allem was du hier fragst, echt mal einen Universitäts 101 Kurs zum Thema Computer zu machen. Auf Dauer werden die Leute hier wohl keine Lust haben so viel zu schreiben...

    MfG SideWinder



  • Das Betriebssytem merkt dass eine dll von sich in den Arbeitsspeicher geladen wurde. Sie wuerde das auch merken wenn ich die dll auf den Desktop kopiere und sie von dort(statt Ordner System32) lade. Ok.



  • Das Betriebssystem merkt auch, wenn du Blödsinn schreibst. Das würds auch merken, wenn du den Blödsinn in eine Textdatei auf dem Dektop schreibst und in den Papierkorb schiebst. Das muss nicht unbedingt ein Forum sein.



  • Ja. Es merkt es doch nur weil immer eine .dll aus dem Ordner system32 aufgerufen wird. Sonst wuerde das Betriebssystem gar nix merken. Ist doch richtig 🙂



  • Hat ne Weile gedauert bis ich es überzuckert habe, aber naja. Ich schlage auf jeden Fall vor dem Benutzer computernerds den Titel "Troll" zu verleihen. Damit andere sich nicht unnötig Arbeit machen.


  • Mod

    hustbaer schrieb:

    Hat ne Weile gedauert bis ich es überzuckert habe, aber naja. Ich schlage auf jeden Fall vor dem Benutzer computernerds den Titel "Troll" zu verleihen. Damit andere sich nicht unnötig Arbeit machen.

    Moment, dir war nicht klar, dass das blurry aka Peter_Mueller aka [noch ein paar andere] ist? Hätte ich geahnt, dass nach hunderten seiner Beiträge noch jemand wirklich glaubt, dass seine Unwissenheit echt wäre, hätte ich ihn längst gesperrt. Ich dachte, du hättest in diesem Thread bloß einen kleinen Spaß mit ihm.

    Wenn das so ist, gehe ich lieber ein bisschen härter gegen ihn vor. Bisher habe ich ihn unter seinem festen Nickname gewähren lassen, weil er ansonsten sowieso unter anderem Namen wiederkommt. Ich dachte, so wüsste dann jeder Bescheid, dass dies ein Trollnick ist. Ich ging wohl fälschlicherweise davon aus, dass weniger aktive Leser diesen Troll genauso leicht erkennen könnten wie ich. Wenn er sich einen neuen Nick zulegt, erkenne ich ihn normalerweise direkt an der Überschrift seiner Threads, aber es war falsch, von mir auf andere zu schließen.

    Ich habe ihn nun erst einmal gelöscht und werde dann auch in Zukunft weiter so verfahren.



  • Ne, ich bin wirklich (wieder mal) reingefallen. Merke mir Namen immer erst etwas später, wenn ich öfter mit jmd. zu tun habe. Und die Blurry-Mustererkennung scheint auch nicht so hinzuhauen 😉 (Und den effektivsten Blurry-Test den ich kenne mach ich nicht gern. Der ist nämlich "beschimpfen und gucken ob er drauf eingeht". Was ich echt nicht will wenn's doch NICHT Blurry sein sollte.)

    Wäre aber interessant wie er sich verhält wenn man ihm einfach nur wirklich nen Titel verleiht. Muss ja nicht "Troll" sein, "Blurry" oder "Unscharfer Benutzer" oder so würde es auch tun - zumindest für die die wissen wer Blurry ist.


  • Mod

    hustbaer schrieb:

    Wäre aber interessant wie er sich verhält wenn man ihm einfach nur wirklich nen Titel verleiht. Muss ja nicht "Troll" sein, "Blurry" oder "Unscharfer Benutzer" oder so würde es auch tun - zumindest für die die wissen wer Blurry ist.

    Coole Idee, ich werde mal bei Gelegenheit Dravere fragen. Erst einmal muss er sich jetzt natürlich wieder neu anmelden, da ich ihn heute morgen gebannt habe.

    Blurry-Checkliste:
    * Deppenleerzeichen, vor allem im Titel
    * Titel sind nur ein oder zwei Stichworte, kein richtiger Satz (bzw. es sollten ein oder zwei Worte sein, hat aber fälschlich gesetzte Leerzeichen zuviel).
    * Plenken vor Fragezeichen, aber nicht vor Punkten (manchmal vergisst er es aber)
    * Völliges Ignorieren aller Gegenfragen und Beleidigungen
    * Beitrag geht meistens erst mit einem Absatz geschwafeltem Halbwissens los, bevor eine Frage kommt.
    * Beitrag endet mit irgendeiner persönlichen Meinung, in der die gängige Praxis als dumm dargestellt wird.
    * Viel 'das bedeutet doch', 'ich verstehe daraus', 'dann muss doch' und ähnliches, gefolgt von völligem Blödsinn und falschen Schlussfolgerungen.
    * Persona als Bachelor der Informatik (mal bald fertig, mal ganz fertig, mal frisch im Beruf), mit Interesse für Java und/oder Appentwicklung.
    * 'Weiss keiner Bescheid ?', 'Wer kennt sich damit aus ?' und ähnliches, wenn niemand reagiert.
    * Er hat auch noch einen bestimmten Schreibstil, den ich erkenne, aber den ich nicht in einer Beschreibung ausdrücken kann, da ich kein Sprachwissenschaftler bin. Es ist halt dieser komische Stil, der sich so liest, als ob der Verfasser sich nicht selber die Schuhe zubinden könnte.

    Er weiß, dass ich davon weiß, und macht es trotzdem, daher sehe ich keinen Grund, diese Muster nicht zu veröffentlichen.

    Perfekte Musterbeispiele:
    https://www.c-plusplus.net/forum/p2544715#2544715
    https://www.c-plusplus.net/forum/p2537816#2537816


Log in to reply