As we have seen, in Version 2.6 of Linux, there is no substantial difference between accessing a regular file through the filesystem, accessing it by referencing its blocks on the underlying block device file, or even establishing a file memory mapping. There are, however, some highly sophisticated programs (self-caching applications ) that would like to have full control of the whole I/O data transfer mechanism. Consider, for example, high-performance database servers: most of them implement their own caching mechanisms that exploit the peculiar nature of the queries to the database. For these kinds of programs, the kernel page cache doesn't help; on the contrary, it is detrimental for the following reasons:
Lots of page frames are wasted to duplicate disk data already in RAM (in the user-level disk cache).
read( ) and
write( ) system calls are slowed down by
the redundant instructions that handle the page cache and the
read-ahead; ditto for the paging operations related to the file
Rather than transferring the data directly between the disk
and the user memory, the
write( ) system calls make
two transfers: between the disk and a kernel buffer and between the
kernel buffer and the user memory.
Because block hardware devices must be handled through interrupts and Direct Memory Access (DMA), and this can be done only in Kernel Mode, some sort of kernel support is definitely required to implement self-caching applications. ...