Entendo que, classicamente, o Kernel do Linux era conservador quanto à adição de novos syscalls.
Mas aprendi sobre a existência de copy_file_range
, que parece fazer exatamente a mesma coisa que sendfile
. As únicas diferenças que consegui identificar são:
- não funciona em soquetes, apenas em arquivos regulares adequados
- permite que o deslocamento de entrada e saída seja definido
Mas para arquivos regulares, a seek
pode atingir a mesma semântica de deslocamento, então agora estou confuso sobre qual é o propósito do copy_file_range
syscall, se suas habilidades são um subconjunto estrito do syscall existente do San? Especialmente porque a busca como uma coisa separada pode ser feita de forma bastante sensata separadamente, para não estender ainda mais o tempo gasto no kernelspace l. (Como de costume, o objetivo do design do sistema operacional é fazer com que as chamadas do sistema operacional não sejam bloqueadas, e a busca física possa ser concluída enquanto o controle já foi devolvido ao usuário.)
copy_file_range
A vantagem desendfile
(esplice
) é que, em algumas circunstâncias, ele implementa o descarregamento de cópia. Na verdade, esse é o seu objetivo principal e vem de um trabalho de longa data sobre descarregamento de cópias - a intenção era fornecer acesso a recursos que permitissem que cópias em bloco fossem delegadas ao hardware ( por exemplo, SANs). Esse trabalho ainda está em andamento ; atualmente, o descarregamento de cópias depende do suporte do sistema de arquivos, onde as cópias podem ser substituídas por uma referência no sistema de arquivos ou delegadas a um servidor. (Consulte Copiar na gravação para diretórios? para obter detalhes.)sendfile
por outro lado, vem do desejo de enviar arquivos para a rede de forma eficiente; da mesma forma,splice
envia arquivos para pipes de forma eficiente.sendfile
foi estendido para enviar arquivos para outros arquivos há muito tempo (usandosplice
nos bastidores), mas permanece a suposição de que é uma leitura-gravação otimizada: em vez de ler dados no espaço do usuário e gravá-los, um processo pode solicitar ao kernel para cuidar do loop de leitura e gravação.Suspeito que
copy_file_range
a existência de está ligada ao argumento adicional de deslocamento de saída: se você pensa em expor um recurso de cópia de bloco de descarregamento de baixo nível disponível em hardware, vinculá-lo a uma API baseada em descritor de arquivo requer ambos os deslocamentos; embora isso seja possível usandosendfile
e qualquer que seja o deslocamento atual no descritor do arquivo de saída, talvez isso não esteja suficientemente acoplado para o objetivo de descarregamento de cópia.( A implementação genérica
copy_file_range
, usada em sistemas de arquivos sem suporte específico, delegasplice
da mesma maneira quesendfile
. Indiscutivelmentesendfile
poderia ser usadacopy_file_range
sempre que possível, não sei se isso já foi implementado.)