Esta diferença, sem dúvida, se resume a uma coisa: o armazenamento em cache.
Será realmente difícil determinar onde, especialmente a partir da userland, mas todas as escritas do sistema de arquivos do buffer (cache) dos kernels do Linux, a menos que você execute os truques para obter gravações síncronas. Ou seja, o kernel salvará os dados que o dd
envia para um arquivo em algum lugar na memória do kernel. O kernel provavelmente usa o código do sistema de arquivos para fazer isso. Algum tempo no futuro, o kernel irá agendar um bloco de disco para ir para o disco. Isso acontecerá "de forma assíncrona", algum tempo depois que o kernel informar dd
que a gravação terminou.
A razão para isso é que mover bytes em um barramento e em uma unidade de disco e, em seguida, nos discos é muito mais lento do que copiar do usuário para a memória do kernel. Normalmente, os programas não se importam muito com o fato de os dados que eles "escreveram" não chegarem ao disco por um tempo. A confiabilidade do hardware é alta o suficiente para que os dados façam isso quase sempre.
Essa é a resposta simples, mas uma vez que você tenha leituras / gravações / exclusões armazenadas em buffer no kernel, o código do sistema de arquivos pode tirar proveito de vidas úteis curtas, nunca escrevendo os dados dos arquivos que são deletados antes que eles sejam deletados. Faça isso no disco. O código do sistema de arquivos pode agrupar gravações para aproveitar os blocos de disco maiores que um grupo de gravações e consolidá-los em uma única gravação. Há toneladas de otimizações que podem ser feitas na maioria dos sistemas de arquivos.