MMAP和零拷贝

MMAP

mmap技术 是一种文件或其他对象映射到内存的技术。

这种技术,让用户程序(用户空间)直接访问设备内存(内核空间),相比于在用户空间和内核空间互相拷贝数据,效率更高。

系统调用命令: mmap()。使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read(),write() 等操作。

零拷贝

零拷贝技术 是另一个系统调用,Linux 中如 sendfile 命令。它减少了内存中用户空间与内核空间数据的拷贝过程,使得 CPU 处理效率更高。

Kafka

Kafka 是一个分布式发布订阅消息系统(详细学习参考),它巧妙用到了这两种技术。

MMAP和零拷贝.png

数据的输入(从网卡到磁盘)

用了 MMAP 打通用户空间和内核空间,并将一部分内存映射到磁盘上的一段空间。

流程:data 从网卡过来,进入内核,再读入到用户空间的服务,服务处理后扔到 MMAP 中,内核将数据再拷贝到磁盘中。

数据的输出(从磁盘到网卡)

若没有零拷贝,用户空间先调内核的 read 去读磁盘中的文件,将磁盘数据存入用户空间(data 从磁盘->内核空间->用户空间);然后再调用内核的 write 方法,将数据发到网卡(data 从用户空间->内核空间->网卡)。由于数据没有在用户态改变数据,所以造成了数据的流转浪费。

内核有一个方法叫 sendfile(out_fd, in_fd, offset, size),用户直接将命令发给内核,内核便可以直接将数据从磁盘经过内核发出到内存。

你可能感兴趣的:(MMAP和零拷贝)