2010-10-23 10 views
5

Ich habe eine Frage bezüglich Pthread-Implementierung unter Linux.Wie sind Pthreads auf Linux von Scheduler gesehen

Angenommen, ein Prozess hat 5 Threads. Nun, wie sieht der Scheduler diese Threads (oder sieht überhaupt nicht). z.B. Wenn der Scheduler aufgerufen wird, plant er nur den Hauptprozess, , und dann ist es die Aufgabe des Hauptprozesses, zwischen jedem seiner Threads zu planen.

Oder ist es die andere Möglichkeit, dass Scheduler jeden Thread so plant, als ob es ein separater Prozess ist.

Antwort

7

Für moderne Linux (NPTL Pthread-Implementierung), plant der Scheduler Threads, ein Thread ist ein "leichter Prozess". pthread_create wird in Bezug auf den Systemaufruf clone implementiert.

+0

In diesem Fall muss der Prozess, der die Threads erstellt hat, kontextgesteuert sein. Ist es so? –

+0

@Ganesh nicht unbedingt. Der neue Thread könnte auf einem anderen Kern ausgeführt werden. Aber ja, bei einem gegebenen Kernwechsel von einem Thread zum anderen, ob im selben Prozess oder nicht, entsteht ein Kontextwechsel. Das Wechseln zu einem Thread im selben Prozess ist möglicherweise günstiger als das Wechseln zu einem Thread in einem anderen Prozess, da Sie die Seitentabelle u. U. nicht ungültig machen müssen. –

2

Linux plant jeden Thread so, als wäre es ein Prozess mit dem Geltungsbereich PTHREAD_SCOPE_SYSTEM. Die nptl-Implementierung kann mehrere CPUs verwenden.

1

Wie Logan sagte, wird jeder Thread unabhängig geplant.

Wenn Sie jedoch möchten, können Sie stattdessen Linux-Prozesssteuerungsgruppen verwenden, um Gruppen von Threads zu planen.

Prozesssteuerungsgruppen machen die Planung ein wenig ineffizienter, aber es kann viel gerechter sein.

Eine Anwendung, die sehr populär geworden ist, besteht darin, alle Prozesse und Threads, die von jeder TTY erstellt werden, in eine Kontrollgruppe pro TTY zu setzen. Dies führt dazu, dass alle grafischen Anwendungen eines Benutzers auf der gleichen Ebene wie sein 24-Thread-Kern kompiliert werden, die er in einem Terminalfenster gestartet hat. Die grafischen Anwendungen erhalten 50% und die Kompilation 50%. Wenn er ein anderes Terminal-Fenster öffnet und beginnt, glibc mit weiteren 24 Threads zu kompilieren, verschiebt es sich auf 33% Desktop-Anwendungen, 33% Kernel-Kompilierung und 33% Glibc-Kompilierung.