2009-08-06 8 views
36

Il était une fois je suis tombé sur Introduction to Indy article et ne peux pas arrêter de penser à bloquer vs non-bloquant IO depuis lors.Blocs d'E/S non bloquants; à la recherche de bons articles

Vous cherchez de bons articles décrivant quels sont les avantages et les inconvénients de blocage IO et non-bloquant IO et comment concevoir votre application dans chaque cas pour obtenir un code naturel, facile à comprendre et facile à maintenir.
aimerait comprendre l'image BIG ...

Répondre

15

Les points positifs et négatifs sont coupés assez clair:

Blocking - programmation linéaire, plus facile à coder, moins de contrôle.
Non bloquant - Programmation parallèle, plus difficile à coder, plus de contrôle.

44

L'IO de blocage de puits signifie qu'un thread donné ne peut rien faire de plus tant que l'IO n'est pas entièrement reçu (dans le cas des sockets, cette attente peut être longue).

E/S non bloquantes signifie qu'une requête E/S est immédiatement mise en file d'attente et la fonction retourne. L'E/S réel est ensuite traité à un pointeur ultérieur par le noyau. Pour bloquer les E/S, vous devez soit accepter que vous allez attendre chaque requête d'E/S, soit avoir besoin de déclencher un thread par requête (ce qui devient très compliqué très rapidement). Pour les E/S non bloquantes, vous pouvez envoyer plusieurs requêtes, mais vous devez garder à l'esprit que les données ne seront pas disponibles avant un certain point «plus tard». Cette vérification de l'arrivée des données est probablement la partie la plus compliquée.

Dans 99% des applications, vous n'avez pas besoin de vous soucier de vos blocs d'E/S. Parfois, cependant, vous avez besoin de la performance supplémentaire de vous permettre d'initier une demande d'E/S, puis de faire autre chose avant de revenir et, espérons-le, de trouver que la requête d'E/S est terminée.

Quoi qu'il en soit, juste mon tuppence.

+1

Les applications de formulaires se soucient à peu près 100% du temps si les blocs d'E/S sont bloqués. Les utilisateurs n'aiment pas les interfaces graphiques qui se bloquent. –

+7

Rien ne vous empêche d'exécuter un thread séparé qui effectue toutes les E/S en série et en bloquant ... – Goz

0

Je n'ai pas trouvé de bons articles.

J'ai demandé ici des suggestions sur la façon de disposer async Code IO: tidy code for asynchronous IO

Les réponses étaient en fait pas très réchauffement. Async IO est une bête pour se mettre la tête et déboguer, surtout si vous utilisez des déclencheurs de front (par exemple l'epoll de Linux avec le flag EPOLLET). Mais c'est ce que vous payez en complexité de code, vous gagnez en performance et en évolutivité.

Questions connexes