前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如果不使用零拷贝技术,普通的IO操作在OS层面是如何执行的

如果不使用零拷贝技术,普通的IO操作在OS层面是如何执行的

作者头像
小土豆Yuki
发布2023-09-02 15:47:52
1660
发布2023-09-02 15:47:52
举报
文章被收录于专栏:洁癖是一只狗

提前说明有些操作系统的相关概念自行百度,但是个人认为,很多面试官可能对于操作系统也懂的不多,当然不排除一些真正的大佬,往往面试的面试官也就那样,废话不多说,开始讲解普通IO的底层原理

  1. 早期的数据IO,由用户进程向CPU发起,应用程序与磁盘之间的 I/O 操作都是通过 CPU 的中断完成的,如下图
  1. 用户发起读取数据请求到CPU.
  2. CPU把请求转发到磁盘控制器中
  3. 磁盘控制器读取数据到磁盘缓冲区
  4. 磁盘寄存器发送中断信号给cpu
  5. CPU读取磁盘缓冲区的数据到寄存器中
  6. CPU再把寄存器中的数据读取到内存中
  7. 最后用户进程再把内存的数据读取,然后系统调用返回

我们再看一张图如下

从这种图中,我清晰可以看到由于CPU把数据从磁盘读取到寄存器中,然后放入到内存,中间CPU是不能干其他事情的,为了解放cpu的占用,所以出现了DMA技术

DMA技术

DMA 的全称叫直接内存存取(Direct Memory Access),是一种允许外围设备(硬件子系统)直接访问系统主内存的机制,之后数据的拷贝都有DMA进行处理,如下图

  1. CPU把IO请求发送给DMA,CPU可以干其他事情去了,同时用户进程阻塞
  2. DMA收到请求,将数据放到磁盘控制器的缓冲区中
  3. 当磁盘控制器缓冲区满了以后,通知DMA
  4. DMA接收到通知,把磁盘缓冲区的数据拷贝到内核缓冲区
  5. DMA再通知CPU已经读取完了
  6. CPU此时再把内核缓冲区拷贝到用户缓冲区中
  7. 最后系统调用返回

传统的IO底层原理

比如我们正常从磁盘中读取一张图片,返回给前端,首先会调用read进行读取,然后在write进行输出,整体流程如下

  1. 用户进程调用read进行第一次用户态到内核态的切换
  2. 磁盘收到请求,DMA会把磁盘缓冲区的数据拷贝到内存缓冲区完成第一次拷贝DMA拷贝
  3. 然后进行第二次内核态用户态的转换
  4. 把内核缓冲区的数据cpu拷贝到用户缓冲区,完成第二次CPU拷贝
  5. 用户进程调用write,进行第三次用户态到内核态的切换
  6. CPU再次把用户缓冲区的数据拷贝到socket缓冲区
  7. DMA再次把socket缓冲区的数据拷贝到网卡完成第四次DMA拷贝
  8. 最后从内核态切换到用户态,系统调用完成

总共四次拷贝,四次切换,代价属实有点点大,并且在数据传输的场景中,用户并不会对数据进行再加工,所以没必要将数据拷贝到用户缓冲区,因此有了零拷贝,这个我们下次再说

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 洁癖是一只狗 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档