Robocikowo>ROBOCIKOWO
Infrastruktura

Zero-copy

AktywnyOpublikowano: 22 września 2026Aktualizacja: 22 września 2026Opublikowany
Technika systemowa eliminująca zbędne kopie danych między buforami pamięci; dane przekazuje się przez wskaźnik, mmap lub DMA zamiast kopiowania przez CPU.
Kluczowa innowacja
Eliminacja zbędnego kopiowania danych między buforami pamięci (jądro↔przestrzeń użytkownika, proces↔proces, CPU↔GPU) — dane przekazuje się przez wskaźnik, mapowanie pamięci lub sprzętowy transfer DMA zamiast fizycznego kopiowania przez CPU.
Kategoria
Infrastruktura
Poziom abstrakcji
Wzorzec
Poziom operacji
UdostępnianieWdrożenieSterowanie robotem
Zastosowania
Serwery plików i WWW (sendfile)Transport sieciowy o wysokiej przepustowościPrzetwarzanie multimediów i strumieni wideoKomunikacja wewnątrzprocesowa w ROS 2Pamięć współdzielona w middleware DDS (iceoryx, Fast DDS)Transport danych GPU między węzłami (Isaac ROS)Potoki inferencji AI (transfer tensorów)RDMA w klastrach HPC/AI

Jak działa

Zero-copy realizuje się kilkoma komplementarnymi mechanizmami: (1) mmap() mapuje plik lub region pamięci bezpośrednio do przestrzeni adresowej procesu, dzięki czemu nie trzeba kopiować danych do osobnego bufora; (2) sendfile()/splice() przenoszą dane między deskryptorami plików w całości wewnątrz jądra, omijając bufor przestrzeni użytkownika; (3) pamięć współdzielona (shared memory) pozwala wielu procesom odczytywać ten sam region bez kopiowania — wymienia się jedynie wskaźnik lub uchwyt; (4) DMA (Direct Memory Access) pozwala kontrolerowi sprzętowemu przenieść dane między urządzeniem a pamięcią bez udziału CPU; (5) zunifikowana pamięć CPU–GPU oraz przekazywanie wskaźników eliminują kopie między hostem a akceleratorem. We wszystkich wariantach zamiast fizycznego kopiowania bajtów przekazuje się odwołanie do danych (wskaźnik, offset, uchwyt), a poprawność zapewnia zarządzanie własnością bufora i synchronizacja dostępu.

Rozwiązany problem

Tradycyjny transfer danych wielokrotnie kopiuje te same bajty między buforami (jądro↔przestrzeń użytkownika, proces↔proces, CPU↔GPU), zużywając cykle CPU, przepustowość pamięci i powodując przełączenia kontekstu. Przy dużych wolumenach danych (klatki z kamer, strumienie sieciowe, tensory) te redundantne kopie stają się wąskim gardłem wydajności i źródłem opóźnień.

Komponenty

Mapowanie pamięci (mmap)Współdzielony dostęp do danych bez kopii

Odwzorowanie pliku lub regionu pamięci bezpośrednio do przestrzeni adresowej procesu, eliminujące kopię do osobnego bufora użytkownika.

Oficjalna

Transfer w jądrze (sendfile / splice)Transfer plik↔gniazdo bez kopii do user space

Wywołania systemowe przenoszące dane między deskryptorami (np. plik→gniazdo) w całości wewnątrz jądra, z pominięciem bufora przestrzeni użytkownika.

Oficjalna

Pamięć współdzielona (shared memory)Zero-copy IPC między procesami

Region pamięci dostępny dla wielu procesów; zamiast kopiowania wymienia się wskaźnik/uchwyt. Podstawa zero-copy w middleware IPC (np. iceoryx).

Oficjalna

Bezpośredni dostęp do pamięci (DMA)Transfer sprzętowy z pominięciem CPU

Sprzętowy transfer danych między urządzeniem (NIC, dysk, GPU) a pamięcią bez udziału CPU; obejmuje warianty jak RDMA i GPUDirect.

Oficjalna

Zunifikowana pamięć / przekazywanie wskaźników (CPU–GPU)Zero-copy między hostem a akceleratorem

Wspólna przestrzeń adresowa CPU i GPU umożliwiająca przekazywanie danych przez wskaźnik zamiast kopii host↔device; kluczowa dla potoków GPU (np. Isaac ROS).

Oficjalna

Implementacja

Pułapki implementacyjne
Zarządzanie czasem życia buforaKrytyczna

Zwolnienie lub nadpisanie współdzielonego bufora zanim odbiorca skończy go czytać prowadzi do błędów use-after-free i uszkodzenia danych.

Rozwiązanie:Jasna semantyka własności (np. loan/return w ROS 2), liczniki referencji i kontrola cyklu życia bufora.
Wyścigi czytelnik–pisarz w pamięci współdzielonejWysoka

Brak synchronizacji przy współdzielonym regionie może dać niespójne lub częściowo zapisane dane.

Rozwiązanie:Mechanizmy synchronizacji (mutex, bariery pamięci), wersjonowanie buforów lub podwójne buforowanie.
Wymagania wyrównania i rozmiaru stronyŚrednia

mmap i DMA wymagają wyrównania do granic stron; niespełnienie tego psuje mapowanie lub wymusza kopię.

Rozwiązanie:Alokacja buforów wyrównanych do stron i respektowanie ograniczeń sprzętowych DMA.
Bezpieczeństwo pamięci współdzielonejŚrednia

Dane w pamięci współdzielonej są widoczne dla innych procesów mających do niej dostęp, co zwiększa powierzchnię ataku.

Rozwiązanie:Kontrola dostępu do segmentów pamięci, izolacja i minimalizacja czasu ekspozycji danych.
Cichy fallback do kopiowaniaŚrednia

Gdy warstwa transportu nie wspiera zero-copy, system może po cichu wrócić do kopiowania, niwecząc oczekiwane zyski wydajności.

Rozwiązanie:Weryfikacja możliwości loaningu (np. can_loan_messages() w ROS 2) i monitorowanie realnej ścieżki transportu.

Ewolucja

1999
Wprowadzenie sendfile() w jądrze Linux
Punkt przełomowy

Wywołanie sendfile() pojawiło się w Linux 2.2, umożliwiając transfer plik→gniazdo bez kopiowania danych do przestrzeni użytkownika.

2006
Dodanie splice() (Linux 2.6.17)

splice() uogólnił zero-copy na dowolne pary deskryptorów, przenosząc dane przez potok w jądrze.

2017
MSG_ZEROCOPY dla TCP (Linux 4.14)

Dodano zero-copy przy wysyłaniu danych sieciowych bezpośrednio z buforów przestrzeni użytkownika.

2019
Pożyczane wiadomości (loaned messages) w ROS 2
Punkt przełomowy

ROS 2 (Eloquent) wprowadził API loaned messages, umożliwiając zero-copy przez pamięć współdzieloną w DDS (np. Eclipse iceoryx, RTI Connext DDS Micro).

2022
NVIDIA Isaac ROS NITROS

Type adaptation (REP-2007) i type negotiation (REP-2009) umożliwiły zero-copy transport danych GPU między węzłami ROS 2.

2026
Deprecacja NITROS na rzecz rosidl::Buffer + backend CUDA

Isaac ROS przeniósł zero-copy GPU na natywne wiadomości ROS 2 z polami rosidl::Buffer i backendem buforów CUDA.

Hiperparametry (konfigurowalne osie)

Własność i czas życia buforaKrytyczna

Kto jest właścicielem współdzielonego bufora i kiedy można go bezpiecznie zwolnić (model loan/return).

Model synchronizacjiWysoka

Sposób zapobiegania wyścigom czytelnik–pisarz w pamięci współdzielonej (mutex, bariery, wersjonowanie).

Wyrównanie / rozmiar stronyŚrednia

Wymagane wyrównanie do granic stron dla mmap i DMA.

Ścieżka awaryjna (kopia)Średnia

Zachowanie, gdy warstwa transportu nie wspiera zero-copy (np. ROS_DISABLE_LOANED_MESSAGES → fallback do kopii).

Złożoność obliczeniowa

Złożoność czasowa: O(1) kopii CPU (vs. O(n)). Złożoność przestrzenna: O(1) dodatkowej pamięci buforowej.

Wymagania sprzętowe

Podstawowe

Zero-copy to technika systemowa/programowa działająca na dowolnej platformie z MMU i wsparciem systemu operacyjnego.

Dobry fit

Zunifikowana pamięć CPU–GPU oraz GPUDirect pozwalają przenosić tensory między hostem a GPU bez kopii, co przyspiesza potoki inferencji i wizji.