stringtranslate.com

Нулевая копия

« Нулевое копирование » описывает компьютерные операции, при которых ЦП не выполняет задачу копирования данных из одной области памяти в другую или при которых избегаются ненужные копии данных. Это часто используется для экономии циклов ЦП и пропускной способности памяти во многих трудоемких задачах, например, при передаче файла на высокой скорости по сети и т. д., тем самым улучшая производительность программ ( процессов ) , выполняемых компьютером. [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 г.), внутренне выполняет ПЕРЕИМЕНОВАНИЕ (вызывая изменение только записей каталога в файловой системе вместо физического копирования данных файла) , когда источник и место назначения совпадают. расположены на одном логическом томе. [8]

Ядро Linux поддерживает нулевое копирование с помощью различных системных вызовов, таких как:

Некоторые из них указаны в POSIX и, таким образом, также присутствуют в ядрах BSD или IBM AIX , некоторые уникальны для API ядра Linux .

FreeBSD , NetBSD , OpenBSD , DragonFly BSD и т. д. поддерживают нулевое копирование, по крайней мере, посредством следующих системных вызовов:

MacOS должна поддерживать нулевое копирование через часть ядра FreeBSD, поскольку она предлагает те же системные вызовы (и ее страницы руководства по-прежнему имеют тег BSD), такие как:

Oracle Solaris поддерживает нулевое копирование, по крайней мере, посредством следующих системных вызовов:

Microsoft Windows поддерживает нулевое копирование, по крайней мере, с помощью этого системного вызова:

Потоки ввода Java могут поддерживать нулевое копирование с помощью метода TransferTo() класса java.nio.channels.FileChannel, если базовая операционная система также поддерживает нулевое копирование. [28]

Протоколы RDMA (Remote Direct Memory Access) глубоко полагаются на методы нулевого копирования.

Смотрите также

Рекомендации

  1. ^ аб Станцевич, Драган (1 января 2003 г.). «Нулевая копия I: перспектива пользовательского режима». www.linuxjournal.com . Проверено 14 октября 2021 г.
  2. ^ Аб Брёзе, Эдуард (1 января 2012 г.). «ZeroCopy: методы, преимущества и подводные камни». CiteSeerX 10.1.1.93.9589 .  {{cite journal}}: Требуется цитировать журнал |journal=( помощь )
  3. ^ Аб Сун, Цзя; Алвес-Фосс, Джим (1 января 2012 г.). «Обзор эффективности методов нулевого копирования» (PDF) . www.uidaho.edu . Проверено 14 октября 2021 г.
  4. ^ Аб Болдуин, Джон (01 мая 2020 г.). «Разгрузка TLS в ядре» (PDF) . freebsdfoundation.org . Проверено 14 октября 2021 г.
  5. ^ «Путеводитель программиста по галактике APU» (PDF) .
  6. ^ «AMD описывает дорожную карту HSA: унифицированная память для ЦП/ГП» . 2 февраля 2012 г.
  7. ^ «Набор машиночитаемого исходного кода 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 .)
  8. ^ Пол, Матиас Р. (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]
  9. ^ «sendfile(2) — страница руководства Linux». man7.org . 22 марта 2021 г. Проверено 13 октября 2021 г.
  10. ^ «splice(2) — страница руководства Linux» . man7.org . 22 марта 2021 г. Проверено 13 октября 2021 г.
  11. ^ «tee(2) — страница руководства Linux» . man7.org . 22 марта 2021 г. Проверено 13 октября 2021 г.
  12. ^ «vmsplice(2) — страница руководства Linux» . man7.org . 22 марта 2021 г. Проверено 13 октября 2021 г.
  13. ^ «process_vm_readv(2) — страница руководства Linux» . man7.org . 22 марта 2021 г. Проверено 13 октября 2021 г.
  14. ^ «process_vm_writev(2) — страница руководства Linux» . man7.org . 22 марта 2021 г. Проверено 13 октября 2021 г.
  15. ^ «copy_file_range(2) — страница руководства Linux». man7.org . 22 марта 2021 г. Проверено 13 октября 2021 г.
  16. ^ "Документация Linux PACKET_MMAP" . ядро.орг .
  17. ^ «sendfile(2) — страницы руководства FreeBSD». www.freebsd.org . 30 апреля 2020 г. Проверено 13 октября 2021 г.
  18. ^ "write(2) - Страницы руководства FreeBSD" . www.freebsd.org . 30 апреля 2020 г. Проверено 13 октября 2021 г.
  19. ^ "writev(2) - Страницы руководства FreeBSD" . www.freebsd.org . 30 апреля 2020 г. Проверено 13 октября 2021 г.
  20. ^ "mmap(2) - Страницы руководства FreeBSD" . www.freebsd.org . 30 апреля 2020 г. Проверено 13 октября 2021 г.
  21. ^ «sendfile(2) — Страница руководства Mac OS X» . разработчик.apple.com . 31 марта 2006 г. Проверено 13 октября 2021 г.
  22. ^ «sendfile(3C) — страницы руководства по Solaris» . docs.oracle.com . 13 августа 2021 г. Проверено 13 октября 2021 г.
  23. ^ "sendfilev(3C) - Страницы руководства по Solaris" . docs.oracle.com . 13 августа 2021 г. Проверено 13 октября 2021 г.
  24. ^ "write(2) - Страницы руководства Solaris" . docs.oracle.com . 13 августа 2021 г. Проверено 13 октября 2021 г.
  25. ^ "writev(2) - Страницы руководства по Solaris" . docs.oracle.com . 13 августа 2021 г. Проверено 13 октября 2021 г.
  26. ^ «mmap(2) — страницы руководства по Solaris» . docs.oracle.com . 13 августа 2021 г. Проверено 13 октября 2021 г.
  27. ^ «Функция TransmitFile (Win32)» . docs.microsoft.com . 10 мая 2021 г. Проверено 13 октября 2021 г.
  28. ^ Паланиаппан, Сатиш К.; Нагараджа, Прамод Б. (2 сентября 2008 г.). «Нулевая копия Java». разработчик.ibm.com . Проверено 13 октября 2021 г.