199 votes

Redis est monothread, alors comment faut-il faire une e/S simultanées?

En essayant de comprendre quelques notions de base de Redis, je suis tombé sur un intéressant billet de blog .

L'auteur déclare:

Redis est mono-thread avec epoll/kqueue et l'échelle indéfiniment en termes d'I/O de la simultanéité.

J'ai sûrement mal comprendre l'ensemble du filetage chose, parce que je trouve cette déclaration énigmatique. Si un programme est monothread, comment faut-il faire quelque chose en même temps? Pourquoi il est si grand que le Redis opérations sont atomiques, si le serveur est mono-thread, de toute façon?

Quelqu'un pourrait-il s'il vous plaît faire la lumière sur la question?

404voto

Didier Spezia Points 23333

Eh bien cela dépend de comment vous définissez la simultanéité.

Dans logiciel côté serveur, la concurrence et parallélisme sont souvent considérés comme des concepts différents. Dans un serveur, l'appui simultané des e/s signifie que le serveur est capable de servir plusieurs clients par l'exécution de plusieurs flux correspondant à ces clients avec une seule unité de calcul. Dans ce contexte, le parallélisme voudrait dire que le serveur est capable d'effectuer plusieurs choses en même temps (avec plusieurs unités de calcul), ce qui est différent.

Par exemple, un barman est en mesure de s'occuper de plusieurs clients, alors qu'il ne peut pas préparer une boisson à la fois. Donc, il peut fournir la simultanéité sans parallélisme.

Cette question a été débattue ici: La simultanéité vs Parallélisme - Quelle est la différence?

Voir également cette présentation de Rob Pike.

Un single-threaded programme peut certainement fournit la simultanéité de l'I/O niveau à l'aide d'un I/O (de)mécanisme de multiplexage et une boucle (qui est ce que le Redis).

Le parallélisme a un coût: les prises multiples/multiples coeurs que vous pouvez trouver sur le matériel moderne, la synchronisation entre les threads est extrêmement coûteux. D'autre part, le goulot d'étranglement de l'efficacité du moteur de stockage comme le Redis c'est très souvent le réseau, bien avant de l'UC. Événement isolé boucles (qui ne nécessitent pas de synchronisation) sont donc considérés comme un bon design pour construire efficace, évolutive des serveurs.

Le fait que le Redis opérations atomiques est simplement une conséquence de la single-threaded boucle d'événements. Le point intéressant est l'atomicité est fourni sans coût supplémentaire (il ne nécessite pas de synchronisation). Il peut être exploité par l'utilisateur de mettre en œuvre le verrouillage optimiste et d'autres modèles sans avoir à payer pour la synchronisation des frais généraux.

22voto

Martin James Points 15655

OK, Redis est monothread au niveau de l'utilisateur, otoh, que, toutes les e/S asynchrones est pris en charge par le noyau des pools de threads et/ou split-level drivers.

'Concurrent', pour certaines, parmi lesquels la distribution des événements de réseau à la prise des machines d'états. C'est monothread, fonctionne sur une base, (au niveau de l'utilisateur), donc je ne voudrais pas se référer à ce que concurrentes. Les autres diffèrent..

'échelle indéfiniment en termes d'I/O, la simultanéité' est juste d'être économe avec la vérité. Ils peuvent obtenir plus de la croyance si ils ont dit "peut-échelle de mieux qu'un thread par client, en fournissant les clients ne demandons pas grand-chose", même si ils peuvent alors se sentir obligé d'ajouter "soufflé sur une charge lourde par d'autres async solutions que d'utiliser tous les cœurs au niveau de l'utilisateur'.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X