Maison  >  Article  >  tutoriels informatiques  >  Six images expliquent clairement la technologie Linux zéro copie

Six images expliquent clairement la technologie Linux zéro copie

WBOY
WBOYavant
2024-02-22 18:40:02614parcourir

Six images expliquent clairement la technologie Linux zéro copie

Bonjour à tous, parlons aujourd'hui de la technologie Linux zéro copie. Nous utiliserons l'appel système sendfile comme point d'entrée pour explorer en profondeur les principes de base de la technologie zéro copie. L'idée principale de la technologie zéro copie est de minimiser la copie des données entre les mémoires et d'améliorer l'efficacité et les performances de la transmission des données en optimisant le chemin de transmission des données.

1. Introduction à la technologie zéro copie

La technologie Linux zéro copie est une technologie utilisée pour optimiser la transmission de données. Elle améliore l'efficacité de la transmission de données en réduisant le nombre de copies de données entre le mode noyau et le mode utilisateur.

Pendant le processus de transmission des données, il est généralement nécessaire de copier les données du tampon du noyau vers le tampon d'application, puis du tampon d'application vers le tampon du périphérique réseau avant que l'envoi puisse être terminé.

L'avantage de la technologie zéro copie est qu'elle peut transmettre directement des données sans avoir besoin d'étapes de copie intermédiaires, ce qui contribue à améliorer l'efficacité de la transmission des données.

Mise en œuvre de la technologie Linux zéro copie :

  • Appel système sendfile : l'appel système sendfile peut envoyer directement le contenu du fichier au tampon du périphérique réseau dans l'état du noyau, évitant ainsi la copie de données entre l'état utilisateur et l'état du noyau.
  • Appel système splice : l'appel système splice peut transférer directement des données d'un descripteur de fichier à un autre descripteur de fichier, ou peut également transférer des données d'un descripteur de fichier vers le tampon d'un périphérique réseau, évitant ainsi le processus de copie intermédiaire.
  • Appels système mmap et écriture : l'appel système mmap peut mapper des fichiers en mémoire, puis utiliser l'appel système write pour envoyer les données dans la mémoire directement au tampon du périphérique réseau, évitant ainsi la copie des données entre le mode utilisateur et le noyau. mode.
  • DMA (Direct Memory Access) : DMA est une technologie matérielle qui peut directement transférer des données de la mémoire vers le tampon d'un périphérique réseau, évitant ainsi l'intervention du processeur et améliorant l'efficacité de la transmission des données.

2.appel système sendfile

L'appel système sendfile peut transférer les données du fichier directement dans l'espace du noyau. Il le fait en copiant les données d'un descripteur de fichier vers le tampon d'envoi d'un autre descripteur de fichier. De cette manière, les données peuvent être envoyées directement via la pile de protocoles réseau, évitant ainsi les opérations fréquentes de copie de données entre l'espace utilisateur et l'espace noyau.

Cela évite la copie de données entre le noyau et l'espace utilisateur et améliore l'efficacité de la transmission.

prototype de fonction d'appel système sendfile :

#include 
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

参数说明:
out_fd:目标文件描述符,用于发送数据。
in_fd:源文件描述符,从该文件读取数据。
offset:指定从源文件的哪个位置开始读取数据,可以为NULL表示从当前位置开始。
count:要传输的字节数。

返回值:
成功:返回写入out_fd文件的字节数。
失败:返回-1,并设置errno。

3.principe de mise en œuvre de sendfile

3.1 Envoyer des fichiers via la méthode traditionnelle

Pour envoyer un fichier via socket en utilisant la méthode traditionnelle, nous devons exécuter un chemin relativement long.

Chemin : Disque -> Cache de la page de fichiers -> Tampon utilisateur -> Tampon de socket -> Carte réseau.

La situation du changement de contexte et de la copie mémoire est la suivante :

  • Changement de contexte : 4 fois (appel en lecture, retour en lecture, appel en écriture, retour en écriture)
  • Copie DMA : 2 fois
  • Copie CPU : 2 fois (cache de page de fichier->tampon utilisateur, tampon utilisateur->tampon de socket)

Photos

3.2 sendfile envoie des fichiers

Utilisez sendfile pour envoyer des fichiers, le chemin complet sera relativement plus court.

Chemin : Disque -> Cache de la page de fichiers -> Tampon de socket -> Carte réseau.

La situation du changement de contexte et de la copie mémoire est la suivante :

Changement de contexte : 2 fois (appel sendfile, retour sendfile)

Copie DMA : 2 fois

Copie CPU : 1 fois (Cache de page de fichiers -> Socket Buffer)

Photos

3.3 Principe de mise en œuvre de Sendfile

Le cœur de l'implémentation de sendfile est constitué de tubes, qui sont largement utilisés dans les systèmes Linux, tels que la communication inter-processus via des tubes.

Lorsque les données du fichier doivent être copiées dans le tampon du socket, un canal (tampon en anneau) sera temporairement créé, les données du fichier seront d'abord copiées dans le canal, puis les données du canal seront migrées vers le tampon du socket Migration des données. n'est pas une copie de données, mais un pointeur sur l'adresse mémoire.

Photos

3.4 Sections

En utilisant sendfile pour envoyer des fichiers, nous pouvons réduire deux changements de contexte et une copie du processeur. Si notre scénario d'application actuel nécessite l'envoi d'un grand nombre de fichiers, l'utilisation de sendfile peut considérablement améliorer les performances du système.

4. Pipeline

4.1 Introduction au pipeline

Les tuyaux sont largement utilisés dans les systèmes Linux. En plus de la technologie zéro copie utilisant des tuyaux, la communication inter-processus utilise également des tuyaux. Alors, que sont exactement les tuyaux ?

Photos

Qu'est-ce qu'un pipeline ?

Un tube est en fait un tampon en anneau, à travers lequel les données peuvent être copiées d'un fichier à un autre.

Le tube est défini par la structure struct pipe_inode_info. Cette structure de données comporte 4 membres importants :

  • pipe_buffer : tableau de tampons de tuyaux, un tableau de longueur fixe, chaque membre du tableau est un tampon, correspondant à une structure struct pipe_buffer.
  • head : numéro de série de la tête, indiquant l'emplacement du tampon inscriptible actuel, qui doit être utilisé conjointement avec le masque.
  • tail : numéro de série de la queue, indiquant la position du tampon lisible actuel, qui doit être utilisé conjointement avec le masque.
  • ring_size : longueur du tableau de tampons de canal, ring_size – 1 calcule le masque, head & mask obtient l'indice actuel du tableau de tampons inscriptibles, tail & mask obtient l'indice actuel du tableau de tampons lisible.

Le pipe buffer est défini par struct pipe_buffer, qui compte 3 membres importants :

  • page : pointeur de page
  • offset : décalage des données dans la page
  • len : longueur des données

Juger si le tuyau est plein ou vide ?

Jugement que le pipeline est plein :

head – tail >= ring_size, indiquant que le tuyau est plein.

Jugement si le tuyau est vide :

head == tail, indiquant que le tuyau est vide.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer