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_exit, faire_attendre, 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?
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.
<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.
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.
__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.
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.
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