搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > CPP开发之家 > linux基础编程—select、poll、epoll

linux基础编程—select、poll、epoll

CPP开发之家 2017-10-31

工作中经常会被别人问到select、poll、epoll三个的区别是什么,下面讲对此做一个介绍和说明。具体如下:

1、select 和poll实现颇为相似,调用过程中都会做以下操作:(1)将用户态拷贝到内核态 (2)都会遍历fd_set遍历完成时如果没有可以读写的句柄,则会调用schedule_timeout进行睡眠。如果设备可读写时,则会唤醒睡眠的进程继续处理;如果达到超时时间还没有可读写,则会再次获得CPU资源,对fd_set进行重新遍历,判断是否有可读写的fd。(3)完成后,在由内核态拷贝到用户态;(4)有句柄数限制


2、epoll时为了解决select和poll存在的问题而诞生的。不同于select和poll的是,epoll提供了三个接口,分别是:epoll_creat(创建一个句柄),epoll_ctrl(监控)和epoll_wait(等待)。解决的问题主要有:(1)保证每个fd只会被拷贝一次。接受到新的注册事件时,epoll在ctrl接口成就完成了拷贝,不会在wait时进行重复拷贝(2)在epoll_ctl时把current流加载到设备等待队列并为每个fd指定一个回调函数,当设备就绪,唤醒等待队列上的等待者时,就会调用这个回调函数,而这个回调函数会把就绪的fd加入一个就绪链表)。epoll_wait的工作实际上就是在这个就绪链表中查看有没有就绪的fd。不会像select一样每次都进行重新加载。(3)epoll理论上来说没有打开句柄数目的限制。

参考:

http://www.cnblogs.com/Anker/p/3265058.html

版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《linux基础编程—select、poll、epoll》的版权归原作者「开发者VIP」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注开发者VIP微信公众号

开发者VIP微信公众号:mlxmpublic

开发者VIP

手机扫描上方二维码即可关注开发者VIP微信公众号

开发者VIP最新文章

精品公众号随机推荐

上一篇 >>

Netty笔记(一)