这里以socket文件来阐述它们之间的区别,假设现在服务器端有100 000个连接,即已经创建了100 000个socket。

1 select和poll

在我们的线程中,我们会弄一个死循环,在循环里面不断的进行select()。这个select()进入操作系统层面,会主动去调用每个socket文件的poll()函数,主动去询问是否有数据来了,然后返回所有数据ready的socket。也就是说,进行一次select(),它需要进行10 000次的询问。select和poll都是这样的。

2 epoll

在我们的线程中,我们也会弄一个死循环,在循环中不断的进行epoll_wait()。在这个epoll_wait()这个调用层级里面,直接去查看ready list里面是否有socket是ready的,如果有的话直接将这个list返回给用户空间,这个操作几乎是实时的。

那么这个ready list是怎么来的呢?

关键的思想很简单,将自己放入socket的wait queue中,一旦有数据来了,就会把它放入ready list中。

3 select/poll和epoll的主要区别

前者是无状态的,也就是说,内核并不保存所监视的文件的读写状态,当用户空间需要知道这些状态时,会调用内核的接口去现场查找。而后者是有状态的,后者在内核中弄了一个ready list,当有socket文件有数据时,就会自动加入到该ready list中,ready list中记录了所监视的文件的状态,这样,当用户空间想要知道这些状态时,直接查看就可以了,不需要再现场查找了。

最新文章

  1. 经验分享:CSS浮动(float,clear)通俗讲解
  2. [转]优秀Python学习资源收集汇总
  3. Linux下的split 命令(将一个大文件根据行数平均分成若干个小文件)
  4. 20145218 《Java程序设计》第7周学习总结
  5. 《Play for Java》学习笔记(七)数据类型解析——Body parser
  6. ios协议调起app
  7. ie6调试工具Debugbar
  8. shell 检测ip的合法性与检测网络掩码的合法性
  9. 开发设计模式(九)门面模式(Facade Pattern)
  10. 解决Access restriction问题
  11. JavaScript获取某年某月的最后一天
  12. 学习ExtjsForVs(第一个案例HelloWord)
  13. iOS https plist
  14. 其他信息: ORA-01400: 无法将 NULL 插入
  15. HTML基础下
  16. 项目部署、配置、查错常用到的Linux命令
  17. (十六)qt-udp,组播
  18. hibernate写list到mysql
  19. Error: Program type already present: com.google.gson.FieldAttributes 的解决方法
  20. jquery for&&each的用法

热门文章

  1. IIS更改根目录
  2. BZOJ4873 LuoguP3749 寿司餐厅
  3. 零基础入门学习Python(34)--丰富的else语句及简洁的with语句
  4. 23Spring使用JdbcTemplate和JdbcDaoSupport
  5. C++标准模板库 ——堆栈使用
  6. git详细说明
  7. 九度oj 题目1064:反序数
  8. 编程数学(A-1)-(B-1)-一个数的负次方怎么算
  9. MYSQL Sorting result 把队列堆满了,该怎么办?
  10. [luoguP1489] 猫狗大战(DP)