以传统的IO方式将本地文件发送到网络
共发生4次拷贝,4次内核态与用户态的上下文切换。
-
调用read()方法,程序从用户态下陷到内核态。
-
将磁盘中的文件拷贝到内核缓冲区(DMA copy)。
-
将内核缓冲区中的数据拷贝到用户缓冲区(CPU copy),程序由内核态转为用户态,read()方法返回。
-
调用write()方法,程序再次从用户态下陷到内核态,并将用户缓冲区中的数据拷贝到socket缓冲区(CPU copy)。
-
将socket缓冲区中的数据拷贝到网卡发送(DMA copy),程序由内核态转为用户态,write()方法返回。
DMA:直接内存存取(用于分担CPU拷贝的工作压力)
以mmap的方式将本地文件发送到网络
共发生3次拷贝,4次内核态与用户态的上下文切换。
-
调用mmap()方法,程序从用户态下陷到内核态。
-
将磁盘中的文件拷贝到内核缓冲区(DMA copy)。
-
程序从内核态转为用户态,mmap()方法返回。同时内核缓冲区与用户态缓冲区建立映射关系,内核缓冲区与用户缓冲区实现内存共享。
-
调用write()方法,程序再次从用户态下陷到内核态。并将内核缓冲区中的数据直接拷贝到socket缓冲区(CPU copy)。
-
将socket缓冲区中的数据拷贝到网卡发送(DMA copy),程序由内核态转为用户态,write()方法返回。