果子私房笔记-多路IO复用


多路IO复用

https://blog.csdn.net/qq_46312987/article/details/124213418

零拷贝优化

传统的网络编程中,将磁盘文件写入网卡需要进行四次拷贝和四次上下文切换。
磁盘文件–DMA拷贝->(内核态)缓存区–CPU拷贝->(用户态)用户缓存区–CPU拷贝->(内核态)socket缓冲区–DMA拷贝->网卡。

DMA拷贝:

DMA的原理是CPU将需要迁移的数据的位置告诉给DMA,包括源地址,目的地址以及需要迁移的长度,然后启动DMA设备去完成相应的操作,最后通过中断反馈给CPU,结束。

Mmap优化:

mmap通过内存映射,将内存缓冲区中的数据映射到用户缓冲区,由此让用户空间共享内核空间的数据。

常用的IO模型

阻塞IO:

假设建立一个socket连接,如果这个连接的客户端一直不发数据,那么服务端线程将会一直阻塞在read函数上不返回。

非阻塞IO:

将read函数改造成:如果没有数据到达网卡时,立即返回一个错误值,而不是阻塞地等待。这样就需要用户线程循环调用read,直到返回值不为-1,再开始处理业务。注意:非阻塞的read,指的是数据还未到达网卡,当数据已经到达内核缓冲区,此时调用read函数依旧是阻塞的,需要等待数据从内核缓冲区拷贝到用户缓冲区才能返回。

多路复用IO

前导:

为每个连接创建一个线程耗费的资源较多,我们可以每连接一个客户端后,将文件描述符放到一个数组里,用一个线程不断去遍历这个数组,调用每个元素的非阻塞read方法。每次遍历到read返回-1,依然是一次浪费资源的系统调用。

Select:

通过select,我们把文件描述符数组传输给操作系统,让操作系统去遍历,操作系统将准备就绪的文件描述符做上标识再返回给用户,用户依旧需要遍历刚提交给操作系统的数组。相比于前导的方法,就是把循环调用rpc改成了一次调用批量的rpc。

Poll:

相比select去掉了只能监听1024个文件描述符的限制。

Epoll:

针对select模型的三个缺点进行改造:1.在内核中保存一份文件描述符集合,无需用户每次重新传入,只需告诉内核修改的部分。2.内核不再以轮询的方式去找就绪的文件描述符,而是通过异步IO事件唤醒。3.内核仅会将有IO事件的文件描述符返回给用户,用户无需再遍历整个文件描述符集合。


文章作者: xucanxx
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 xucanxx !
  目录