O_DIRECT
bypasses caches. It does not bypass the driver.
Usar O_DIRECT
em um dispositivo de bloco ignora o "cache de buffer" do kernel. "cache de buffer" não faz parte do driver.
Usar o O_DIRECT
em um arquivo normal - ou seja, um arquivo que não é um arquivo especial do dispositivo - é uma solicitação para ignorar o "cache de páginas" do kernel. O "cache de páginas" não faz parte do sistema de arquivos, mas também não faz parte do driver.
Em sistemas operacionais mais antigos, o arquivo IO pode ser armazenado em cache em dois locais - cache de página e cache de buffer. Se esse for o caso, O_DIRECT
deve ignorar os dois caches.
No Linux e em muitos outros tipos modernos de Unix, o cache de buffer pode realmente depender do cache de páginas. Eles são descritos como tendo um Cache de Buffer Unificado. Uma característica importante é que evita o armazenamento de arquivos IO em dois locais diferentes. Por isso, usa a memória de forma mais eficiente. Pessoas diferentes parecem usar definições conflitantes. Algumas pessoas dizem que não há cache de buffer, apenas um cache de páginas.
Mesmo quando um sistema operacional evita o armazenamento de arquivos em cache do E / S em dois locais diferentes, pode não garantir que o cache seja usado para o E / S de arquivo de maneira consistente com o cache usado ao acessar o arquivo de dispositivo de bloco.
( O_DIRECT
não funciona no Linux tmpfs
, porque tmpfs
é pouco mais que um wrapper em torno do cache da página e do cache do diretório. Foi sugerido que tmpfs
poderia permitir que O_DIRECT
fosse bem-sucedido. e simplesmente ignorá-lo, para melhorar a compatibilidade. Portanto, eu não diria que O_DIRECT
está garantido para ignorar o cache de páginas.)