序言
我们项目的主要目的是将ros的通信机制移植出来。
为此,小组内的同学已经在寒假中提前设计好了工作原型,在项目正式开始之前,我需要先学习这里面的具体原理:mmap。
什么是mmap?
零拷贝
传统IO方式:
通过
read()
把数据从硬盘读取到内核缓冲区,再复制到用户缓冲区;然后再通过write()
写入到socket缓冲区
,最后写入网卡设备。
为了加速硬件设备在读/写内核空间中的
那么对于零拷贝而言,并非真的是完全没有数据拷贝的过程,只不过是减少用户态和内核态的切换次数以及CPU拷贝的次数。
这里,仅仅有针对性的来谈谈几种常见的零拷贝技术。
而通过mmap+write
方式则产生2次DMA拷贝+1次CPU拷贝,4次上下文切换,通过内存映射减少了一次CPU拷贝,可以减少内存使用,适合大文件的传输。
代码部分
函数说明:munmap()用来取消参数start 所指的映射内存起始地址,参数length 则是欲取消的内存大小。当进程结束或利用exec 相关函数来执行其他程序时,映射内存会自动解除,但关闭对应的文件描述词时不会解除映射。 返回值:如果解除映射成功则返回0,否则返回-1。错误原因存于errno 中错误代码EINVAL参数 start 或length 不合法。
参考资料:
阿里二面:什么是mmap? - 知乎 (zhihu.com)
(2条消息) Linux 内存映射函数 mmap()函数详解yangle4695的博客-CSDN博客mmap函数
代码例子中使用了较多的mmap参数,需要注意结合相关的参考资料进行学习。