Cópia zero - Zero-copy

" Cópia zero " descreve operações de computador nas quais a CPU não executa a tarefa de copiar dados de uma área da memória para outra ou nas quais cópias de dados desnecessárias são evitadas. Isso é freqüentemente usado para economizar ciclos de CPU e largura de banda de memória em muitas tarefas demoradas, como ao transmitir um arquivo em alta velocidade em uma rede , etc., melhorando assim o desempenho de programas ( processos ) executados por um computador.

Princípio

As técnicas de programação de cópia zero podem ser usadas ao trocar dados entre os processos do espaço do usuário (ver também o problema produtor-consumidor ) e / ou quando os dados precisam ser acessados ​​/ copiados / movidos entre um processo de espaço do usuário e porções do espaço do kernel dos sistemas operacionais (SO )

Normalmente, quando um processo de espaço do usuário precisa executar operações do sistema, como leitura ou gravação de dados de / para um dispositivo (ou seja, um disco , um NIC , etc.) por meio de suas interfaces de software de alto nível ou como mover dados de um dispositivo para outro, etc. , ele precisa realizar uma ou mais chamadas do sistema que são executadas no espaço do kernel pelo sistema operacional.

Versões de cópia zero dos elementos do sistema operacional, como drivers de dispositivos , sistemas de arquivos , pilhas de protocolos de rede , etc., aumentam muito o desempenho de certos programas de aplicativos (que se tornam processos quando executados) e utilizam os recursos do sistema com mais eficiência. O desempenho é aprimorado permitindo que a CPU passe para outras tarefas enquanto as cópias / processamento de dados prosseguem em paralelo em outra parte da máquina. Além disso, as operações de cópia zero reduzem o número de alternâncias de contexto demoradas entre o espaço do usuário e o espaço do kernel. Os recursos do sistema são utilizados de forma mais eficiente, pois usar uma CPU sofisticada para realizar operações extensas de cópia de dados, que é uma tarefa relativamente simples, é um desperdício se outros componentes do sistema mais simples puderem fazer a cópia.

Por exemplo, ler um arquivo e enviá-lo pela rede da maneira tradicional requer 2 cópias extras de dados (1 para leitura do kernel para o espaço do usuário + 1 para gravação do usuário para o espaço do kernel) e 4 mudanças de contexto por ciclo de leitura / gravação . Essas cópias de dados extras usam a CPU. O envio desse arquivo usando mmap de dados de arquivo e um ciclo de chamadas de gravação reduz as mudanças de contexto para 2 por chamada de gravação e evita as 2 cópias extras de dados do usuário anteriores. Enviar o mesmo arquivo via cópia zero reduz as mudanças de contexto para 2 por chamada de sendfile e elimina todas as cópias de dados extras da CPU (tanto no espaço do usuário quanto no kernel).

Os protocolos de cópia zero são especialmente importantes para redes de velocidade muito alta nas quais a capacidade de um link de rede se aproxima ou excede a capacidade de processamento da CPU. Nesse caso, a CPU pode gastar quase todo o seu tempo copiando os dados transferidos e, portanto, torna-se um gargalo que limita a taxa de comunicação abaixo da capacidade do link. Uma regra usada na indústria é que aproximadamente um ciclo de clock da CPU é necessário para processar um bit de dados de entrada.

Implementações de hardware

Uma implementação inicial foi o IBM OS / 360, onde um programa pode instruir o subsistema do canal a ler blocos de dados de um arquivo ou dispositivo em um buffer e gravar em outro do mesmo buffer sem mover os dados.

As técnicas para criar software de cópia zero incluem o uso de cópia baseada em acesso direto à memória (DMA) e mapeamento de memória por meio de uma unidade de gerenciamento de memória (MMU). Esses recursos requerem suporte de hardware específico e geralmente envolvem requisitos específicos de alinhamento de memória.

Uma abordagem mais recente usada pela Heterogeneous System Architecture (HSA) facilita a passagem de ponteiros entre a CPU e a GPU e também outros processadores. Isso requer um espaço de endereço unificado para a CPU e a GPU.

Interfaces de programa

Vários sistemas operacionais oferecem suporte à cópia zero dos dados do usuário e do conteúdo do arquivo por meio de APIs específicas .

Aqui estão listadas apenas algumas chamadas de sistema / APIs conhecidas disponíveis nos sistemas operacionais mais populares.

O kernel do Linux oferece suporte a cópia zero por meio de várias chamadas de sistema, como:

  • sendfile, sendfile64;
  • emenda ;
  • tee;
  • vmsplice;
  • process_vm_readv;
  • process_vm_writev;
  • copy_file_range;
  • sockets raw com pacote mmap ou AF_XDP .

Alguns deles são especificados em POSIX e, portanto, também presentes nos kernels BSD ou IBM AIX , alguns são exclusivos da API do kernel Linux .

FreeBSD , NetBSD , OpenBSD , DragonFly BSD , etc. suportam cópia zero por meio de pelo menos estas chamadas de sistema:

  • Enviar arquivo;
  • escrever, Writeev + mmap ao gravar dados em um soquete de rede.

MacOS deve suportar cópia zero por meio da parte FreeBSD do kernel porque oferece as mesmas chamadas de sistema (e suas páginas de manual ainda são marcadas como BSD), como:

  • Enviar arquivo.

O Oracle Solaris oferece suporte a cópia zero por meio de pelo menos estas chamadas de sistema:

  • Enviar arquivo;
  • sendfilev;
  • escrever, Writeev + Mmap.

O Microsoft Windows oferece suporte a cópia zero por meio de pelo menos esta chamada de sistema:

  • TransmitFile.

Os fluxos de entrada Java podem suportar cópia zero por meio do método transferTo () de java.nio.channels.FileChannel se o sistema operacional subjacente também suportar cópia zero.

Os protocolos RDMA (Remote Direct Memory Access) dependem profundamente de técnicas de cópia zero.

Veja também

Referências