Notes de lecture de la programmation serveur haute performance Linux

Famille de protocoles TCP / IP

Protocole TCP détaillé

Caractéristiques du service TCP

  • Orienté connexion, flux d'octets
  • Transmission fiable
    Les deux parties qui utilisent le protocole TCP pour communiquer doivent d'abord établir une connexion avant de lire et d'écrire des données. Ce n'est qu'alors que la lecture et l'écriture des données peuvent commencer. Les deux parties doivent allouer les ressources du noyau nécessaires à la connexion pour gérer l'état de la connexion et la transmission des données sur la connexion. La connexion TCP est en duplex intégral. Autrement dit, la lecture et l'écriture des données des deux parties peuvent être effectuées via une connexion. Une fois l'échange de données terminé, les deux parties doivent se déconnecter pour libérer les ressources système.

API de base du réseau Linux

Données lues et écrites

Lecture et écriture de données TCP

#include<sys/types.h>
#include<sys/socket.h>
ssize_t recv(int sockfd,void *buf,size_t len,int flags);
ssize_t send(int sockfd,const void *buf,size_t len,int flags);

recv lit les données ci-dessus sockfg, les paramètres buf et len ​​spécifient respectivement l'emplacement et la taille du tampon de lecture. Les indicateurs sont généralement définis sur 0. Lorsque recv réussit, il renvoie la longueur des données réellement lues, qui peut être inférieure à la longueur len, il peut donc être nécessaire d'appeler recv plusieurs fois pour lire les données complètes. recv peut renvoyer 0, ce qui signifie que le partenaire de communication a été fermé. Lorsque recv échoue, il renvoie -1 et définit errno.
send écrit des données dans sockfd. Les paramètres buf et len ​​spécifient respectivement l'emplacement et la taille du tampon d'écriture. Lorsque l'envoi réussit, il renvoie la longueur des données réellement écrites, et en cas d'échec, il renvoie -1 et définit errno.

Fonctions d'E / S avancées

fonction pipe

La fonction pipe peut être utilisée pour créer un tuyau. Pour réaliser une communication inter-processus. Il renvoie 0 en cas de succès et -1 en cas d'échec.

#include<unistd.h>
int pipe(int fd[2]);

Les deux descripteurs de fichier fd [0] et fd [1] créés par la fonction pipe constituent respectivement les deux extrémités du pipe. Les données écrites dans fd [1] peuvent être lues à partir de fd [0]. De plus, fd [0] ne peut lire que les données du tube, et fd [1] ne peut écrire que des données sur le tube. Il ne peut pas être utilisé dans l'autre sens. Si vous souhaitez obtenir une transmission de données bidirectionnelle, vous devez utiliser deux canaux. Par défaut, cette paire de descripteurs de fichiers est bloquée. À ce stade, si vous utilisez read pour lire un tube vide. Ensuite, la lecture sera bloquée. Jusqu'à ce qu'il y ait des données lisibles dans le pipeline. Si vous utilisez write pour écrire des données dans un tube complet. L'écriture sera également bloquée. Jusqu'à ce que le pipeline dispose de suffisamment d'espace libre.
Le pipeline lui-même a une limite de capacité. Il spécifie si l'application ne lit pas les données du canal. Le nombre maximal d'octets de données pouvant être écrits sur le canal. La capacité du canal peut être fcntlmodifiée par des fonctions

#include<sys/types.h>
#include<sys/socket.h>
int socketpair(int domain,int type,int protocol,int fd[2]):

Le domaine dans socketpair ne peut utiliser que la famille de protocoles de domaine local UNIX AF_UNIX, car ce canal bidirectionnel ne peut être utilisé que localement. À ce stade, le fd peut être lu ou écrit

fonctions dup et dup2

Les fonctions dup et dup2 peuvent rediriger l'entrée standard vers un fichier ou diriger la sortie standard vers une connexion réseau.

#include<unistd.h>
int dup(int fd);
int dup2(int fd1,int fd2):

La fonction dup crée un nouveau descripteur de fichier. Le nouveau descripteur de fichier et le descripteur d'origine fd pointent vers le même fichier, canal ou connexion réseau. Et le descripteur de fichier renvoyé par dup prend toujours la plus petite valeur entière actuellement disponible dans le système. dup2 est similaire à dup, mais il renverra la première valeur entière non inférieure à fd2. Les deux renvoient -1 et définissent errno lorsque l'appel échoue.
Remarque: le descripteur de fichier créé par dup et dup2 n'hérite pas des attributs du descripteur de fichier d'origine. Par exemple, close-on-exec et non bloquant.

Spécification du programme du serveur Linux

Cadre de programmation serveur


Unité de traitement d'E / S de programme à serveur unique : gère les connexions client, lit et écrit les données réseau,
unité logique: processus métier ou thread,
unité de stockage réseau: base de données locale, file d'
attente de demande de fichier ou de cache : méthode de communication entre les unités, E / S de
cluster de serveurs
Unité de traitement: En tant que serveur d'accès, réalisant l'équilibrage de charge.
Unité logique: Serveur logique
Unité de stockage réseau: File d'attente des requêtes du serveur de base de données
: Connexion TCP permanente entre serveurs

Unité de traitement E / S

Le serveur gère le module de connexion client.

Devoir

Attendez et acceptez la nouvelle connexion client, acceptez les données client et renvoyez la réponse du serveur au client. Cependant, l'envoi et la réception de données ne sont pas nécessairement effectués dans l'unité de traitement d'E / S. Il peut également être exécuté dans une unité logique, et l'endroit où il est exécuté dépend du mode de traitement des événements. Pour un cluster de serveurs, l'unité de traitement d'E / S est un serveur d'accès dédié, qui implémente l'équilibrage de charge et sélectionne le moins chargé parmi tous les serveurs logiques pour servir les nouveaux clients.

Unité logique

Une unité logique est généralement un processus ou un thread. Il analyse et traite les données client, puis transmet les résultats à l'unité de traitement d'E / S ou directement au client (la méthode utilisée dépend du mode de traitement des événements). Pour un cluster de serveurs, une unité logique elle-même est un serveur logique. Les serveurs ont généralement plusieurs unités logiques. Afin de réaliser le traitement parallèle de plusieurs tâches client.

Unité de stockage réseau

Il peut s'agir d'une base de données, d'un cache et d'un fichier. Même un serveur séparé, mais ce n'est pas nécessaire. Par exemple, les services de connexion tels que ssh et telent n'ont pas besoin de cette unité.

Demande de file d'attente

C'est une abstraction du mode de communication entre les unités. Lorsque l'unité de traitement d'E / S reçoit une demande client, elle doit notifier une unité logique d'une manière ou d'une autre pour traiter la demande. De même, lorsque plusieurs unités logiques accèdent à une unité de stockage en même temps, un mécanisme est également nécessaire pour coordonner la gestion des conditions de course. La file d'attente de demandes est généralement implémentée dans le cadre du pool. Pour le cluster de serveurs, la file d'attente des demandes est une connexion TCP préétablie, statique et permanente entre chaque serveur

Modèle d'E / S

Le socket est bloqué par défaut lors de sa création. Vous pouvez passer l' SOCK_NONBLOCKindicateur au deuxième paramètre de l'appel système de socket ou le définir sur non bloquant via la commande F_SETFL de l'appel système fcntl.
Block I / O a
bloqué les descripteurs de fichier. Les appels système exécutés pour ce type d'E / S peuvent être suspendus par le système d'exploitation car ils ne peuvent pas être exécutés immédiatement. Jusqu'à ce que l'événement d'attente se produise. Dans l'API socket de base, les appels système qui peuvent être bloqués sont:

  • J'accepte
  • envoyer
  • recv
  • connectez le descripteur de fichier
    non bloquant d'E / S
    non bloquant. Les appels système exécutés pour ce type d'E / S retournent toujours immédiatement. Peu importe si l'événement s'est produit. Si l'événement ne se produit pas immédiatement, l'appel système est également renvoyé.
    Résumé
    De toute évidence, le fait de ne faire fonctionner les E / S non bloquantes (lecture, écriture, etc.) que lorsque l'événement s'est produit peut améliorer l'efficacité du programme. Par conséquent, les E / S non bloquantes doivent généralement être utilisées avec d'autres mécanismes d'E / S. Par exemple, multiplexage d'E / S et signaux SIGIO.

Multiplexage E / S

Le programme d'application enregistre un ensemble d'événements avec le noyau via la fonction de multiplexage d'E / S, et le noyau notifie l'application des événements prêts via la fonction de multiplexage d'E / S. Les fonctions de multiplexage d'E / S couramment utilisées sous Linux sont select, poll et epoll_wait.
Remarque: les fonctions de multiplexage d'E / S elles-mêmes sont bloquantes. La raison pour laquelle elles peuvent améliorer l'efficacité du programme est qu'elles ont la capacité de surveiller plusieurs événements d'E / S.
Evénements d'E / S

Je suppose que tu aimes

Origine blog.csdn.net/weixin_39308337/article/details/108522820
conseillé
Classement