Qu'est-ce que le "canal en attente" d'un processus?

36

Dans l'onglet Processus de GNOME System Monitor, il y a une colonne "Canal en attente". Les valeurs les plus communes que je vois ici sont poll_schedule_timeout , mais je vois aussi d'autres valeurs: 0 , do_exit , do_wait , futex_wait_queue_me , pipe_wait , __skb_recv_datagram et unix_stream_data_wait .

Alors, que signifie cette colonne "Waiting Channel"? Et peut-être que signifient certaines de ces valeurs?

Capture d'écran

8128
la source

Réponses:

42

Le canal en attente est l'endroit dans le noyau où la tâche est actuellement en attente. Une tâche doit attendre une ressource, qui peut être une donnée ou un temps de traitement. Ces deux comprennent les sockets réseau, le matériel, les fichiers, etc. puisque la plupart ne sont que des fichiers, dans des systèmes de type Unix.

  • 0: Le processus n'attend pas

  • poll_schedule_timeout

    poll()est un appel système 1 utilisé pour gérer les E / S. C'est semblable à select(). 2

    Les applications qui utilisent des E / S non bloquantes utilisent ces appels pour voir si elles peuvent lire ou écrire dans un fichier, sans avoir à le bloquer. Ils sont souvent utilisés pour les flux d’entrée / sortie, qui ne peuvent pas être bloqués (sinon, votre souris s’arrêterait pour se déplacer).

    Le canal en attente poll_schedule_timeoutindique qu'une tâche attend des E / S, qu'il s'agisse de claviers et de souris, de périphériques audio ou même de sockets réseau.

    1. Une fonction dans le noyau
    2. Ils sont définis dans <linux/poll.h>. pollétait une implémentation apparue dans System V, selectest l’équivalent BSD UNIX.
  • futex_wait_queue_me:

    Pour expliquer cela, nous devons regarder Locks. Un verrou est un état enregistré dans le système qui indique qu'une tâche fonctionne avec une ressource. Par exemple, il ne peut y avoir qu'une seule tâche qui lit un fichier. Cette tâche verrouillerait le fichier. Toute autre tâche 1 essayant de lire le fichier saurait qu’elle était verrouillée et attendrait que le verrou disparaisse avant de pouvoir y accéder. La même chose se passe pour le temps processeur.

    La version moderne de Linux (sur la plupart des architectures) utilise un verrou Futex (fast userspace mutex) dans le noyau. Mutex, exclusion mutuelle, fait référence à l'idée qu'une ressource commune n'est accessible que par une tâche à la fois. Pour cela, les indicateurs dans le système sont définis.

    Si un processus attend une ressource verrouillée, il s’appelle Busy Waiting ou "Spinning". Il fait référence au fait qu’il essaie d’y accéder encore et encore, jusqu’à ce qu’il le puisse. Une tâche est dite bloquée quand elle tourne.

    Si vous pouvez lire ceci, vous êtes obligé de corriger au moins une erreur dans cette réponse: P

    Les verrous Futex peuvent être considérés comme un nombre dans l'espace utilisateur, pouvant être incrémenté ou décrémenté par une tâche (dans le cas où la ressource peut être accédée par plusieurs tâches, ce nombre peut devenir supérieur à un). C'est le numéro indiqué sur le diagramme 4 .

    Ces tâches se mettent en file d'attente dans la file d'attente , une simple file de tâches nécessitant du travail, une fois que le temps de traitement est disponible, les tâches fonctionnent et sont supprimées de la file d'attente.

    futex_wait_queue_memet en file d'attente une tâche. Il attend ensuite un signal, une pause ou un réveil. Les tâches qui se trouvent dans ce canal en attente n'attendent pas la file d'attente, elles attendent d'être mises en file d'attente.


    1. Une tâche peut être un processus 3 ou un thread 2
    2. Un fil de discussion est une sous-section d'un processus. Beaucoup de threads peuvent fonctionner en parallèle
    3. Un processus est un programme complet, il se compose d'un ou plusieurs threads, bien qu'un programme puisse également comporter plusieurs processus.
    4. Rappelez-vous qu'il s'agit toujours d'une vue de très haut niveau, sans tenir compte des détails de la mise en œuvre.
  • __skb_recv_datagram

    Attendez quelques données sur une prise réseau verrouillée.

  • sk_wait_data

    Attendez quelques données sur une prise réseau.

  • do_exit

    Ceci est la dernière partie de quitter un processus. do_exit()appelle le schedule()suivant, pour planifier un autre processus. Quand do_exit()est appelé, le processus est un ZOMBIE.

  • do_wait

    Un processus est ajouté à la file d'attente des planificateurs.

  • pipe_wait, unix_stream_data_wait

    Un processus attend les données d'un sous-processus. Cela se produit, par exemple, lorsque vous exécutez ce type de code:

    echo | sleep 10 && echo hallo              # pipe
    

    ou

    cat < hello.c                              # unix data stream
    
  • hrtimer_nanosleep

    Le processus est en sommeil, en utilisant la hrtimer_nanosleep()méthode. Cette méthode peut être utilisée par un programme pour dormir pendant des intervalles de temps spécifiques, avec une précision de l'ordre de la nanoseconde.

Ce ne sont pas tous, mais je n'ai pas observé d'autres. Postez un commentaire si j'ai oublié quelque chose.

Stefano Palazzo
la source
J'ai rencontré sleep_on_page_killable?
Emmanuel M. Smith
La cause la plus probable de sleep_on_page_killable est que le processus tente de charger une page qui n'est pas en mémoire, ce qui provoque une erreur de page et le processus doit être mis en veille jusqu'à ce que la page soit chargée. Si le sous-système d'E / S est surchargé (peut-être parce que vous faites beaucoup d'E / S), cela peut être fréquent.
Tsuna
qu'en est-il signal? J'ai couru dans ça. Le processus est-il mort? zombi? ou quoi? qu'adviendra-t-il du processus?
itsnotmyrealname
11

La valeur du canal en attente est le nom de la fonction du noyau dans laquelle le processus est actuellement bloqué.

Le nom est généralement lié à un appel système, qui comportera une page de manuel.

  • futex_wait_queue_me est liée à futex . Il fait référence à un type de verrou mutex (exclusion mutuelle d'espace utilisateur rapide) utilisé pour planifier le fonctionnement de nombreux processus sur un processeur. L'état indique que votre processus est mis en file d'attente pour recevoir le verrou. 2
  • do_wait est lié à attendre .
  • etc.

Si vous voulez vraiment des informations plus détaillées, vous pouvez vérifier la source du noyau .

Si vous tapez cat /proc/some_pid/stackun terminal, vous obtiendrez une sortie comme celle-ci:

[<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

Et sur la première ligne, vous obtenez ce qui est affiché sur le moniteur du système. Pour autant que je sache, poll_schedule_timeout indique que votre processus attend quelque chose.

Il traite des E / S asynchrones et de la scrutation .

Source (s): 1. canal d’attente de traitement (WCHAN) et alarme? - 2. Réponse AskUbuntu

Maxime R.
la source
Reformulez cela. : P
Stefano Palazzo
On dirait que vous avez remarqué que j'ai réutilisé votre réponse pour améliorer celle-ci ;-) Quel type d'attribution aimeriez-vous avoir?
Maxime R.
2
Votre commentaire est plus que suffisant pour que je reste heureux :) Si vous souhaitez en savoir plus sur le fonctionnement de l'attribution, il y a un article sur SO sur le blog SO . Ne vous inquiétez pas trop à ce sujet cependant, je veux que les gens réutilisent mon travail autant que possible.
Stefano Palazzo
1
Eh bien, je viens d'écrire une question sur ce sujet sur méta. (avait déjà lu l'article du blog)
Maxime R.
C'est ici . Et je parie que votre réponse finira sur la mienne à un moment donné ^^
Maxime R.