IO零拷贝

用户态与内核态
Linux操作系统体系架构分为用户态与内核态。内核主要控制计算机的硬件资源,为上层应用提供运行支持。用户态为上层应用的活动空间,应用程序的执行需要内核的支持,如CPU资源,存储资源,IO资源等,用户态通过内核提供的访问接口也就是系统调用来使用这些资源。
IO零拷贝_第1张图片

基于直接内在(DMA)实现的文件传输
IO零拷贝_第2张图片

  1. 应用程序调用read(),上下文切换到内核,DMA将磁盘数据复制到内核的缓存空间
  2. read()返回,上下文切换到用户态,CPU将数据复制到用户的缓存空间
  3. 应用程序调用write(),上下文再次切换到内核,CPU将数据复制到内核socket缓存
  4. write()返回,上下文再次切换到用户态,DMA将socket缓存数据复制到网卡缓存上
    这里一共出现了4次上下文切换,4次数据拷贝

通过sendfile实现的零拷贝
IO零拷贝_第3张图片

  1. 应用程序发现sendfile系统调用,用户空间切换到内核态
  2. 通过DMA将磁盘文件拷贝到内核缓冲区
  3. DMA发出中断,CPU处理中断,将数据从内核缓冲区拷贝到内核中与socket相关的缓冲区。然后sendfile系统调用返回,从内核态切换到用户态
  4. DMA将内核空间socket缓冲区数据拷贝到网卡
    这里一共出现了2次上下切换,3次数据拷贝

未完。。。

你可能感兴趣的:(niojavacpu)