面向云技术架构 - 痴者工良

  • 首页
  • 工良写的电子书
    • kubernetes 教程
    • 从 C# 入门 Kafka
    • 多线程和异步
    • 动态编程-反射、特性、AOP
    • 表达式树
  • 本站文章导航
  • 隐私政策
愿有人陪你颠沛流离
遇到能让你付出的事物或者人,都是一种运气。
能遇到,就该珍惜。或许你们最终没能在一起,但你会切实地感受到力量。
正因为这样,那段相遇才变得有价值,才没有辜负这世间的每一段相遇。
  1. 首页
  2. 计算机科学与软件工程
  3. 操作系统
  4. 正文

零拷贝机制

2022年12月22日 264点热度 2人点赞 0条评论
内容纲要

通常程序执行 IO 操作时,需要涉及用户空间和内核空间的两个缓冲区。

只有内核才能跟磁盘等硬件进行操作,因此数据在流向程序时,必定会先存在于内核缓冲区,内核缓冲区又称为 PageCache,不同操作系统的 PageCache 机制不一样。

file

内核缓冲区:系统内核在内核空间中定义的内核缓冲区,即 PageCache。
用户缓冲区:通过 C 语言或其它语言提供的标准 IO 读写函数在用户空间定义的缓冲区。

从上图中可以看到,IO 操作有两种方式:

  • 缓冲IO:同时使用用户缓冲区和内核缓冲区。需要 3 次数据复制以及 1 次上下文切换(用户态、内核态切换)。
  • 直接IO:只使用内核缓冲区。需要 2 次数据复制和 1 次上下文切换。

明显,直接 IO 比缓冲 IO 少了一个缓冲区,也就是少了一个数据复制操作。

为了提高 IO 读写效率,操作系统提供了 mmap 和 sendfile 两个机制,帮助我们实现内存 ”零拷贝“,以及减少用户态和内核态上下文切换次数,不过要注意,它们的特点都是针对文件而言的。

mmap 是内存映射机制,直接将文件从内核缓冲区映射到应用程序内存地址空间。

file

文件从内核缓冲区中映射到应用程序内存中时,是逻辑地址。当程序操作这个逻辑地址,进行读写时,实际上是在内核缓冲区中操作,数据并不需要复制到应用程序的内存中或经过用户空间。

使用 mmap 后,仅内核缓冲区跟磁盘之间出现数据复制。但因为内核空间跟应用程序之间需要经过用户态和内核态的转换,一次还需要一次上下文切换。

sendfile 则是为 Socket 编程服务的。在网络通讯中,操作系统内核会为 Socket 提供一个缓冲区,要传输的网络数据要经过缓冲区。

使用 sendfile 处理文件,数据可以不经过用户空间,只需要通过内核空间完成操作,没有上下文切换。

file

在一些新版本的系统中,数据发送时可以不经过 Socket 缓冲区,减少一次数据复制。

file

使用 sendfile 有个缺点是,因为数据没有经过用户空间,因此应用程序不能读取或修改这些数据。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: 拷贝 机制
最后更新:2022年12月30日

痴者工良

高级程序员劝退师

点赞
< 上一篇

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2022 whuanle.cn. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备18051778号

粤公网安备 44030902003257号