2010-05-03 3 views
3

Je développe un protocole de messagerie actif pour le calcul parallèle qui remplace TCP/IP. Mon but est de diminuer la latence d'un paquet. Comme l'environnement est un LAN, je peux remplacer TCP/IP par un protocole plus simple pour réduire la latence des paquets. Je n'écris aucun pilote de périphérique et j'essaye juste de remplacer la pile TCP/IP avec quelque chose de plus simple. Maintenant, je voulais éviter la copie des données d'un paquet de l'espace utilisateur à l'espace noyau et vice-versa. J'ai entendu parler du mmap(). Est-ce le meilleur moyen de le faire? Si oui, ce sera bien si vous pouvez donner des liens vers des exemples. Je suis un débutant linux et je vous remercie de votre aide .. Merci ...Eviter la copie de données entre l'espace utilisateur et l'espace noyau et vice-versa

Merci, Bala

+2

Si vous êtes un "débutant linux", j'y penserais à deux fois avant d'essayer de remplacer TCP/IP par quelque chose de "plus simple". Même sur un réseau local, ne supposez pas que vous pouvez vous passer de fonctionnalités telles que les sommes de contrôle et les retransmissions. –

+0

ya .. mais j'apprends linux et espère faire ce projet. Vos suggestions sont les bienvenues ... – bala1486

Répondre

3

Vous devez utiliser UDP, qui est déjà assez rapide. Au moins, c'était assez rapide pour que W32/SQLSlammer se propage à travers tout Internet. À propos de votre question initiale, voir les appels système Linux (vm)splice et tee.

De la page de manuel:

Les trois appels système splice (2), vmsplice (2) et T (2)), fournir programmes de l'espace utilisateur avec un contrôle total sur un tampon arbitraire du noyau, implémenté dans le noyau en utilisant le même type de tampon qui est utilisé pour un tuyau. En vue d'ensemble, ces systèmes appels effectuent les tâches suivantes:

épissure (2)

moves data from the buffer to an arbitrary file descriptor, or vice 

versa, ou d'un tampon à l'autre.

T (2)

"copies" the data from one buffer to another. 

vmsplice (2)

"copies" data from user space into the buffer. 

Bien que nous parlons de la copie, réelles copies sont généralement évités. Le noyau le fait en implémentant un tampon de canalisation sous la forme d'un ensemble de pointeurs comptés par référence aux pages de la mémoire du noyau . Le noyau crée « copies » de pages dans un tampon par la création de nouveaux pointeurs (pour le tampon de sortie ) se référant aux pages et augmenter les comptages de référence pour les pages: seuls les pointeurs sont copiés, pas les pages de le tampon.

+0

Nous vous remercions de votre suggestion. En fait, je dois absolument réduire la latence du réseau en contournant la pile TCP/IP. C'est mon expérimentation pour ma thèse. Fondamentalement, j'ai besoin d'un tampon qui est partagé entre le noyau et l'espace utilisateur. Avez-vous des idées pour le faire? Merci .... – bala1486

+0

-1 pour l'utilisation UDP ... Aucune raison plus aujourd'hui – Artyom

+0

Vous plaisantez? Peut-être devriez-vous faire quelques repères. Comprenez-vous la différence entre les paquets et les flux? Vous savez, la vitesse vient à un compromis, et les avantages de la vitesse/latence de l'UDP sont bien compris. – ypnos

0

L'environnement est un réseau local, je peux remplacer TCP/IP avec protocole plus simple pour réduire le temps d'attente des paquets

En général, même dans des paquets LAN UDP ont tendance à perdre, ils seront également être perdu si le client n'a pas assez de temps pour le consommer ...

SO non, ne remplacez pas TCP par autre chose (UDP).Car si vous avez besoin d'une livraison fiable, TCP serait le plus rapide (car tout ce qui est connecté aux accusés de réception et à la retransmission est fait dans l'espace noyau).

En général, dans le cas normal il n'y a pas des inconvénients de latence en utilisant TCP (bien sûr ne pas oublier TCP_NODELAY option)

A propos du partage de la mémoire. En fait, toute la mémoire que vous allouez est créée avec mmap. Le noyau devra donc le copier d'une manière ou d'une autre lorsqu'il créera un paquet à partir du pilote. Si vous parlez de réduire la copie, il est généralement fait pour les fichiers/sockets et sendfile() utilisé qui empêche en effet la copie de données entre le noyau et l'utilisateur. Mais je suppose que vous n'avez pas besoin d'envoyer des fichiers.

+0

Les paquets UDP n'ont * pas * tendance à se perdre dans le réseau local. Et le tampon de réception de l'OS est en fait assez important. Vous devriez vérifier vos faits avant de déprécier les autres. – ypnos

+0

@ynpos - oui, ils sont (pour l'expérience). De plus, le fait que les tampons soient volumineux n'empêche pas n'importe quel type de serveur de perdre du CPU pour une raison quelconque et les tampons peuvent devenir pleins. Donc, oui, les paquets UDP ne sont pas souvent perdus mais cela arrive. Vous ne pouvez pas relayer cela. – Artyom

Questions connexes