select和epoll

select和epoll都属于IO多路复用的函数,select采用无差别轮询所有流的方式,找出事件发生的流。最大只能支持1024个文件描述符,每次使用都需要把文件描述符集合从用户态拷贝到内核态,开销很大,而epoll,没有了文件描述符的限制,只在注册的时候拷贝没有添加的文件描述符到红黑树上,使用回调函数来返回数据,效率大大提高。

《百万在线》笔记:
在服务端领域,“多路复用”是指使程序能够同时处理多个客户端连接的技术
轮询是一种最简单的多路复用机制,以接收数据为例,指的是网络线程循环不断地、非阻塞地读取数据,若有数据则进行处理,若没有数据则跳过。
每种方法都有其适用的场景,轮询适用于大部分客户端都在高频率发消息的场合。
对于游戏服务端来说,轮询的效率很低。一个游戏服务端通常连接着成百上千的客户端,而某一时刻可能只有少数客户端在发消息,对于单个客户端,服务端读不到数据的概率较大,因此会造成CPU算力的浪费。如图6-21所示,服务端连接着13台客户端,在某一时刻,只有2台客户端在发送消息,有效读取的概率只有2/13。
好在Linux系统提供了Epoll和Select等方法可以提高效率,具体做法是让线程阻塞,当有任何一个客户端发来消息时,再唤醒线程,并告知线程是哪些客户端发来的消息。Epoll包含了一个等待方法,执行该方法后,线程会阻塞,直到有客户端发来数据。假设有两个客户端发来数据,操作系统会唤醒线程,并通过某种方法 (比如,wait的返回值和参数)告诉应用程序已收到消息的套接字描述符。就这样,程序可以有效读取特定客户端发送的消息 ,而无须像轮询那样,做很多无用功 (即无效读取)。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值