Minimale Zeit, die ein thread kann pause in Linux
In meiner Anwendung, threads pause benötigen für eine sehr kleine Zeit (100s von clock-Zyklen). Ein Weg, um pause zu nennen nanosleep, aber ich nehme an, es erfordert einen system-Aufruf an den kernel. Jetzt will ich pause, ohne dabei auf den kernel.
Hinweis, dass ich genug Kerne laufen meine threads auf und ich Binde jeden thread einen separaten Kern, so dass selbst eine Anweisung, kann halt der Kern für eine Weile gut sein würde. Ich bin mit x86. Ich will einfach nur den thread zu stoppen, während der Pause. Ich glaube nicht, dass ein busy-loop oder ein system-Aufruf an den kernel. Ist es möglich, dies zu tun? Was ist die minimale Zeit, die ich pause ein thread?
- Dieser Beitrag hat interessante Diskussion zu diesem Thema. stackoverflow.com/questions/4725676/...
- Was genau wollen Sie erreichen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
_mm_pause
in einem busy-wait-Schleife ist der Weg zu gehen.Leider ist die Verzögerung, die es bietet ändert sich mit jeder Prozessor-Familie:
http://siyobik.info/main/reference/instruction/PAUSE
Beispiel für den GCC unter Linux:
Kompilieren mit MMX enabled:
Auch Sie können immer nur die Verwendung von inline-assembler:
Vom Intel-Ingenieure, Sie könnten das nützlich finden, um zu bestimmen, die Kosten des Anhaltens:
http://software.intel.com/en-us/forums/showthread.php?t=48371
nop
nicht stall out-of-order-execution, oder sogar alle back-end-Ausführung Ressourcen.nop
Durchsatz ist 4 pro Takt auf alles, was seit Core2 (außer Atom). agner.org/optimize. Jedenfallsnop
nicht "nehmen-Zyklen" mehr alsadd
bedeutet, es verbraucht front-end-Bandbreite und instruction-cache. Sowiesopause
auf Sandybridge-Familie ist etwa 5 Zyklen, bis Skylake, wo es über 100 Zyklen. Sind deine zahlen vom Pentium4 oder so etwas?Warum gehst du nicht einfach drehen-warten Sie selber? Sie können Sie in einer Schleife mehrfach aufrufen, die rdtsc-Instruktion zu erhalten, den Takt zu zählen und dann einfach aufhören, wenn der Unterschied mehr als 100 Takte.
Ich vermute, es ist für ein trading system, für die dies eine gängige Technik
Es hängt davon ab, was du damit meinst pause. Wenn durch die pause, die Sie wollen, zu stoppen, die den thread für eine kurze Zeit, nur das OS kann dies tun.
Jedoch, wenn durch pause-Sie wollen eine sehr kurze Verzögerung, Sie können dies tun, mit einer busy-loop. Das problem bei der Verwendung einer solchen Schleife ist, dass Sie nicht wissen, wie lange er wirklich läuft. Sie können es bewerten, aber ein interrupt kann es länger machen.
Generell, für so eine kurze Verzögerung, ich würde denken, dass ein system-call ist nicht praktikabel, da der Aufwand der system call + Planung + Kontext wechseln und wieder zurück gehen, um so mehr dann Ihre pause, wie Sie scheinen schon bewusst sein.
Was Sie mit Links sind ist zur Drehung (busy wait) zu erzeugen, um die Verzögerung. Sie können Schleife Lesen TSC-Werte zu wissen, wie viel spin, zum Beispiel (bzw. der entsprechenden cycle-counter-register für andere Prozessoren)
Ja, Spinnen wie diese Abfälle in der Tat macht, und wenn Sie laufen auf einer CPU mit mehreren hardware-threads, wie multi-core in der Regel bedeutet, Sie sind auch unter Ausführung slots aus den anderen threads unnötig, aber es sei denn, Sie haben einen sehr sehr sehr niedrigen overhead-system Aufruf-und scheduler-Mechanismus UND ein high res timer, ich würde sagen, es ist nicht möglich.
Nein - es ist nicht möglich. Entweder rufen Sie
sleep
oderselect
- kernel; oder eine Schleife haben Zeit vergeudet.Ihre einzige Hoffnung, timing, präzise, mit
timer_create
und mit der timer-Ablauf geliefert durch ein signal, denke ich. Mit Echtzeit-scheduling.Ich bin mir nicht sicher, was könnte es eventuell nützlich sein, obwohl, da Sie nicht durchführen können alle E /a in einem so kleinen Zeitfenster, und daher sollte es egal sein, wenn Ihr code ausgeführt wird, 1000 mal mit einem 100 NS Lücke zwischen jedem Lauf oder 1000-mal alle zusammen mit einem 100ms-Lücke am Ende.