Was ist der "Wartekanal" eines Prozesses?


36

Auf der Registerkarte "Prozesse" des GNOME-Systemmonitors befindet sich eine Spalte "Wartender Kanal". Die bei weitem häufigsten Werte, die ich hier sehe , sind poll_schedule_timeout , aber ich sehe auch andere Werte: 0 , do_exit , do_wait , futex_wait_queue_me , pipe_wait , __skb_recv_datagram und unix_stream_data_wait .

Was bedeutet diese Spalte "Wartender Kanal"? Und vielleicht, was bedeuten einige dieser Werte darin?

Bildschirmfoto

Antworten:


42

Der Wartekanal ist der Ort im Kernel, an dem die Aufgabe gerade wartet. Eine Aufgabe muss auf eine Ressource warten, bei der es sich um Daten oder Verarbeitungszeit handeln kann. Zu diesen beiden gehören Netzwerksockets, Hardware, Dateien usw. da die meisten von ihnen nur Dateien sind, in Unix-ähnlichen Systemen.

  • 0: Der Prozess wartet nicht

  • poll_schedule_timeout

    poll()ist ein Systemaufruf 1, der zur Behandlung von E / A verwendet wird. Es ist ähnlich wie select(). 2

    Anwendungen, die nicht blockierende E / A verwenden, verwenden diese Aufrufe, um festzustellen, ob sie aus einer Datei lesen oder in eine Datei schreiben können, ohne sie blockieren zu müssen. Sie werden häufig für Eingabe- / Ausgabestreams verwendet, die möglicherweise nicht blockiert werden (andernfalls würde sich Ihre Maus möglicherweise nicht mehr bewegen).

    Der Wartekanal poll_schedule_timeoutzeigt an, dass eine Task auf E / A wartet, entweder Hardware wie Tastaturen und Mäuse, Audiogeräte oder sogar Netzwerk-Sockets.

    1. Eine Funktion im Kernel
    2. Sie sind in definiert <linux/poll.h>. pollWurde eine Implementierung erstmals in System V gesehen, selectentspricht dies BSD UNIX.
  • futex_wait_queue_me:

    Um dies zu erklären, müssen wir uns Locks anschauen. Eine Sperre ist ein gespeicherter Status im System, der angibt, dass eine Aufgabe mit einer Ressource zusammenarbeitet. Es kann zum Beispiel nur eine Aufgabe geben, die eine Datei liest. Diese Task würde die Datei sperren. Jede andere Task 1 , die versucht, die Datei zu lesen, würde wissen, dass sie gesperrt ist, und warten, bis die Sperre aufgehoben ist, bevor sie darauf zugreifen kann. Das gleiche passiert für die Prozessorzeit.

    Moderne Linux-Versionen (auf den meisten Architekturen) verwenden eine Futex-Sperre (Fast Userspace Mutex) im Kernel. Mutex, gegenseitiger Ausschluss, bezieht sich auf die Idee, dass auf eine gemeinsame Ressource jeweils nur von einer Aufgabe zugegriffen werden kann. Hierzu werden im System Flags gesetzt.

    Wenn ein Prozess auf eine gesperrte Ressource wartet, wird dies als Beschäftigt-Warten oder "Drehen" bezeichnet. Dies bezieht sich auf die Tatsache, dass er immer wieder versucht, auf sie zuzugreifen, bis dies möglich ist. Eine Aufgabe wird blockiert, wenn sie sich dreht.

    Wenn Sie dies lesen können, müssen Sie mindestens einen Fehler in dieser Antwort korrigieren: P

    FUTEX Schlösser kann als eine Zahl in User - Space gedacht werden, die von einer Aufgabe inkrementiert oder dekrementiert werden kann (in Fällen , in denen die Ressource kann durch mehrere Aufgaben zugegriffen werden kann, kann diese Zahl größer geworden ist als eins). Dies ist die in Abbildung 4 gezeigte Zahl .

    Diese Aufgaben werden in die Warteschlange eingereiht , eine einfache Warteschlange mit Aufgaben, die etwas Arbeit erledigen müssen. Sobald Verarbeitungszeit verfügbar ist, erledigen die Aufgaben ihre Arbeit und werden aus der Warteschlange entfernt.

    futex_wait_queue_mestellt eine Aufgabe in die Warteschlange. Es wartet dann auf ein Signal, eine Auszeit oder ein Aufwecken. Aufgabe, in diesem sind Warte Kanal warten nicht auf der Warteschlange, warten sie eine Warteschlange eingereiht werden.


    1. Eine Aufgabe kann entweder ein Prozess 3 oder ein Thread 2 sein
    2. Ein Thread ist ein Unterabschnitt eines Prozesses. Viele Threads können parallel laufen
    3. Ein Prozess ist ein vollständiges Programm, das aus einem oder mehreren Threads besteht, obwohl ein Programm auch aus mehreren Prozessen bestehen kann.
    4. Denken Sie daran, dass dies immer noch eine sehr allgemeine Sicht der Dinge ist und nicht die Implementierungsdetails berücksichtigt
  • __skb_recv_datagram

    Warten Sie auf einige Daten an einem gesperrten Netzwerk-Socket.

  • sk_wait_data

    Warten Sie auf einige Daten an einem Netzwerk-Socket.

  • do_exit

    Dies ist der letzte Teil des Beendens eines Prozesses. do_exit()ruft den schedule()nächsten auf, um einen anderen Prozess zu planen. Wenn do_exit()aufgerufen wird, ist der Prozess a ZOMBIE.

  • do_wait

    Der Warteschlange des Schedulers wird ein Prozess hinzugefügt.

  • pipe_wait, unix_stream_data_wait

    Ein Prozess wartet auf Daten aus einem Unterprozess. Dies passiert zum Beispiel, wenn Sie diese Art von Code ausführen:

    echo | sleep 10 && echo hallo              # pipe
    

    oder

    cat < hello.c                              # unix data stream
    
  • hrtimer_nanosleep

    Der Prozess schläft mit der hrtimer_nanosleep()Methode. Mit dieser Methode kann ein Programm für bestimmte Zeitintervalle mit einer Genauigkeit von Nanosekunden in den Ruhezustand versetzt werden.

Das sind nicht alle, aber ich habe keine anderen beobachtet. Schreibe einen Kommentar, wenn ich etwas verpasst habe.


Ich bin auf sleep_on_page_killable gestoßen?
Herr Axilus

Die wahrscheinlichste Ursache für sleep_on_page_killable ist, dass der Prozess versucht, eine Seite zu laden, die sich nicht im Speicher befindet. Dies führt zu einem Seitenfehler und der Prozess muss in den Ruhezustand versetzt werden, bis die Seite geladen ist. Wenn das E / A-Subsystem überlastet ist (möglicherweise, weil Sie viel E / A ausführen), kann dies häufig vorkommen.
Tsuna

was ist signal? Darauf bin ich gestoßen. Ist der Prozess beendet? Zombie? oder was? Was wird mit dem Prozess geschehen?
itsnotmyrealname

11

Der Wert des wartenden Kanals ist der Name der Kernelfunktion, in der der Prozess derzeit blockiert ist.

Der Name bezieht sich normalerweise auf einen Systemaufruf, der eine Handbuchseite enthält.

  • futex_wait_queue_me wird im Zusammenhang futex . Dies bezieht sich auf eine Art Mutex- Sperre (schneller gegenseitiger Ausschluss durch Benutzer), mit der viele Prozesse auf einem Prozessor geplant werden. Der Status zeigt an, dass sich Ihr Prozess in der Warteschlange befindet, um die Sperre zu erhalten. 2
  • do_wait ist verwandt mit wait .
  • etc.

Wenn Sie wirklich ausführlichere Informationen wünschen könnten Sie den Kernel überprüfen Quelle .

Wenn Sie cat /proc/some_pid/stackein Terminal eingeben, erhalten Sie eine Ausgabe wie die folgende:

[<c0227f4e>] poll_schedule_timeout+0x3e/0x60
[<c022879f>] do_select+0x55f/0x670
[<c0228f40>] core_sys_select+0x140/0x240
[<c0229241>] sys_select+0x31/0xc0
[<c05c9cc4>] syscall_call+0x7/0xb
[<ffffffff>] 0xffffffff

In der ersten Zeile wird angezeigt, was auf dem Systemmonitor angezeigt wird. Soweit ich weiß, poll_schedule_timeout zeigt an, dass Ihr Prozess für etwas wartet.

Es befasst sich mit asynchroner E / A und Polling .

Quelle (n): 1. Wartekanal (WCHAN) und Alarm verarbeiten? - 2. AskUbuntu Antwort



Scheint, als hättest du gemerkt, dass ich deine Antwort wiederverwendet habe, um diese zu verbessern ;-) Welche Art von Zuschreibung hättest du gerne?
Maxime R.

2
Ihr Kommentar ist mehr als genug, um mich bei Laune zu halten :) Wenn Sie wissen möchten, wie die Namensnennung funktioniert, gibt es einen netten SO-Blogeintrag zu diesem Thema. Mach dir aber keine Sorgen, ich möchte, dass die Leute meine Arbeit so oft wie möglich wiederverwenden.
Stefano Palazzo

1
Nun, ich habe gerade eine Frage zu diesem Thema auf Meta geschrieben. (hatte bereits den Blog-Beitrag gelesen)
Maxime R.

Es ist da . Und ich wette, deine Antwort wird irgendwann über meine hinausgehen ^^
Maxime R.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.