A um tempo atrás, quando comecei a ler e estudar sobre kernels, me deparei com um termo bem usado mas não fazia a menor idéia do que se tratava, apenas que não ocorriam cópias da memória, ou seja, nada ou zero copy.
Então, antes de mais nada o Zero Copy é um termo para designar operações que não efetuam copias de memória.
Mas porque tem que ser copiados dados da memória?
Um exemplo é um servidor web. O servidor, um aplicativo do usuário recebe informações, processa-as e envia para o cliente informações. Neste processo, num sistema operacional sem zero copy, seriam feitas duas cópias de dados: uma quando é recebida os dados pela rede, do driver de rede, no espaço do kernel, para o servidor, no espaço do usuário e outra cópia das informações do aplicativo para o kernel para este envia-las pela rede. E também há o processo de troca de contexto do usuário para do kernel e do kernel para o usuário, que omiti para facilitar o nosso entendimento.
Nota-se que as cópias ocorrem porque o espaço do kernel e do usuário não são compartilhados. Por causa disto, uma chamada do sistema, por exemplo a write, copia todas as informações do espaço usuário para o espaço do kernel para então escrever no descritor de arquivos. Outro exemplo, é a chamada do sistema pipe ou o “|” nos shells, conforme descrevi brevemente neste post.
Uma possível solução é utilizar o memória mapeada, com o mmap. Porém com o mmap, ainda é necessária a cópia entre os buffers de envio e recebimento do kernel, poupando apenas a cópia para o espaço do usuário. Outro rico é de ocorrer de outro processo fechar o arquivo mapeado, que provavelmente ocorrerá algo catastrófico, se não tratado! :-)
Ah! O ALSA, prove na sua API, as Direct Access (MMAP) Functions, onde o buffer do som é compartilhados, economizando recursos.
Então, para solucionar o problema, por exemplo no caso do servidor, foi implementada a chamada do sistema sendfile, onde [bem basicamente] ao invés de copiar os dados da memória, são copiados os descritores dela. Desta forma economiza-se memória, ciclos do processador e polui-se menos o cache.
Mais informações em http://www.linuxjournal.com/article/6345, onde é dado uma explicação mais profunda e com figurinhas ilustrativas :-)