用户态与内核态
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次数据拷贝

未完。。。