网络编程:谈到select、poll、epoll该如何说

IO多路复用在面试中是常考的题,一直只知道其概念不知如何去表达

select

io多路复用主要是为了解决对服务需要多开进程或者线程,从而造成资源浪费的问题,通过多路复用就很好解决了一个进程可以同时对多个客户请求进行服务,那么其中select作为三个之中跨平台性能最好的复用io,连接的数量却有上限,其中32位机中,最高连接数只能达到1024连接,在64位机中可达到2048连接,连接数不高却很有效,而且其内部底层结构是通过位图实现的,每一个位代表一个连接,对待这么多的连接采用的是线性扫描,通过轮询机制对每一个连接进行询问是否准备好了,而每次资源的拷贝是从用户态到内核态的转变,因为将其丢入内核态由操作系统进行操作最是方便,正因如此,select消耗的资源比较大,相比之下,epoll就提高了效率,因为epoll是通过映射的方式进行资源的拷贝,mmap的映射减少了一次拷贝,提高了性能

poll

poll的话相比于select有所提升,是因为其底层由select的底层数组升级为了链表没有了连接上限,但是同样的,poll和select一样是使用轮询机制,不过为了解决select资源消耗过大的问题,在轮询机制上有所改变,select是不间断轮询,直到有线程发出请求,而poll轮询所有服务,如果没有响应则挂起,大大减少了资源的消耗

epoll

epoll作为poll的升级版,增加的功能就很丰富,除了映射减少了资源的消耗,同时也有连接无上限,同时底层也加增了红黑树结构,加快了查找的速度,提高了运行的效率,在监听服务响应也不是通过轮询了,而是通过callback回滚查看那个程序服务被唤醒了,每次加入服务时,将服务往队列一挂用户态到内核态的拷贝也仅仅一次,大大提高了效率,同时对每次程序都有水平触发和边缘触发,水平触发主要是每次变化都会发送提示,而边缘触发仅仅在设定的界限才会达到触发。但是这个这么好,依旧有很多时候用到select,就是其跨平台性不够优秀使用过于复杂,而在开发过程中,跨平台也是选择多路复用模型的一个很重要的条件

以上仅代表个人观点,有问题欢迎一起探讨

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值