协程在io多路复用中的应用
阻塞式IO
在这里插入图片描述
-
socket的所有操作都由操作系统来提供,也就是通过系统调用来完成
-
每创建一个socket,就会在文件描述符表中对应增加一条记录,
而返回给应用程序的只有一个socket描述符,每个TCPsocket创建的时候,操作系统都会为它分配读缓冲区和写缓冲区
-
要获得数据就要从读缓冲区读取过来,同样的要通过socket发送数据,就要写入些缓冲区
- 当要写入的数据没有地方,或者读取的数据没有时候,就要有cpu一致在阻塞的等待,这就是阻塞式IO
在高并发场景下家具调度开销
非阻塞式IO
就是让出cpu,需要频繁的检查socket是否可读可写
IO多路复用
将要监听的socket加入监听集合
,这样就可以通过一次系统调用,同时监听多个socket,有socket就绪了,就可以逐个执行了,既不会为等待某个socket而阻塞,也不会陷入忙等待之中
Select IO多路复用
- 打开文件描述符个数为1024个
- 每次都要传入所有监听集合来看是否有就绪的socket
- 每次都要便利所有集合才知道哪个socket就绪
poll IO多路复用
可打开的文件描述符个数为最多的文件描述符个数
其他依然存在
epoll IO多路复用
每个socke它有自己的数据结构,添加或者删除的时候都会传入一个结构体,epoll——wait等待就绪结果
问题
- 一个socket可读,但是只读到半个socket请求,没读完
面向协程调度
- 如果是用于监听端口的fd就绪了,就建立连接创建一个新的fd,交给一个协程来负责