Нулевая копия
Эта статья может быть слишком технической для понимания большинства читателей . ( июнь 2016 г. ) |
« Нулевое копирование » описывает компьютерные операции, при которых ЦП не выполняет задачу копирования данных из одной области памяти в другую или при которых избегаются ненужные копии данных. Это часто используется для экономии циклов ЦП и пропускной способности памяти во многих трудоемких задачах, например, при передаче файла на высокой скорости по сети и т. д., тем самым улучшая производительность программ ) , ( процессов выполняемых компьютером. [1] [2] [3] [4]
Принцип
[ редактировать ]с нулевым копированием Методы программирования могут использоваться при обмене данными внутри процесса пользовательского пространства (т. е. между двумя или более потоками и т. д.) и/или между двумя или более процессами (см. также проблему производитель-потребитель ) и/или когда данные должны быть быть доступными, скопированными или перемещенными внутри пространства ядра или между процессом пользовательского пространства и частями пространства ядра операционных систем (ОС).
Обычно, когда процесс пользовательского пространства должен выполнять системные операции, такие как чтение или запись данных с/на устройство (например, диск , сетевую карту и т. д.) через свои программные интерфейсы высокого уровня или например перемещение данных с одного устройства на другое и т. д. , он должен выполнить один или несколько системных вызовов , которые затем выполняются операционной системой в пространстве ядра.
Если данные необходимо скопировать или переместить из источника в место назначения, и оба они расположены внутри пространства ядра (т. е. два файла, файл и сетевая карта и т. д.), то ненужные данные копируются из пространства ядра в пространство пользователя и из пространства пользователя в пространство пользователя. пространства ядра можно избежать, используя специальные системные вызовы (с нулевым копированием), обычно доступные в последних версиях популярных операционных систем.
Версии с нулевым копированием элементов операционной системы, таких как драйверы устройств , файловые системы , стеки сетевых протоколов и т. д., значительно повышают производительность некоторых прикладных программ (которые при выполнении становятся процессами) и более эффективно используют системные ресурсы. Производительность повышается за счет того, что ЦП может переходить к другим задачам, в то время как копирование/обработка данных происходит параллельно в другой части машины. Кроме того, операции нулевого копирования сокращают количество трудоемких переключений контекста между пространством пользователя и пространством ядра. Системные ресурсы используются более эффективно, поскольку использование сложного ЦП для выполнения обширных операций копирования данных, что является относительно простой задачей, является расточительным, если другие более простые компоненты системы могут выполнить копирование.
Например, чтение файла и его последующая отправка по сети традиционным способом требует 2 дополнительных копий данных (1 для чтения из ядра в пространство пользователя + 1 для записи из пользователя в пространство ядра) и 4 переключения контекста на цикл чтения/записи. . Эти дополнительные копии данных используют ЦП. Отправка этого файла с использованием mmap файловых данных и цикла вызовов записи уменьшает количество переключений контекста до двух на вызов записи и позволяет избежать двух предыдущих дополнительных копий пользовательских данных. Отправка одного и того же файла через нулевую копию уменьшает число переключений контекста до двух на вызов sendfile и устраняет все дополнительные копии данных ЦП (как в пользовательском, так и в пространстве ядра). [1] [2] [3] [4]
Протоколы нулевого копирования особенно важны для очень высокоскоростных сетей, в которых пропускная способность сетевого канала приближается к вычислительной мощности ЦП или превышает ее. В таком случае ЦП может тратить почти все свое время на копирование переданных данных и, таким образом, становится узким местом, которое ограничивает скорость передачи данных ниже пропускной способности канала. Эмпирическое правило, используемое в отрасли, заключается в том, что для обработки одного бита входящих данных требуется примерно один такт процессора.
Аппаратные реализации
[ редактировать ]Ранней реализацией была IBM OS/360 , где программа могла дать указание канальной подсистеме считывать блоки данных из одного файла или устройства в буфер и записывать в другой из того же буфера без перемещения данных.
Методы создания программного обеспечения с нулевым копированием включают использование копирования на основе прямого доступа к памяти (DMA) и отображения памяти через блок управления памятью (MMU). Эти функции требуют специальной аппаратной поддержки и обычно связаны с особыми требованиями к выравниванию памяти.
Новый подход, используемый гетерогенной системной архитектурой (HSA), облегчает передачу указателей между ЦП и ГП , а также другими процессорами. Для этого требуется единое адресное пространство для ЦП и ГП. [5] [6]
Программные интерфейсы
[ редактировать ]Некоторые операционные системы поддерживают нулевое копирование пользовательских данных и содержимого файлов через определенные API .
Здесь перечислены лишь несколько хорошо известных системных вызовов/API, доступных в большинстве популярных ОС.
Novell NetWare поддерживает форму нулевого копирования с помощью блоков управления событиями (ECB), см. NCOPY .
Внутренняя . команда COPY в некоторых версиях DR-DOS, начиная с 1992 года, также инициирует это, когда COMMAND.COM обнаруживает, что файлы, подлежащие копированию, хранятся на файловом сервере NetWare [7] в противном случае происходит возврат к обычному копированию файлов .Внешняя , команда MOVE начиная с DR DOS 6.0 (1991 г.) и MS-DOS 6.0 (1993 г.), внутренне выполняет RENAME (вызывая только записей каталога изменение в файловой системе вместо физического копирования данных файла), когда источник и место назначения совпадают. расположены на одном логическом томе. [8]
Ядро Linux поддерживает нулевое копирование с помощью различных системных вызовов, таких как:
- файл отправки, файл отправки64; [9]
- сращивание ; [10]
- тройник; [11]
- вмсплайс; [12]
- процесс_vm_readv; [13]
- процесс_vm_writev; [14]
- диапазон копий_файлов; [15]
- сырые сокеты с пакетом mmap [16] или AF_XDP .
Некоторые из них указаны в POSIX и, таким образом, также присутствуют в ядрах BSD или IBM AIX , некоторые уникальны для API ядра Linux .
FreeBSD , NetBSD , OpenBSD , DragonFly BSD и т. д. поддерживают нулевое копирование, по крайней мере, посредством следующих системных вызовов:
MacOS должна поддерживать нулевое копирование через часть ядра FreeBSD, поскольку она предлагает те же системные вызовы (а ее страницы руководства по-прежнему имеют тег BSD), такие как:
- отправить файл. [21]
Oracle Solaris поддерживает нулевое копирование, по крайней мере, посредством следующих системных вызовов:
Microsoft Windows поддерживает нулевое копирование, по крайней мере, с помощью этого системного вызова:
- ПередатьФайл. [27]
Потоки ввода Java могут поддерживать нулевое копирование с помощью метода TransferTo() класса java.nio.channels.FileChannel, если базовая операционная система также поддерживает нулевое копирование. [28]
Протоколы RDMA (удаленный прямой доступ к памяти) глубоко полагаются на методы нулевого копирования.
См. также
[ редактировать ]- ПО XDP
- Звонок по ссылке
- Драйвер устройства
- Встроенная система
- Инфинибэнд
- Местоположение ссылки
- НКОПИ
- netsniff-ng
- Программируемый ввод/вывод
- Прямой протокол сокета
- Разброс/сбор ввода/вывода
Ссылки
[ редактировать ]- ^ Jump up to: а б Станцевич, Драган (1 января 2003 г.). «Нулевая копия I: перспектива пользовательского режима» . www.linuxjournal.com . Проверено 14 октября 2021 г.
- ^ Jump up to: а б Брёзе, Эдуард (01 января 2012 г.). «ZeroCopy: методы, преимущества и подводные камни». CiteSeerX 10.1.1.93.9589 .
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ Jump up to: а б Сун, Цзя; Алвес-Фосс, Джим (1 января 2012 г.). «Обзор эффективности методов нулевого копирования» (PDF) . www.uidaho.edu . Проверено 14 октября 2021 г.
- ^ Jump up to: а б Болдуин, Джон (01 мая 2020 г.). «Разгрузка TLS в ядре» (PDF) . freebsdfoundation.org . Проверено 14 октября 2021 г.
- ^ «Путеводитель программиста по галактике APU» (PDF) .
- ^ «AMD описывает дорожную карту HSA: унифицированная память для CPU/GPU» . 2 февраля 2012 г.
- ^ «Комплект машиночитаемого исходного кода Caldera OpenDOS (MRS) 7.01» . Кальдера, Инк ., 1 мая 1997 г. Архивировано из оригинала 07 августа 2021 г. Проверено 02 января 2022 г. [1] (Примечание. Фактически реализовано после DR DOS «Panther» 22 июня 1992 г., см. COMCPY.C/DOSIF.ASM в исходниках COMMAND.COM OpenDOS 7.01 .)
- ^ Пол, Матиас Р. (30 июля 1997 г.) [1 мая 1994 г.]. «II.4. Недокументированные свойства внешних команд: MOVE.EXE». NWDOS-TIPs — Советы и рекомендации по Novell DOS 7 с учетом недокументированных подробностей, ошибок и обходных путей . Выпуск 157 (на немецком языке) (3-е изд.). Архивировано из оригинала 10 сентября 2017 г. Проверено 6 августа 2014 г.
{{cite book}}
:|work=
игнорируется ( помощь ) (Примечание. NWDOSTIP.TXT — это всеобъемлющая работа по Novell DOS 7 и OpenDOS 7.01, включая описание многих недокументированных функций и внутренних устройств. Это часть еще более обширной работы автора.MPDOSTIP.ZIP
Коллекция сохранялась до 2001 года и в то время распространялась на многих сайтах. Предоставленная ссылка указывает на более старую версию файла, преобразованную в HTML.NWDOSTIP.TXT
файл.) [2] - ^ «sendfile(2) — страница руководства Linux» . man7.org . 22 марта 2021 г. Проверено 13 октября 2021 г.
- ^ «splice(2) — страница руководства Linux» . man7.org . 22 марта 2021 г. Проверено 13 октября 2021 г.
- ^ «tee(2) — страница руководства Linux» . man7.org . 22 марта 2021 г. Проверено 13 октября 2021 г.
- ^ «vmsplice(2) — страница руководства Linux» . man7.org . 22 марта 2021 г. Проверено 13 октября 2021 г.
- ^ «process_vm_readv(2) — страница руководства Linux» . man7.org . 22 марта 2021 г. Проверено 13 октября 2021 г.
- ^ «process_vm_writev(2) — страница руководства Linux» . man7.org . 22 марта 2021 г. Проверено 13 октября 2021 г.
- ^ «copy_file_range(2) — страница руководства Linux» . man7.org . 22 марта 2021 г. Проверено 13 октября 2021 г.
- ^ «Документация Linux PACKET_MMAP» . ядро.орг .
- ^ «sendfile(2) — страницы руководства FreeBSD» . www.freebsd.org . 30 апреля 2020 г. Проверено 13 октября 2021 г.
- ^ «write(2) — страницы руководства FreeBSD» . www.freebsd.org . 30 апреля 2020 г. Проверено 13 октября 2021 г.
- ^ «writev(2) — страницы руководства по FreeBSD» . www.freebsd.org . 30 апреля 2020 г. Проверено 13 октября 2021 г.
- ^ «mmap(2) — страницы руководства FreeBSD» . www.freebsd.org . 30 апреля 2020 г. Проверено 13 октября 2021 г.
- ^ «sendfile(2) — страница руководства Mac OS X» . разработчик.apple.com . 31 марта 2006 г. Проверено 13 октября 2021 г.
- ^ «sendfile(3C) — страницы руководства по Solaris» . docs.oracle.com . 13 августа 2021 г. Проверено 13 октября 2021 г.
- ^ «sendfilev(3C) — страницы руководства по Solaris» . docs.oracle.com . 13 августа 2021 г. Проверено 13 октября 2021 г.
- ^ «write(2) — страницы руководства по Solaris» . docs.oracle.com . 13 августа 2021 г. Проверено 13 октября 2021 г.
- ^ "writev(2) — страницы руководства по Solaris" . docs.oracle.com . 13 августа 2021 г. Проверено 13 октября 2021 г.
- ^ «mmap(2) — страницы руководства по Solaris» . docs.oracle.com . 13 августа 2021 г. Проверено 13 октября 2021 г.
- ^ «Функция TransmitFile (Win32)» . docs.microsoft.com . 10 мая 2021 г. Проверено 13 октября 2021 г.
- ^ Паланиаппан, Сатиш К.; Нагараджа, Прамод Б. (2 сентября 2008 г.). «Нулевая копия Java» . разработчик.ibm.com . Проверено 13 октября 2021 г.