период, термин
нулевая копия
«Копия» в «нулевой копии» означает, что операционная система копирует данные из одной области памяти в другую область памяти в операции ввода-вывода. И «ноль» не означает 0 копий, больше относится к пользователю. состояние и состояние ядра равны 0 раз.
CPU COPY
Из принципа композиции компьютера мы знаем, что операции чтения и записи памяти выполняются скоординированной шиной данных, адресной шиной и шиной управления ЦП.
Поэтому, когда происходит «копирование», ЦП часто приходится приостанавливать существующую логику обработки, чтобы облегчить чтение и запись памяти.Мы называем это ЦП КОПИРОВАНИЕМ.
Копия ЦП занимает не только ресурсы ЦП, но и полосу пропускания шины.
DMA COPY
DMA (ПРЯМОЙ ДОСТУП К ПАМЯТИ) является важной функцией современных компьютеров.Одна из важных ее особенностей заключается в том, что при необходимости обмена данными с периферийными устройствами центральному процессору необходимо только инициализировать это действие, чтобы продолжить выполнение других инструкций, а остальные данные передается. Действие полностью выполняется DMA
Видно, что DMA COPY позволяет избежать большого количества прерываний процессора.
переключатель контекста
Переключение контекста в этой статье относится к переключению из пользовательского режима в режим ядра и переключению из режима ядра в пользовательский режим.
Почему существует несколько копий
-
Чтобы защитить систему от преднамеренного или непреднамеренного разрушения приложением, операционная система устанавливает два состояния: пользовательский режим и режим ядра для операционной системы.Если пользовательский режим хочет получить системные ресурсы (например, доступ к жесткому диску) , он должен войти в режим ядра через системный вызов, получить системные ресурсы из режима ядра, а затем переключиться обратно в пользовательский режим, чтобы вернуться к приложению.
-
Для оптимизации производительности, такой как «упреждающий кэш» и асинхронная запись, операционная система также добавляет «буфер ядра» в режим ядра.При чтении данных они не считываются напрямую в приложение.Буфер программы считывается в ядро. сначала буфер, а затем копируется в буфер приложения из буфера ядра.Поэтому может потребоваться многократное копирование данных, прежде чем они будут использованы приложением.
Какие там ненужные копии?
Прежде чем ответить на этот вопрос, давайте рассмотрим сценарий применения
Напомним, что во всех системах реального мира, будь то сервер веб-приложений, ftp-сервер, сервер баз данных, статический файловый сервер и т. д., все сценарии, связанные с передачей данных, представляют собой не что иное, как один:
从硬盘上读取文件数据, 发送到网络上去.
Сцена, которую мы упростили как модель:
File.read(fileDesc, buf, len);
Socket.send(socket, buf, len);
Для удобства описания приведенным выше двум строчкам кода дадим название: модель чтения-отправки.
Когда операционная система реализует эту модель чтения-отправки, требуются следующие шаги:
1. 应用程序开始读文件的操作
2. 应用程序发起系统调用, 从用户态切换到内核态(第一次上下文切换)
3. 内核态中把数据从硬盘文件读取到内核中间缓冲区(kernel buf)
4. 数据从内核中间缓冲区(kernel buf)复制到(用户态)应用程序缓冲区(app buf),从内核态切换回到用户态(第二次上下文切换)
5. 应用程序开始发送数据到网络上
6. 应用程序发起系统调用,从用户态切换到内核态(第三次上下文切换)
7. 内核中把数据从应用程序(app buf)的缓冲区复制到socket的缓冲区(socket)
8. 内核中再把数据从socket的缓冲区(socket buf)发送的网卡的缓冲区(NIC buf)上
9. 从内核态切换回到用户态(第四次上下文切换)
Как показано на рисунке ниже:
Как хорошо видно из приведенного выше рисунка, в одном чтении-отправке участвует четыре копии:
1. 硬盘拷贝到内核缓冲区(DMA COPY)
2. 内核缓冲区拷贝到应用程序缓冲区(CPU COPY)
3. 应用程序缓冲区拷贝到socket缓冲区(CPU COPY)
4. socket buf拷贝到网卡的buf(DMA COPY)
Он включает в себя 2 прерывания процессора и 4 переключения контекста.
Очевидно, что 2-я и 3-я копии просто копируют данные в буфер приложения и копируют их обратно без изменений, что дает две копии ЦП и два переключения контекста, что совершенно не нужно.
Технология нулевого копирования Linux предназначена для оптимизации этих двух ненужных копий.
sendFile
В ядре Linux 2.1 появился системный вызов sendFile, который может напрямую копировать данные из буфера ядра в буфер сокета (SOCKET) в режиме ядра, тем самым уменьшая переключение контекста и ненужное копирование данных.
Этот системный вызов на самом деле представляет собой высокоуровневую функцию ввода/вывода со следующей сигнатурой функции:
#include<sys/sendfile.h>
ssize_t senfile(int out_fd,int in_fd,off_t* offset,size_t count);
- out_fd — это записываемый файловый дескриптор, который должен быть сокетом.
- in_fd — файловый дескриптор для чтения содержимого, это должен быть настоящий файл, а не канал или сокет
- offset - это позиция для начала чтения
- count - количество байтов, которое нужно прочитать
С помощью системного вызова sendFile наша модель чтения-отправки может быть упрощена до:
1. 应用程序开始读文件的操作
2. 应用程序发起系统调用, 从用户态切换到内核态(第一次上下文切换)
3. 内核态中把数据从硬盘文件读取到内核中间缓冲区
4. 通过sendFile,在内核态中把数据从内核缓冲区复制到socket的缓冲区
5. 内核中再把数据从socket的缓冲区发送的网卡的buf上
6. 从内核态切换到用户态(第二次上下文切换)
Как показано ниже:
Вовлечение копирования данных становится:
1. 硬盘拷贝到内核缓冲区(DMA COPY)
2. 内核缓冲区拷贝到socket缓冲区(CPU COPY)
3. socket缓冲区拷贝到网卡的buf(DMA COPY)
Видно, что в модели чтение-отправка, после использования системного вызова sendFile, 4 копии данных могут быть уменьшены до 3, 4 переключения контекста могут быть уменьшены до 2, а 2 прерывания ЦП могут быть уменьшены до 1
По сравнению с традиционным вводом-выводом эта технология нулевого копирования может повысить производительность ввода-вывода более чем на 50 % за счет сокращения количества двух переключений контекста и одной копии процессора (данные сети, не тестировались).
В начале термина говорится, что так называемый «ноль» нулевого копирования означает, что количество копий между пользовательским режимом и режимом ядра равно 0. Исходя из этого определения, текущая технология нулевого копирования уже является реальный «нулевой» пролет
Однако великие ученые и инженеры, гонящиеся за предельной производительностью, этим недовольны, они все еще размышляют о второй копии процессора посередине, пытаясь на этот раз избавиться от ненужной копии данных и прерывания процессора.
sendFile с поддержкой функции разброса-сбора
В версиях после ядра 2.4 ядро Linux оптимизировало дескриптор буфера сокета. Благодаря этой оптимизации системный вызов sendFile может копировать данные непосредственно из буфера ядра в буфер Go to сетевой карты. Это позволяет избежать копирования из «ядра». буфер» в «буфер сокета» на этот раз.
Этот оптимизированный sendFile, мы называем его sendFile, который поддерживает функцию разброса-сбора.
Благодаря поддержке sendFile, поддерживающей функцию разброса-сбора, наша модель чтения-отправки может быть оптимизирована следующим образом:
1. 应用程序开始读文件的操作
2. 应用程序发起系统调用, 从用户态进入到内核态(第一次上下文切换)
3. 内核态中把数据从硬盘文件读取到内核中间缓冲区
4. 内核态中把数据在内核缓冲区的位置(offset)和数据大小(size)两个信息追加(append)到socket的缓冲区中去
5. 网卡的buf上根据socekt缓冲区的offset和size从内核缓冲区中直接拷贝数据
6. 从内核态返回到用户态(第二次上下文切换)
Процесс показан на рисунке ниже:
Наконец, копия данных становится всего двумя DMA COPY:
1. 硬盘拷贝到内核缓冲区(DMA COPY)
2. 内核缓冲区拷贝到网卡的buf(DMA COPY)
Идеально
mmap и sendFile
MMAP (файл с отображением памяти) относится к сопоставлению файла с адресным пространством процесса для достижения однозначного соответствия между физическим адресом на жестком диске и виртуальным адресом пространства процесса.
MMAP — это еще один системный вызов, используемый для реализации нулевого копирования.В отличие от sendFile, он использует пространство общей памяти, чтобы избежать копирования данных между buf приложения и buf ядра (два буфера используют одну и ту же память).
Преимущества mmap по сравнению с sendFile:
- Когда несколько процессов обращаются к одному и тому же файлу, это может сэкономить много памяти.
- Поскольку данные отправляются непосредственно в сеть в ядре, приложение в пользовательском режиме не может снова манипулировать данными.
Недостатки mmap sendFile в отношении:
- Когда память отображает файл, а затем вызывает запись, а другой процесс обрезает тот же файл, это может быть прервано сигналом ошибки шины SIGBUS. Поведение этого сигнала по умолчанию — убить процесс и создать дамп ядра. Это неприемлемо для обычных серверов. .
- При доступе к небольшим файлам в последовательном порядке это не так эффективно, как упреждающее чтение sendFile.
Ссылаться на
nuggets.capable/post/684490… у-у-у. Краткое описание.com/afraid/oh 9 422586… Woohoo. IBM.com/developer Я… blog.CSDN.net/U014303647/… woo woo Краткое описание.com/afraid/post3Bea2post6From…