stringtranslate.com

Нулевое копирование

« Zero-copy » описывает компьютерные операции, в которых ЦП не выполняет задачу копирования данных из одной области памяти в другую или в которых избегаются ненужные копии данных. Это часто используется для экономии циклов ЦП и пропускной способности памяти во многих трудоемких задачах, таких как передача файла на высокой скорости по сети и т. д., тем самым повышая производительность программ ( процессов ) , выполняемых компьютером. [1] [2] [3] [4]

Принцип

Методы программирования с нулевым копированием могут использоваться при обмене данными внутри процесса пользовательского пространства (т. е. между двумя или более потоками и т. д.) и/или между двумя или более процессами (см. также проблему производитель-потребитель ) и/или когда необходимо получить доступ к данным, скопировать их или переместить внутри пространства ядра или между процессом пользовательского пространства и частями пространства ядра операционных систем (ОС).

Обычно, когда процесс пользовательского пространства должен выполнить системные операции, такие как чтение или запись данных с/на устройство (например, диск , сетевую карту и т. д.) через свои высокоуровневые программные интерфейсы или перемещение данных с одного устройства на другое и т. д., он должен выполнить один или несколько системных вызовов , которые затем выполняются в пространстве ядра операционной системой.

Если данные необходимо скопировать или переместить из источника в место назначения, и оба они расположены внутри пространства ядра (т. е. два файла, файл и сетевая карта и т. д.), то ненужных копий данных из пространства ядра в пространство пользователя и из пространства пользователя в пространство ядра можно избежать, используя специальные системные вызовы (с нулевым копированием), обычно доступные в большинстве последних версий популярных операционных систем.

Версии без копирования элементов операционной системы, таких как драйверы устройств , файловые системы , стеки сетевых протоколов и т. д., значительно повышают производительность определенных прикладных программ (которые становятся процессами при выполнении) и более эффективно используют системные ресурсы. Производительность повышается за счет того, что ЦП может переходить к другим задачам, в то время как копирование/обработка данных продолжаются параллельно в другой части машины. Кроме того, операции без копирования сокращают количество длительных переключений контекста между пространством пользователя и пространством ядра. Системные ресурсы используются более эффективно, поскольку использование сложного ЦП для выполнения обширных операций копирования данных, что является относительно простой задачей, является расточительным, если другие более простые системные компоненты могут выполнять копирование.

Например, чтение файла и его последующая отправка по сети традиционным способом требует 2 дополнительных копий данных (1 для чтения из ядра в пространство пользователя + 1 для записи из пространства пользователя в пространство ядра) и 4 переключений контекста на цикл чтения/записи. Эти дополнительные копии данных используют ЦП. Отправка этого файла с использованием mmap данных файла и цикла вызовов записи сокращает переключений контекста до 2 на вызов записи и позволяет избежать этих предыдущих 2 дополнительных копий пользовательских данных. Отправка того же файла с помощью нулевой копии сокращает переключений контекста до 2 на вызов sendfile и устраняет все дополнительные копии данных ЦП (как в пространстве пользователя, так и в пространстве ядра). [1] [2] [3] [4]

Протоколы нулевого копирования особенно важны для очень высокоскоростных сетей, в которых емкость сетевого соединения приближается или превышает вычислительную мощность ЦП. В таком случае ЦП может тратить почти все свое время на копирование передаваемых данных и, таким образом, становится узким местом, ограничивающим скорость передачи данных до уровня ниже емкости соединения. Эмпирическое правило, используемое в отрасли, заключается в том, что для обработки одного бита входящих данных требуется примерно один такт ЦП.

Аппаратные реализации

Ранней реализацией была IBM OS/360 , где программа могла дать команду канальной подсистеме считывать блоки данных из одного файла или устройства в буфер и записывать их в другой из того же буфера, не перемещая данные.

Методы создания программного обеспечения с нулевым копированием включают использование копирования на основе прямого доступа к памяти (DMA) и отображения памяти через блок управления памятью (MMU). Эти функции требуют специальной аппаратной поддержки и обычно подразумевают особые требования к выравниванию памяти.

Новый подход, используемый архитектурой гетерогенных систем (HSA), облегчает передачу указателей между CPU и GPU , а также другими процессорами. Это требует единого адресного пространства для CPU и GPU. [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 поддерживает нулевое копирование посредством различных системных вызовов, таких как:

Некоторые из них определены в 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 (удалённый прямой доступ к памяти) в значительной степени основаны на методах нулевого копирования.

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

Ссылки

  1. ^ ab Stancevic, Dragan (01.01.2003). "Zero Copy I: User-Mode Perspective". www.linuxjournal.com . Получено 14.10.2021 .
  2. ^ ab Bröse, Eduard (01.01.2012). "ZeroCopy: методы, преимущества и подводные камни". CiteSeerX 10.1.1.93.9589 .  {{cite journal}}: Цитировать журнал требует |journal=( помощь )
  3. ^ ab Song, Jia; Alves-Foss, Jim (2012-01-01). "Обзор эффективности методов нулевого копирования" (PDF) . www.uidaho.edu . Получено 2021-10-14 .
  4. ^ ab Болдуин, Джон (2020-05-01). "TLS offload in the kernel" (PDF) . freebsdfoundation.org . Получено 2021-10-14 .
  5. ^ «Руководство программиста по галактике APU» (PDF) .
  6. ^ "AMD представляет дорожную карту HSA: унифицированная память для CPU/GPU". 2012-02-02.
  7. ^ "Caldera OpenDOS Machine Readable Source Kit (MRS) 7.01". Caldera, Inc. 1997-05-01. Архивировано из оригинала 2021-08-07 . Получено 2022-01-02 . [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 . 2021-03-22 . Получено 2021-10-13 .
  10. ^ "splice(2) - страница руководства Linux". man7.org . 2021-03-22 . Получено 2021-10-13 .
  11. ^ "tee(2) - Страница руководства Linux". man7.org . 2021-03-22 . Получено 2021-10-13 .
  12. ^ "vmsplice(2) - страница руководства Linux". man7.org . 2021-03-22 . Получено 2021-10-13 .
  13. ^ "process_vm_readv(2) - страница руководства Linux". man7.org . 2021-03-22 . Получено 2021-10-13 .
  14. ^ "process_vm_writev(2) - страница руководства Linux". man7.org . 2021-03-22 . Получено 2021-10-13 .
  15. ^ "copy_file_range(2) - Страница руководства Linux". man7.org . 2021-03-22 . Получено 2021-10-13 .
  16. ^ "Документация Linux PACKET_MMAP". kernel.org .
  17. ^ "sendfile(2) - Страницы руководства FreeBSD". www.freebsd.org . 2020-04-30 . Получено 2021-10-13 .
  18. ^ "write(2) - Страницы руководства FreeBSD". www.freebsd.org . 2020-04-30 . Получено 2021-10-13 .
  19. ^ "writev(2) - Страницы руководства FreeBSD". www.freebsd.org . 2020-04-30 . Получено 2021-10-13 .
  20. ^ "mmap(2) - Страницы руководства FreeBSD". www.freebsd.org . 2020-04-30 . Получено 2021-10-13 .
  21. ^ "sendfile(2) - Страница руководства Mac OS X". developer.apple.com . 2006-03-31 . Получено 2021-10-13 .
  22. ^ "sendfile(3C) - Страницы руководства Solaris". docs.oracle.com . 2021-08-13 . Получено 2021-10-13 .
  23. ^ "sendfilev(3C) - Страницы руководства Solaris". docs.oracle.com . 2021-08-13 . Получено 2021-10-13 .
  24. ^ "write(2) - Страницы руководства Solaris". docs.oracle.com . 2021-08-13 . Получено 2021-10-13 .
  25. ^ "writev(2) - Страницы руководства Solaris". docs.oracle.com . 2021-08-13 . Получено 2021-10-13 .
  26. ^ "mmap(2) - Страницы руководства Solaris". docs.oracle.com . 2021-08-13 . Получено 2021-10-13 .
  27. ^ "Функция TransmitFile (Win32)". docs.microsoft.com . 2021-05-10 . Получено 2021-10-13 .
  28. ^ Паланиаппан, Сатиш К.; Нагараджа, Прамод Б. (2 сентября 2008 г.). «Нулевая копия Java». разработчик.ibm.com . Проверено 13 октября 2021 г.