乐趣区

关于nio:IO零拷贝

用户态与内核态
Linux 操作系统体系架构分为用户态与内核态。 内核 次要管制计算机的硬件资源,为下层利用提供运行反对。用户态 为下层利用的流动空间,应用程序的执行须要内核的反对,如 CPU 资源,存储资源,IO 资源等,用户态通过内核提供的拜访接口也就是 零碎调用 来应用这些资源。

基于间接外在 (DMA) 实现的文件传输

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

通过 sendfile 实现的零拷贝

  1. 应用程序发现 sendfile 零碎调用,用户空间切换到内核态
  2. 通过 DMA 将磁盘文件拷贝到内核缓冲区
  3. DMA 收回中断,CPU 解决中断,将数据从内核缓冲区拷贝到内核中与 socket 相干的缓冲区。而后 sendfile 零碎调用返回,从内核态切换到用户态
  4. DMA 将内核空间 socket 缓冲区数据拷贝到网卡
    这里一共呈现了 2 次高低切换,3 次数据拷贝

未完。。。

退出移动版