笔记
设计一个线程处理多个任务
一.select实现源码
image.png
1.画线上半部分主要是获取文件描述集合fds,最大文件描述符max
2.reset是bitmap主要描述那个文件是启用的,最大1024个,1的需要监听
image.png
3.select会将reset拷贝在内核态
image.png
没数据会阻塞,有数据: 1会将fd置位(即标记)2 selecr返回
4.最后遍历找到被置位的FD_ISSET,读取并处理。
缺点:1.bitmap最多1024
2.fdset不可重用,因为置位
3.拷贝用户态到内核态仍有开销
4.再次遍历需要O(n)
二.poll源码实现
image.png
原理差不多
区别在于
有数据:
1.置位是修改revents
2.poll返回
解决:
1.最多1024个
2.fds不可重用
缺点:
1.拷贝用户态到内核态仍有开销
2.再次遍历需要O(n)
三.epoll源码实现
image.png
有数据:
1.置位 (通过重排)将有数据的fd放在前面
2.返回 有返回值 比如3就是有3个触发事件
所以使用的时候就可以有效遍历(O(1))
再读取处理
epoll_ctl 事件
epoll_wait 事件回调
解决:
1.拷贝用户态到内核态仍有开销
2.再次遍历需要O(n)
redis nginx nio 底层都是epoll
网友评论