协程在io多路复用中的应用

阻塞式IO

在这里插入图片描述

  • socket的所有操作都由操作系统来提供,也就是通过系统调用来完成

  • 每创建一个socket,就会在文件描述符表中对应增加一条记录,而返回给应用程序的只有一个socket描述符,每个TCPsocket创建的时候,操作系统都会为它分配读缓冲区和写缓冲区

  • 要获得数据就要从读缓冲区读取过来,同样的要通过socket发送数据,就要写入些缓冲区

协程在io多路复用中的应用

  • 当要写入的数据没有地方,或者读取的数据没有时候,就要有cpu一致在阻塞的等待,这就是阻塞式IO

在高并发场景下家具调度开销

非阻塞式IO

就是让出cpu,需要频繁的检查socket是否可读可写

协程在io多路复用中的应用

IO多路复用

将要监听的socket加入监听集合,这样就可以通过一次系统调用,同时监听多个socket,有socket就绪了,就可以逐个执行了,既不会为等待某个socket而阻塞,也不会陷入忙等待之中

协程在io多路复用中的应用

Select IO多路复用

协程在io多路复用中的应用

  • 打开文件描述符个数为1024个
  • 每次都要传入所有监听集合来看是否有就绪的socket
  • 每次都要便利所有集合才知道哪个socket就绪

poll IO多路复用

可打开的文件描述符个数为最多的文件描述符个数

其他依然存在

epoll IO多路复用

协程在io多路复用中的应用

每个socke它有自己的数据结构,添加或者删除的时候都会传入一个结构体,epoll——wait等待就绪结果

问题

  • 一个socket可读,但是只读到半个socket请求,没读完

协程在io多路复用中的应用

协程在io多路复用中的应用
面向协程调度

  • 如果是用于监听端口的fd就绪了,就建立连接创建一个新的fd,交给一个协程来负责

协程在io多路复用中的应用

封装

协程在io多路复用中的应用