9
votes

Comment Linux bloquant-t-il que les E / S fonctionnent réellement?

sous Linux, lorsque vous faites un appel d'E / S bloquant comme Lire ou accepter, qu'est-ce qui arrive réellement?

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?


1 commentaires

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.


3 Réponses :


-1
votes

Lire ceci: http://www.minix3.org/doc/

C'est une explication très simple, claire et très facile à comprendre. Il s'applique généralement à Linux, également.


0 commentaires

0
votes

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 ...

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.


0 commentaires

14
votes

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:

  1. Le pilote de périphérique crée lire et écrire des files d'attente pour un appareil.
  2. tout fil de processus voulant attendre pour les E / S est mis sur le attendre la file d'attente. Quand une interruption se produit Le gestionnaire se réveille un ou plusieurs fils d'attente. (Évidemment le Les threads ne fonctionnent pas immédiatement comme nous sommes en interruption contexte, mais sont ajoutés à la Queue de planification du noyau).
  3. quand prévu par le noyau le Vérifications de fil pour voir si les conditions sont juste pour cela de procéder - sinon Il remonte à la file d'attente d'attente.

    un exemple typique (légèrement simplifié):

    dans le pilote à l'initialisation: xxx

    dans la fonction de lecture d'un pilote : xxx

    puis le gestionnaire d'interruption ne fait que des problèmes: xxx

    Notez que wait_event_interruptible () est une macro qui cache une boucle qui vérifie une condition - lis_avail! = 0 dans ce cas - ajoute à plusieurs reprises à la file d'attente d'attente si elle est réveil lorsque la condition n'est pas vraie.

    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.

    Voir le lien de pilote de périphérique Linux pour plus de détails - PDF disponible ici: http://lwn.net/kernel/ldd3


0 commentaires