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.
1. Introduction to zero-copy technology
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:
- sendfile system call: The sendfile system call can directly send the file content to the buffer of the network device in the kernel state, avoiding the copying of data between the user state and the kernel state.
- splice system call: The splice system call can directly transfer data from one file descriptor to another file descriptor, or can also transfer data from one file descriptor to the buffer of a network device, avoiding the intermediate copy process. .
- mmap and write system calls: The mmap system call can map files into memory, and then use the write system call to send the data in the memory directly to the buffer of the network device, avoiding the data between the user state and the kernel state. copy.
- DMA (Direct Memory Access): DMA is a hardware technology that can directly transfer data from memory to the buffer of a network device, avoiding CPU intervention and improving the efficiency of data transmission.
2.sendfile system call
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。
3.sendfile implementation principle
3.1 Send files via traditional method
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:
- Context switch: 4 times (read call, read return, write call, write return)
- DMA copy: 2 times
- CPU copy: 2 times (file page cache->user buffer, user buffer->socket buffer)
picture
3.2 sendfile sends file
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
3.3 Sendfile implementation principle
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
3.4 Section
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.
4. Pipeline
4.1 Pipeline Introduction
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:
- pipe_buffer: Pipe buffer array, a fixed-length array, each array member is a buffer, corresponding to a struct pipe_buffer structure.
- head: Head serial number, indicating the location of the current writable buffer, which needs to be used in conjunction with mask.
- tail: Tail serial number, indicating the position of the current readable buffer, which needs to be used in conjunction with mask.
- ring_size: Pipe buffer array length, ring_size – 1 calculates mask, head & mask obtains the current writable buffer array subscript, tail & mask obtains the current readable buffer array subscript.
The pipe buffer is defined by struct pipe_buffer, which has three important members:
- page: page pointer
- offset: Data offset in the page
- len: data length
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!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

VS Code system requirements: Operating system: Windows 10 and above, macOS 10.12 and above, Linux distribution processor: minimum 1.6 GHz, recommended 2.0 GHz and above memory: minimum 512 MB, recommended 4 GB and above storage space: minimum 250 MB, recommended 1 GB and above other requirements: stable network connection, Xorg/Wayland (Linux)

The five basic components of the Linux system are: 1. Kernel, 2. System library, 3. System utilities, 4. Graphical user interface, 5. Applications. The kernel manages hardware resources, the system library provides precompiled functions, system utilities are used for system management, the GUI provides visual interaction, and applications use these components to implement functions.

vscode built-in terminal is a development tool that allows running commands and scripts within the editor to simplify the development process. How to use vscode terminal: Open the terminal with the shortcut key (Ctrl/Cmd). Enter a command or run the script. Use hotkeys (such as Ctrl L to clear the terminal). Change the working directory (such as the cd command). Advanced features include debug mode, automatic code snippet completion, and interactive command history.

To view the Git repository address, perform the following steps: 1. Open the command line and navigate to the repository directory; 2. Run the "git remote -v" command; 3. View the repository name in the output and its corresponding address.

Although Notepad cannot run Java code directly, it can be achieved by using other tools: using the command line compiler (javac) to generate a bytecode file (filename.class). Use the Java interpreter (java) to interpret bytecode, execute the code, and output the result.

Writing code in Visual Studio Code (VSCode) is simple and easy to use. Just install VSCode, create a project, select a language, create a file, write code, save and run it. The advantages of VSCode include cross-platform, free and open source, powerful features, rich extensions, and lightweight and fast.

The main uses of Linux include: 1. Server operating system, 2. Embedded system, 3. Desktop operating system, 4. Development and testing environment. Linux excels in these areas, providing stability, security and efficient development tools.

Causes and solutions for the VS Code terminal commands not available: The necessary tools are not installed (Windows: WSL; macOS: Xcode command line tools) Path configuration is wrong (add executable files to PATH environment variables) Permission issues (run VS Code as administrator) Firewall or proxy restrictions (check settings, unrestrictions) Terminal settings are incorrect (enable use of external terminals) VS Code installation is corrupt (reinstall or update) Terminal configuration is incompatible (try different terminal types or commands) Specific environment variables are missing (set necessary environment variables)
