Bindet Threads an Prozessoren

7

Wenn ich meinen Multi-Thread-Code ausführe, verschiebt das System (linux) manchmal die Threads von einem Prozessor zu einem anderen. Da ich so viele Threads habe, wie ich Prozessoren habe, macht es Caches aus keinem guten Grund ungültig und verwirrt meine Tracing-Aktivitäten.

Wissen Sie, wie Sie Threads an Prozessoren binden und warum ein System dies tun würde?

    
Ben 22.09.2009, 08:37
quelle

2 Antworten

16

Verwenden Sie sched_setaffinity ( das ist Linux-spezifisch ).

Warum sollte ein Scheduler Threads zwischen verschiedenen Prozessoren wechseln? Nun, stellen Sie sich vor, dass Ihr Thread zuletzt auf Prozessor 1 ausgeführt wurde und derzeit darauf wartet, dass er erneut zur Ausführung geplant wird. In der Zwischenzeit läuft ein anderer Thread auf dem Prozessor 1, aber der Prozessor 2 ist frei. In dieser Situation ist es sinnvoll, dass der Scheduler den Thread auf Prozessor 2 umschaltet. Ein ausgefeilter Scheduler wird jedoch versuchen, einen Thread zwischen den Prozessoren nicht mehr als nötig "zu bouncen".

    
Martin B 22.09.2009, 08:50
quelle
8

Sie können dies von bash aus tun. Es gibt einen wunderbaren taskset -Befehl, den ich in gekannt habe Frage (Sie können auch wertvolle Diskussionen darüber finden, wie der Scheduler dort arbeiten soll). Der Befehl nimmt eine PID eines Prozesses und bindet sie an den / die spezifischen Prozessor (en).

%Vor%

bindet den Prozess mit PID an Prozessor (Kern) Nummer 0.

Was hat es mit Threads zu tun? Jedem Thread wird eine Kennung mit den gleichen Rechten wie pid zugewiesen, auch bekannt als "tid". Sie können es mit gettid syscall bekommen. Oder Sie können es zum Beispiel in top program ansehen, indem Sie H drücken (einige Prozesse werden auf viele scheinbar gleiche Einträge mit verschiedenen pids aufgeteilt - das sind Threads).

    
Pavel Shved 22.09.2009 09:03
quelle

Tags und Links