Home > Article > Computer Tutorials > Six pictures explain Linux zero-copy technology clearly
Hello everyone, today let us talk about Linux zero-copy technology. We will use the sendfile system call as an entry point to deeply explore the basic principles of zero-copy technology. The core idea of zero-copy technology is to minimize the copying of data between memories and improve the efficiency and performance of data transmission by optimizing the data transmission path.
Linux zero-copy technology is a technology used to optimize data transmission. It improves the efficiency of data transmission by reducing the number of data copies between kernel mode and user mode.
During the process of data transmission, it is usually necessary to copy the data from the kernel buffer to the application buffer, and then from the application buffer to the buffer of the network device before the transmission can be completed.
The advantage of zero-copy technology is that it can directly transmit data without the need for intermediate copying steps, which helps improve the efficiency of data transmission.
Linux zero-copy technology implementation:
The sendfile system call can transfer file data directly within kernel space by copying data from one file descriptor to the send buffer of another file descriptor. In this way, data can be sent directly through the network protocol stack, avoiding frequent data copy operations between user space and kernel space.
This avoids the copying of data between the kernel and user space and improves transmission efficiency.
sendfile system call function prototype:
#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。
To use the traditional method to send a file through socket, we need to execute a relatively long path.
Path: Disk->File Page Cache->User Buffer->Socket Buffer->Network Card.
Context switching and memory copy conditions are as follows:
picture
Use sendfile to send files. Relatively speaking, the entire path will be shorter.
Path: Disk->File Page Cache->Socket Buffer->Network Card.
Context switching and memory copy conditions are as follows:
Context switch: 2 times (sendfile call, sendfile return)
DMA copy: 2 times
CPU copy: 1 time (file page cache->socket buffer)
picture
The core of sendfile implementation is pipes, which are widely used in Linux systems, such as inter-process communication through pipes.
When file data needs to be copied to the socket buffer, a pipe (ring buffer) will be temporarily created, the file data will be copied to the pipe first, and then the pipe data will be migrated to the socket buffer. Data migration is not a data copy. , just points the pointer to the memory address.
picture
By using sendfile to send files, we can reduce two context switches and one CPU copy. If our actual application scenario requires sending a large number of files, using sendfile can greatly improve system performance.
Pipes are widely used in Linux systems. In addition to zero-copy technology using pipes, inter-process communication also uses pipes. So what exactly are pipes?
picture
What is a pipeline?
A pipe is actually a ring buffer, through which data can be copied from one file to another.
The pipe is defined by the struct pipe_inode_info structure. This data structure has 4 important members:
The pipe buffer is defined by struct pipe_buffer, which has three important members:
Determine whether the pipe is full or empty?
Pipeline full judgment:
head – tail >= ring_size, indicating that the pipe is full.
Judgement if the pipe is empty:
head == tail, indicating that the pipe is empty.
The above is the detailed content of Six pictures explain Linux zero-copy technology clearly. For more information, please follow other related articles on the PHP Chinese website!