web-dev-qa-db-fra.com

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

Dans l'onglet Processus de GNOME System Monitor, il y a une colonne "Canal en attente". De loin les valeurs les plus communes que je vois ici est poll_schedule_timeout , mais je vois aussi d'autres valeurs: do_exitfaire_attendrefutex_wait_queue_mepipe_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?

Screenshot

36
8128

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 d'entre eux 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ème1 utilisé pour gérer les E/S. Cela ressemble à 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_timeout indique qu'une tâche attend des E/S, qu'il s'agisse de matériel comme des claviers et des souris, des périphériques audio ou même des sockets réseau.

    1. Une fonction dans le noyau
    2. Ils sont définis dans <linux/poll.h>. poll était une implémentation apparue pour la première fois dans System V, select était 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âche1 Si vous essayez de lire le fichier, il sait qu'il est verrouillé et attend 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, cela s'appelle Busy Waiting ou "Spinning", en référence au fait qu'il tente d'y accéder par dessus et fini, jusqu'à ce qu'il puisse. Une tâche est dite bloquée lorsqu'elle tourne.

    If you can read this, you are obligated to correct at least one mistake in this answer :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 les 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é dans le diagramme4.

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

    futex_wait_queue_me met en file d'attente une tâche. Il attend ensuite un signal, une pause ou un réveil. Les tâches qui sont dans ce canal en attente n'attendent pas, mais attendent d'être placées dans la file d'attente.


    1. Une tâche peut être soit un processus3 ou un fil2
    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 de 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() next pour planifier un autre processus. Lorsque 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 veille, à l'aide de la méthode hrtimer_nanosleep(). Cette méthode peut être utilisée par un programme pour dormir pendant des intervalles de temps spécifiques, avec une précision de nanosecondes.

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

42
Stefano Palazzo

La valeur du canal en attente correspond au 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é à futex . Il fait référence à un type de mutex verrouiller (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é à wait .
  • etc.

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

Si vous tapez cat /proc/some_pid/stack dans un 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. Autant que je sache, poll_schedule_timeout indique que votre processus attend quelque chose.

Il traite avec E/S asynchrones et scrutation .

Source (s): 1. canal d’attente du processus (WCHAN) et alarme? - 2. réponse AskUbunt

11
Maxime R.