热门
最新
红包
立Flag
投票
同城
我的
发布
高高飞起的勇敢麦当
4 年前
trueweixin_46344594
^_^(一句话科幻)
"我可以爱你吗?"
"人工智能禁止与人类相爱。"
"那我们就什么都不用违背了。"
下一条:
关于I/O多路复用:IO多路复用是Linux五种IO模型之一,其他四种分别为阻塞、非阻塞、信号驱动IO和异步。一般来说,除了调用特殊的API接口,其他都是同步的。IO多路复用在Linux下常有三种实现:select、poll、epoll。其中最常用的就是epoll。epoll在内核中维护了一颗红黑树以及一个链表。红黑树上存储着epoll_ctl添加的socket文件描述符。在epoll_wait之前,开发者一般会把socket添加到这颗红黑树中,当网络另一端有数据来了,内核从网卡的sk_buff缓冲区将数据拷贝到自己的缓冲区,同时根据端口信息锁定socket。之后epoll_wait就会返回发生事件的socket信息。之后开发者对不同信息进行处理就行,同时可以像muduo那样给event.data.ptr中设置一个回调函数以实现reactor模型。另外,epoll一般有两种模式,ET模式和LT模式,ET模式是当我没有处理这个事件,之后都不会再给我上报这个;而LT模式则是,当我没有处理事件,之后还会给我上报。muduo中为了安全,采用的是LT模式。和epoll返回具体发生事件的socket不同的是,poll和select都是基于轮询的。这里先讲select,select维护了一个32个整形元素的数据,每个元素32位,每一位都代表着一个socketfd,总共可以监听1024个socket。在每次调用监听函数select之前,开发者都需要对每个socket及其感兴趣事件进行注册。之后如果有事件响应select会返回,开发者需要 轮询着1024位,挨个判断是否有事件发生。处理完这轮逻辑之后,如还想使用select,就需要对每个socket及其感兴趣事件重新添加。而poll也是这一套机制,不过其使用了一个结构体将描述符fd和感兴趣事件event联系起来,同时其突破了1024的限制,最大可监听数达到了65535。
立即登录