零拷贝+页缓存的学习感悟

用户进程和操作系统内核之间的数据交互可以这样理解

A服务调用B服务的一个数据传输接口,A服务在机器1上,B服务在机器2上,这个场景非常普遍,想想怎么实现的?A服务在内存中开辟一个字节数组Byte1存你要传输的数据,然后将字节Byte1作为参数调用B服务的接口,B服务需要一个Byte2作为形参接收你的数据,Byte2需要在B服务中开辟内存空间。当接口没有调用完成之前同一份数据在两个不同的进程之间共存了2份,这两个进程分别在不同的机器上。

操作系统也是一个程序,它也有自己管理的内存地址空间,用户进程也是一个程序;用户进程和操作系统内核进程间的交互可以类比成两个程序的交互

当用户进程需要写数据的时候:用户进程自己内存中肯定有一个buffer,操作系统接收你的数据也需要在内存中开辟一个buffer,不同机器上的接口调用需要网络传输数据,但这里的情况是需要将用户buffer拷贝到内核buffer中,只是用户进程的buffer在用户态,操作系统的buffer在内核态,且用户进程自己的内存地址空间是操作系统分配的,它和操作系统自己的内核地址空间都在一块物理内存上,且都由操作系统管理(注意:这和上面个的例子,内存在不同物理机器上的区别),数据写到操作系统内核buffer后,一般程序员都不会再关心了,由操作系统负责将数据同步到磁盘。

当用户进程需要读数据的时候:结合上面的例子当用户进程读取数据的时候,也就是将才做系统内核buffer的数据拷贝到用户buffer中

 

操作系统的内核怎么处理数据,怎么读数据?怎么写数据

知道了用户进程和操作系统内核进程之间的数据交互,还需要继续挖掘内核进程怎么操作数据的,怎么将数据同步到磁盘,怎么讲数据从磁盘读到内存。

内核进程怎么读取磁盘中的数据:大家对Redis缓存肯定不陌生,应用查询数据的时候先从Redis中查询数据,查不到数据的时候我们再从数据库查询,通过缓存加速查询效率,缓存中一般放热点数据提高命中率。系统内核读取磁盘数据也可以同样类比,内存访问速度非常快,磁盘访问速度超级慢,现在要读取磁盘中的数据,系统内核将磁盘中的数据缓存到到内核的Page Cache中,这个Page Cache 的空间相比磁盘的巨量存储肯定不大,只存了经常访问的热点数据,且有淘汰机制,用户进程读文件的时候先从内核Page Cache中读取,读不到再到真实的物理磁盘中读取。

内核进程写数据到磁盘:内核进程将Page Cache 中的数据写磁盘,可以理解为缓存刷新。

 

看完我上面的白话描述是不是感觉更好理解一点

 

专业词语:零拷贝、Page Cache 、用户态、内核态、nmap、缺页中断、DMA

计算机中数据交互的几个角色

  1. 用户进程Buffer
  2. 操作系统内核进程中的 PageCache
  3. 虚拟文件系统的Buffer Cache
  4. 物理磁盘中的数据块 Block
  5. 网络传输中的Socket Buffer
  6. 网卡传输数据的 Buffer
  7. 其它外部设备和系统内核做数据交互都各自有自己的Buffer

零拷贝我理解的是通过一种技术减少各个角色之间数据交换的拷贝,因为数据都在当前操作系统中,同一份数据来回不同的拷贝非常耗费计算机CPU和内存资源

nmap我理解:虚拟内存映射是解决内存空间不足的问题,如果内存足够大,可以经所有磁盘中的数据都缓存到内核内存中,然后用户进程直接操作内核内存,速度肯定是最快的。但是实际物理内存只有几个到几十个G,磁盘可以到几十T或更大。磁盘空间再怎么大,它的地址空间是可以表示的,比如磁盘空间的地址是 000 - 1000 内存大小10 ,也就是最多可以缓存大小为10的磁盘数据到内存中,我们搞一个虚拟映射,假设内存中的空间地址也是 000 - 1000 但是只有000- 010是真实的映射,其它的都是虚拟的,当我访问地址002的时候,直接从真实的映射地址返回数据,当我访问088地址的时候,通过nmap映射表发现当前地址是一个虚拟映射,内存中不存在088地址对应的数据,操作系统将000 -010 中的一个地址002和088关联上,将磁盘中的数据读取002中(缺页中断),这个时候用户进程就读取到数据了

 

以上全是自己的白话理解,如有错误欢迎指正!

 

参考:

  1. sendfile(2) — Linux manual page

  2. splice and pipes

  3. splice()系统调用族探秘

  4. Linux 内核的文件 Cache 管理机制介绍

  5. 深入剖析Linux IO原理和几种零拷贝机制的实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值