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_timeout
indique 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.
- Une fonction dans le noyau
- Ils sont définis dans
<linux/poll.h>
. poll
était une implémentation apparue dans System V, select
est 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.
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_me
met 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.
- Une tâche peut être un processus 3 ou un thread 2
- Un fil de discussion est une sous-section d'un processus. Beaucoup de threads peuvent fonctionner en parallèle
- Un processus est un programme complet, il se compose d'un ou plusieurs threads, bien qu'un programme puisse également comporter plusieurs processus.
- 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.