用户态与内核态
Linux操作系统体系架构分为用户态与内核态。内核主要控制计算机的硬件资源,为上层应用提供运行支持。用户态为上层应用的活动空间,应用程序的执行需要内核的支持,如CPU资源,存储资源,IO资源等,用户态通过内核提供的访问接口也就是系统调用来使用这些资源。
文章图片
基于直接内在(DMA)实现的文件传输
文章图片
- 应用程序调用read(),上下文切换到内核,DMA将磁盘数据复制到内核的缓存空间
- read()返回,上下文切换到用户态,CPU将数据复制到用户的缓存空间
- 应用程序调用write(),上下文再次切换到内核,CPU将数据复制到内核socket缓存
- write()返回,上下文再次切换到用户态,DMA将socket缓存数据复制到网卡缓存上
这里一共出现了4次上下文切换,4次数据拷贝
文章图片
- 应用程序发现sendfile系统调用,用户空间切换到内核态
- 通过DMA将磁盘文件拷贝到内核缓冲区
- DMA发出中断,CPU处理中断,将数据从内核缓冲区拷贝到内核中与socket相关的缓冲区。然后sendfile系统调用返回,从内核态切换到用户态
- DMA将内核空间socket缓冲区数据拷贝到网卡
这里一共出现了2次上下切换,3次数据拷贝