Gravações de dispositivos de bloco são armazenadas em buffer pelo kernel. Isso fica claramente visível quando um sistema de arquivos é montado (quando você desmonta, os buffers precisam ser liberados, levando a um atraso às vezes muito longo antes que o umount
retorne). Esse atraso está aparentemente piorando à medida que a RAM disponível está ficando maior e maior. Você pode escrever meio GB imediatamente antes que o kernel inicialize a transferência de dados. O kernel pode transparentemente gravar no dispositivo por minutos depois de ver a transferência completa.
Esse recurso é muito bom por vários motivos. Ele permite uma resposta muito mais rápida para leitura e gravação em dispositivos, os dados também podem ser transparentemente lidos no buffer após a gravação, antes que a gravação física real seja concluída. Para discos rígidos que são montados a longo prazo, os agendamentos de kernel são gravados para quando ele tem tempo, enquanto faz o dispositivo responder mais rapidamente da perspectiva do usuário. Especialmente para discos rígidos magnéticos, escrever em grandes blocos sequencialmente também é mais rápido do que escrever pequenos pedaços em vários lugares: os pedaços podem ser classificados e agrupados antes de serem empurrados para o dispositivo físico (embora os discos rígidos também façam algum buffer e classificação de dados internamente em hardware). Em suma, você não percebe muita lentidão do dispositivo e também não percebe atrasos iniciais (no caso de unidades montadas em rede ou discos rígidos que precisam sair da hibernação).
Para acesso direto a um dispositivo de bloco, o armazenamento em buffer é um tanto lamentável, porque você não chama umount
e realmente não percebe quando a transferência é concluída. Você deve chamar sync
em qualquer caso.