缓存I/O和直接I/O

什么是缓存I/O:

缓存I/O又称为标准I/O,大多数文件系统的默认I/O操作都是缓存I/O。在Linux的缓存I/O机制中,操作系统会将I/O的数据缓存在文件系统的页缓存中,即数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。

缓存I/O的优点:

1、缓存I/O使用了操作系统内核缓冲区,在一定程度上分离了应用程序空间和实际的物理设备;

2、缓存I/O可以减少读盘的次数,提高性能;

当应用程序尝试读取某块数据的时候,如果这块数据已经存放在了页缓存中,那么这块数据就可以立即返回给应用程序,而不需要经过实际的物理读盘操作。当然,如果数据在应用程序读取之前并未被存放在页缓存中,那么就需要先将数据从磁盘读到页缓存中去。对于写操作来说,应用程序也会将数据先写到页缓存中去,数据是否被立即写到磁盘上去取决于应用程序所采用的写操作机制:如果用户采用的是同步写机制( synchronous writes ), 那么数据会立即被写回到磁盘上,应用程序会一直等到数据被写完为止;如果用户采用的是延迟写机制( deferred writes ),那么应用程序就完全不需要等到数据全部被写回到磁盘,数据只要被写到页缓存中去就可以了。在延迟写机制的情况下,操作系统会定期地将放在页缓存中的数据刷到磁盘上。与异步写机制( asynchronous writes )不同的是,延迟写机制在数据完全写到磁盘上的时候不会通知应用程序,而异步写机制在数据完全写到磁盘上的时候是会返回给应用程序的。所以延迟写机制本身是存在数据丢失的风险的,而异步写机制则不会有这方面的担心。

直接I/O技术:省略掉缓存I/O技术中操作系统内核缓冲区的使用,数据直接在应用程序地址空间和磁盘之间进行传输,从而使得自缓存应用程序可以省略掉复杂的系统级别的缓存结构,

直接I/O技术的优点:减少操作系统内核缓冲区和应用程序地址空间的数据拷贝的次数,降低了对文件读取和写入时所带来的CPU的使用以及内存带宽的占用。如果传输的数据量很大,使用直接I/O的方式进行数据传输,而不需要操作系统内核地址空间拷贝数据操作的参与,提高性能。

直接I/O可能存在的问题:

设置直接I/O的开销非常大;

缓存I/O的读操作可以从高速缓冲存储器中获取数据,而直接I/O的读数据操作会造成磁盘的同步读,带来性能上的差异,导致进程需要较长的时间才能执行完;对于写数据操作来说,使用直接I/O需要write()系统调用同步执行,否则应用程序将会不知道什么时候才能够再次使用它的I/O缓冲区。

你可能感兴趣的:(Linux)