2009-05-11 9 views
3

Ich frage mich, ob jemand mehr Details über den Zeitstempel-Zähler in Linux weiß, wenn ein Kontextwechsel stattfindet? Bis jetzt war ich der Meinung, dass der TSC-Wert in jedem Taktzyklus nur um 1 zunimmt, egal ob im Kernel oder im Benutzermodus. Ich habe jetzt die Leistung einer Anwendung mit dem TSC gemessen, die ein Leistungsergebnis von 5 Mio Cycles ergab. Dann habe ich einige Änderungen an dem Scheduler vorgenommen, was bedeutet, dass ein Kontextwechsel beträchtlich länger dauert, z. 2 Millionen Zyklen statt 500.000 Zyklen. Das Witzige ist, dass wenn man die Leistung der ursprünglichen Anwendung erneut misst, es immer noch 5 Millionen Zyklen dauert ... Ich frage mich also, warum es nicht wesentlich länger gedauert hat, da ein Context Switch nun fast 2 Mio Clock Cycles mehr braucht? (und es treten mindestens 3 Kontext während der Ausführung der Anwendung auf).Zeitstempelzähler (TSC) beim Wechsel zwischen Kernel und Benutzermodus

Ist der Zeitstempel-Zähler im Kernel-Modus irgendwie deaktiviert? Oder wird der Inhalt des TSC während der Wettbewerbswechsel gespeichert? Danke, wenn mir jemand zeigen könnte, was das Problem sein könnte!

Antwort

0

Ich glaube, der TSC ist eigentlich ein Hardware-Konstrukt des Prozessors, den Sie verwenden. IE: Beim Lesen des TSC wird der RDTSC-Prozessor-Opcode verwendet. Ich denke nicht einmal, dass es eine Möglichkeit für das Betriebssystem gibt, seinen Wert zu ändern, es erhöht sich mit jedem Tick seit dem letzten Power-Reset.

In Bezug auf Ihre Änderungen an den Scheduler, ist es möglich, dass Sie einen Multi-Core-Prozessor in einer Weise verwenden, dass das Betriebssystem Ihren laufenden Prozess nicht ausschaltet? Sie könnten einen Anruf an sched_yield() oder sleep(0) in Ihrem Programm tätigen, um zu sehen, ob Ihre Scheduler-Änderungen wirksam werden.

+0

Vielen Dank für Ihre Eingabe. Ich dachte gleich, dass der TSC nur ein Hardware-Zähler ist, der mit jedem Tick zunimmt. Ich führe die Anwendung auf einem Multicore aus, aber ich habe den zweiten Kern deaktiviert, indem ich Maxcpus = 1 während des Bootens gesetzt habe, so dass ich nur einen Kern habe. Also, im Grunde habe ich jetzt diese 2 Prozesse auf dem gleichen Kern (hoffentlich;)), zur gleichen Zeit aber immer noch den Unterschied in der TSC-Zähler bleibt 5 Mio. Ich vermute, es sollte doppelt oder so ähnlich sein, wenn 2 Prozesse CPU-Zeit teilen ... –

+0

PS .: Ich hätte die Tatsache erwähnen sollen, dass ich weiß, dass der Scheduler zwischen 3-10 mal während der Programmausführung aufgerufen wird. Es kann jedoch sein, dass es nur den gleichen Prozess erneut einplant. –

+0

Der Zeitstempel-Zähler ist ein MSR, MSR '0x10' um genau zu sein. Das Betriebssystem kann einen Wert darauf schreiben. – doug65536

1

Wie Sie auf Wikipedia

Mit dem Aufkommen von Multi-Core/Hyper-Threading-CPUs, Systemen mit mehreren CPUs lesen können, und „Winterschlaf“ Betriebssysteme kann der TSC nicht, um genaue Ergebnisse herangezogen werden. Das Problem besteht aus zwei Komponenten: der Tickrate und der Frage, ob alle Cores (Prozessoren) identische Werte in ihren Zeitmessregistern haben. Es gibt kein Versprechen, dass die Zeitstempel-Zähler von mehreren CPUs auf einem einzelnen Motherboard synchronisiert werden. In solchen Fällen können Programmierer nur zuverlässige Ergebnisse erzielen, indem sie ihren Code an eine einzige CPU binden. Selbst dann kann sich die CPU-Geschwindigkeit aufgrund von Energiesparmaßnahmen ändern, die vom Betriebssystem oder BIOS vorgenommen werden, oder das System kann in den Ruhezustand versetzt und später wieder aufgenommen werden (Zurücksetzen des Zeitstempelzählers). Das Vertrauen in den Zeitstempelzähler verringert auch die Portabilität, da andere Prozessoren möglicherweise keine ähnliche Funktion haben. Neuere Intel-Prozessoren enthalten einen TSC mit konstanter Rate (identifiziert durch das Flag constant_tsc in Linux/proc/cpuinfo). Bei diesen Prozessoren liest der TSC die maximale Rate des Prozessors unabhängig von der tatsächlichen CPU-Betriebsrate. Dies führt zwar zu einer gleichmäßigeren Zeiterfassung, kann jedoch Benchmarks verzerren, bei denen eine gewisse Zeit für die Hochlaufphase bei einer niedrigeren Taktrate verbraucht wird, bevor das Betriebssystem den Prozessor auf die höhere Rate schaltet. Dies hat den Effekt, dass die Dinge so aussehen, als würden sie mehr Prozessorzyklen benötigen, als sie es normalerweise tun würden.

+0

Ich hätte erwähnen sollen, dass ich einen der Kerne deaktiviert habe, indem ich den maxcpus = 1 benutze. Wenn ich cat/proc/cpuinfo benutze, sagt es mir, dass es nur eine CPU gibt, und ich habe das constant_tsc Flag gesetzt! Das ist, warum das alles ein bisschen verdächtig ist ... –

+0

Aus dem obigen Zitat: "Auch dann kann sich die CPU-Geschwindigkeit aufgrund von Energiesparmaßnahmen durch das Betriebssystem ändern". – lothar

Verwandte Themen