缓冲IO和直接IO
对于缓冲IO,一个读操作会有3次数据拷贝:
读:磁盘->内核缓冲区->用户缓冲区->应用程序内存
写:应用程序内存->用户缓冲区->内核缓冲区->磁盘
对于直接IO,一个读操作,会有2次数据拷贝,一个写操作,有反向的2次数据拷贝:
读:磁盘->内核缓冲区->应用程序内存
写:应用程序内存->内核缓冲区->磁盘
所以所谓的直接IO,其中直接的意思是指没有用户级的缓冲,但操作系统本身的缓冲还是有的。
内存映射文件与零拷贝
内存映射文件
相比于直接IO,内存映射文件往前更进了一步。当用户空间不再有物理内存,直接拿应用程序的逻辑内存地址映射到Linux操作系统的内核缓冲区,应用程序虽然读写的是自己的内存,但这个内存只是一个逻辑地址,实际读写的是内核缓冲区。
数据拷贝次数从缓冲IO3次,到直接IO的2次,再到内存映射文件,变成了1次。
读:磁盘->内核缓冲区
写:内核缓冲区->磁盘
零拷贝
零拷贝(Zero Copy)是提升IO效率的又一利器,Kafka在消费消息的时候利用了零拷贝技术。