2009-08-06 4 views
2

Wie misst man die Zeit, die ein Mutex dem Betriebssystem gibt? Das Hauptziel besteht darin, einen Mutex zu erkennen, der Threads für die größte Zeit blockiert.Wie erkennt man, welcher Mutex dem Betriebssystem die meiste Zeit gibt?

PS: Ich habe versucht, oprofile. Es meldet 30% der Zeit in vmlinux/.poll_idle. Dies ist unerwartet, da die App 100% ihres Kerns abdeckt. Daher vermute ich, dass die Zeit dem Betriebssystem zurückgegeben wird, während auf einige Mutex gewartet wird, und oprofile es als die IDLE-Zeit meldet.

+0

Können Sie genauer sein? Ich verstehe, dass Ihr Ziel darin besteht, einige Systeme zu optimieren und nach Mutexen zu suchen, um Gewinne zu erzielen. Was meinst du mit der Zeit von einem Mutex gegeben? Interessieren Sie sich für den Overhead von Mutexen aus Ihrer eigenen Anwendung im Kontext eines Betriebssystems oder für die Leistung und Skalierbarkeit eines Betriebssystems? Welches Betriebssystem? Weil einige Betriebssysteme mit guten Tools ausgestattet sind. – Adriaan

+0

Welches Betriebssystem? –

+0

Linux [15 char pad] –

Antwort

4

Profil.

Immer wenn die Frage lautet "Was wirklich dauert [die meiste Zeit]?", Ist die Antwort immer "Profil, um herauszufinden.".

+0

Können Sie einen geeigneten Profiler für diese Aufgabe vorschlagen? Ich nehme an, das ist es, wonach OP auch wirklich gefragt hat. Oprofile und Callgrind zum Beispiel sind wahrscheinlich nicht hilfreich, um diese Art von Sachen zu messen. Richtig, wenn ich falsch liege. Die Intel und AMD Profiler könnten besser sein, aber ich habe sie nie ausprobiert. Deshalb bin ich auch neugierig auf die Frage. – tsg

+0

Es hängt vom Betriebssystem und Compiler ab. –

1

Wie vorgeschlagen - Profil, aber entscheiden, bevor was Sie messen möchten - verstrichene Zeit (Zeit Threads wurden blockiert), oder Benutzer/Kernel-Zeit (Zeit kostet Sie die Synchronisierung durchzuführen). In verschiedenen Szenarien möchten Sie vielleicht die eine oder andere oder beide messen.

0

Sie könnten Ihr Programm profilieren, mit say OProfile auf Linux. Dann filtern Sie Ihre Ergebnisse heraus, um die Zeit zu betrachten, die Sie in pthread_mutex_lock() für jeden Mutex verbracht haben, oder Ihre Funktion auf höherer Ebene, die das Sperren durchführt. Da das Programm innerhalb des Sperrfunktionsaufrufs blockiert, bis der Mutex aufgerufen wird, sollte die Profilierung der in dieser Funktion verbrachten Zeit Ihnen eine Vorstellung davon geben, welche Mutexe am teuersten sind.

0
start = GetTime(); 
Mutex.Lock(); 
stop = GetTime(); 

elapsedTime = stop - start; 

elaspedTime ist die Zeit, die benötigt wurde, um den Mutex zu erfassen. Wenn es größer als ein kleiner Wert ist, liegt es daran, dass ein anderer Thread den Mutex hat. Dies zeigt nicht an, wie lange das Betriebssystem den Mutex hat, nur dass es ein anderer Thread hat.