sous Linux, lorsque vous faites un appel d'E / S bloquant comme Lire ou accepter, qu'est-ce qui arrive réellement? P>
Mes pensées: Le processus est sorti de la file d'attente d'exécution, placé dans un état d'attente ou de blocage sur une file d'attente d'attente. Ensuite, lorsqu'une connexion TCP est faite (pour accepter) ou que le disque dur est prêt ou que quelque chose pour un fichier lu, une interruption matérielle est relevée qui permet aux processus d'attente de se réveiller et de s'exécuter (dans le cas d'un fichier lu, comment Linux Sachez quels processus éveillez, car il pourrait y avoir beaucoup de processus qui attendent différents fichiers?). Ou peut-être au lieu d'interruption du matériel, le processus individuel lui-même interroge pour vérifier la disponibilité. Pas sûr, aide? P>
3 Réponses :
Lire ceci: http://www.minix3.org/doc/ P >
C'est une explication très simple, claire et très facile à comprendre. Il s'applique généralement à Linux, également. P>
Effectifly La méthode ne reviendra que lorsque le fichier est prêt à lire, lorsque les données sont sur une prise, lorsqu'une connexion est arrivée ... P>
Pour vous assurer qu'il peut retourner immédiatement, vous souhaitez probablement utiliser le Sélectionnez appel système pour rechercher un descripteur de fichier prêt. P>
Chaque périphérique Linux semble être mis en œuvre légèrement différemment et la manière préférée semble varier toutes les sorties Linux en tant que fonctionnalités de noyau plus sûres / plus rapides, mais généralement:
un exemple typique (légèrement simplifié): p>
dans le pilote à l'initialisation: p> dans la fonction de lecture d'un pilote : p> puis le gestionnaire d'interruption ne fait que des problèmes: p> Notez que wait_event_interruptible () est une macro qui cache une boucle qui vérifie une condition - Comme mentionné il y a un Nombre de variations - la principale est que s'il y a potentiellement beaucoup de travail pour le gestionnaire d'interruption à faire, il fait le nu le minimum lui-même et se détache le reste à une file d'attente de travail ou à une tâche (généralement connue sous le nom de «moitié inférieure») Et c'est ceci qui réveillerait les fils d'attente. P> Voir le lien de pilote de périphérique Linux pour plus de détails - PDF disponible ici:
http://lwn.net/kernel/ldd3 p> p> lis_avail! = 0 code> dans ce cas - ajoute à plusieurs reprises à la file d'attente d'attente si elle est réveil lorsque la condition n'est pas vraie. P>
Vous frappez à peu près le clou sur la tête (à l'exception de la dernière remarque, il n'y a pas de vote, pour la plupart). Le multiplexage entre les serveurs Mulitiple et les fichiers est effectué par le noyau, qui est un processus invisible qui coordonne des choses comme celle-ci pour le compte de tous les autres processus.