Linux États De Processus
Sous Linux, ce qui se passe à l'état d'un processus lorsqu'il a besoin de lire des blocs à partir d'un disque? Est-il bloqué? Si oui, comment est un autre procédé choisi de s'exécuter?
Vous devez vous connecter pour publier un commentaire.
En attendant
read()
ouwrite()
vers/à partir d'un fichier descripteur de retour, le processus sera mis dans un type particulier de sommeil, connu comme le "D" ou "la Veille du Disque". C'est spécial, parce que le processus ne peuvent pas être tués ou interrompu alors que dans un tel état. Un processus en attente d'un retour de ioctl() serait également mis à la veille de cette manière.Une exception à cette règle est lorsqu'un fichier (tel qu'un terminal ou un autre caractère de l'appareil) est ouvert dans
O_NONBLOCK
mode, adopté lors de son supposé que un périphérique (tel qu'un modem) auront besoin de temps pour s'initialiser. Toutefois, vous avez indiqué les périphériques de bloc dans votre question. Aussi, je n'ai jamais essayé unioctl()
qui est susceptible de bloquer sur un fd ouvert en non mode de blocage (au moins pas consciemment).Comment un autre processus est choisi dépend entièrement du planificateur, vous utilisez, ainsi que les autres processus pourrait avez fait pour modifier leur poids au sein de cette planificateur.
Certains programmes de l'espace utilisateur, dans certaines circonstances, ont été connus pour rester dans cet état pour toujours, jusqu'à ce que redémarré. Ce sont généralement groupés avec d'autres "zombies", mais le terme ne serait pas correct car ils ne sont pas techniquement obsolète.
Lorsqu'un processus a besoin d'extraire des données à partir d'un disque, elle s'arrête en cours d'exécution sur le PROCESSEUR de laisser à d'autres processus de s'exécuter car l'opération peut prendre beaucoup de temps – à moins de 5ms temps de recherche pour un disque qui est commun, et 5ms est de 10 millions de cycles de PROCESSEUR, une éternité, du point de vue de la programme de!
Du programmateur de point de vue (aussi dit "userspace"), c'est un système de blocage d'appel. Si vous appelez
write(2)
(qui est une fine libc wrapper autour de l'appel système du même nom), le processus n'est pas exactement s'arrêter à cette limite; il continue, dans le noyau, l'exécution de l'appel système de code. La plupart du temps, il va tout le chemin jusqu'à un pilote de contrôleur de disque (nom de fichier → système de fichiers/VFS → bloc périphérique → pilote de périphérique), où une commande pour récupérer un bloc sur le disque est soumis à un matériel, qui est une opération très rapide la plupart du temps.PUIS le processus est mis en état de veille (dans l'espace noyau, le blocage est appelé dormir, rien n'est jamais "bloqué" à partir du noyau de point de vue). Il sera réveillé une fois que le matériel a enfin récupéré les données appropriées, alors le processus sera marqué comme praticable et sera programmé. Finalement, le planificateur va exécuter le processus.
Enfin, dans l'espace utilisateur, le système de blocage d'appel revient avec un véritable statut et de données, et le déroulement du programme se poursuit.
Il est possible d'invoquer la plupart des I/O des appels système dans non-mode de blocage (voir
O_NONBLOCK
dansopen(2)
etfcntl(2)
). Dans ce cas, les appels système retourne immédiatement et uniquement rapport de la soumission de l'opération de disque. Le programmeur devra explicitement vérifier ultérieurement si l'opération s'est terminée, avec succès ou non, et de récupérer son résultat (par exemple, avecselect(2)
). Ceci est appelé asynchrone ou d'un événement en fonction de la programmation.Plus de réponses ici, de mentionner le D état (qui est appelé
TASK_UNINTERRUPTIBLE
dans le Linux des noms d'état) sont incorrects. Le D état est un spécial mode sommeil qui est déclenchée uniquement dans un espace noyau chemin de code, lorsque le chemin d'accès du code ne peut pas être interrompu (parce qu'il serait trop complexe à programmer), avec l'espoir qu'elle ne bloquer que pour un temps très court. Je crois que la plupart des "D états" sont en fait invisible; ils sont de très courte durée et ne peut pas être observé par l'échantillonnage des outils tels que 'top'.Vous pouvez rencontrer peut être tué dans le processus D état dans quelques situations. NFS est célèbre pour ça, j'ai rencontré à de nombreuses reprises. Je pense qu'il y a une sémantique de l'affrontement entre certains VFS chemins de code, qui supposent toujours des disques locaux et rapide de détection d'erreur (sur SATA, une erreur de délai d'attente seraient de l'ordre de quelques 100 ms), et NFS, qui récupère des données à partir du réseau qui est plus résistant et a la récupération lente (un timeout TCP de 300 secondes, est commun). Lire cet article pour les frais de solution introduit dans Linux 2.6.25 avec le
TASK_KILLABLE
état. Avant cette époque, il y avait un hack où l'on pouvait envoyer des signaux à NFS processus clients par l'envoi d'un signal SIGKILL à le thread du noyaurpciod
, mais oublier ce vilain truc..../proc/stat
?D
état: FUSIBLE Lent des systèmes de fichiers.Un processus à effectuer des e/S sera mise en D état (interrompu le sommeil), ce qui libère le CPU jusqu'à ce qu'il y a une interruption matérielle qui indique au PROCESSEUR pour revenir à l'exécution du programme. Voir
homme ps
pour les autres états de processus.En fonction de votre noyau, il y a un process scheduler, qui conserve la trace d'une runqueue de processus prêts à s'exécuter. Il, avec un algorithme d'ordonnancement, indique au noyau de processus pour l'attribuer à qui de la CPU. Il y a le noyau des processus et des processus utilisateur à prendre en compte. Chaque processus se voit attribuer une tranche de temps, ce qui est un morceau de temps CPU qu'il est autorisé à utiliser. Une fois que le processus utilise la totalité de sa tranche de temps, il est marqué comme étant arrivé à expiration et une priorité moindre dans l'algorithme d'ordonnancement.
Dans le noyau 2.6, il y a un O(1) fois la complexité planificateur de, donc, peu importe la façon dont de nombreux procédés, vous avez en cours d'exécution, il va assigner des Cpu en temps constant. C'est plus compliqué, mais, depuis 2.6 introduit la préemption et le PROCESSEUR d'équilibrage de charge n'est pas facile de l'algorithme. En tout cas, c'est efficace et les Processeurs ne sera pas rester les bras croisés pendant que vous attendez pour l'I/O.
Comme déjà expliqué par d'autres personnes, les processus en "D" état (sans interruption du sommeil) sont responsables pour le coup de ps processus. Pour moi, il est arrivé à plusieurs reprises avec RedHat 6.x et auto-montés NFS répertoires de base.
À la liste des processus en D état, vous pouvez utiliser les commandes suivantes:
De connaître le répertoire courant du processus et, peut être, de la monté en NFS disque qui a des problèmes, vous pouvez utiliser une commande similaire à l'exemple suivant (remplacer 31134 avec le processus du sommeil numéro):
J'ai trouvé que le don de la commande umount avec l'option-f (force) de l'interrupteur, liées à la montée du système de fichiers nfs, a été en mesure de se réveiller le processus du sommeil:
le fichier système n'a pas été démonté, car il était occupé, mais le processus n'a de réveil et j'ai été en mesure de résoudre le problème sans avoir à redémarrer.
En supposant que votre processus est un seul fil, et que vous êtes à l'aide de blocage I/O, votre processus de bloc d'attente pour les I/O pour valider. Le noyau va chercher un autre processus à exécuter dans l'intervalle basé sur la gentillesse, la priorité, la dernière moment de l'exécution, etc. Si il n'y a pas d'autres processus exécutables, le noyau ne fonctionnent pas; au lieu de cela, il va dire le matériel, la machine est à l'arrêt (ce qui entraînera une réduction de la consommation d'énergie).
Les processus qui sont en attente d'e/S se termine généralement dans l'état D, par exemple,
ps
ettop
.Oui, la tâche est bloquée dans l'appel système read (). Une autre tâche qui est prêt fonctionne, ou si pas d'autres tâches sont prêts, la tâche d'inactivité (pour la CPU) s'exécute.
Normal, le blocage de la lecture du disque provoque la tâche pour entrer dans le "D" de l'état (comme d'autres l'ont noté). Ces tâches contribuent à la moyenne de chargement, même s'ils ne sont pas la consommation de la CPU.
Certains autres types de IO, surtout ats et réseau, ne se comportent pas tout à fait le même - le processus se termine par un "S" de l'état et peut être interrompu et ne comptent pas dans la moyenne de charge.
Oui, les tâches en attente pour les IO sont bloqués, et d'autres tâches sont exécutées. La sélection de la prochaine tâche est effectuée par le Linux planificateur.
Généralement le processus se bloque. Si l'opération de lecture est sur un descripteur de fichier marqué comme non-blocage ou si le processus asynchrone IO il ne bloquera pas. Aussi, si le processus a d'autres sujets qui ne sont pas bloqués, ils peuvent continuer à fonctionner.
La décision quant à l'exécution du processus suivant est le planificateur dans le noyau.