The Linux Programming Interface
File I/O Buffering
(01) 内容
In this chapter, we describe both types of buffering and consider how the affect application performance.
(02)cache技术
write(fd, "abc", 3)
内核先把abc写入到buffer中,然后flush,之后再写到disk中。
(03)目的
The aim of this design is to allow read() and write() to be fast, since they don't need to wait on a (slow) disk operation.
This design is also efficient, since it reduces the number of disk transfers that the kernel must perform.
(04)整个读写过程图
(05)直接文件操作,不需要buffer
(06)总结
Buffering of input and output data is performed by the kernel, and also by the stdio library. In some cases, we may wish to prevent buffering, but we need to be aware of the impact this has on application performance. Various system calls and library functions can be used to control kernel and stdio buffering and to perform one-off buffer flushes.
A process can use posix_fadvise() to advise the kernel of its likely pattern for accessing data from a specified file. The kernel may use this information to optimize the use of the buffer cache, thus improving I/O performance.
The Linux-specific open() O_DIRECT flag allows specialized application to bypass the buffer cache.
The fileno() and fdopen() functions assist us with the task of mixing system calls and standard C library functions to perform I/O on the same file. Give a stream, fileno() returns the corresponding file descriptor; fdopen() performs the converse operation, creating a new stream that employs a specified open file descriptor.
(07)习题