使用select/poll模型假设一台服务器需要支持100w的并发连接,在_FD_SETSIZE为1024时,则至少需要1k个进程

除了进程间的上下文切换的时间消耗外,从内核/用户空间,大量的无脑内存拷贝、数组轮询,是系统难以承受的。

epoll的呢,它没有单进程文件描述符限制,100w个客户端同时与一个服务器进程保持连接,而每一时刻,通常只有几百上千个TCP连接是活跃的

select/poll时,服务器进程每次都把100w个连接告诉操作系统(从用户态复制句柄数据结构到内核态),让操作系统去轮询是否有就绪事件发生

轮询完后,再将句柄数据复制到用户态,让服务器应用程序轮询处理已发生的事件,这一个过程消耗资源较大,因此,select/poll一般只能处理

几千的并发连接

epoll的设计和实现与select完全不同。epoll通过在Linux内核中申请一个简易的文件系统(文件系统一般用什么数据结构实现?B+树)。把原先的select/poll调用分成了3个部分:

1)调用epoll_create()建立一个epoll对象(在epoll文件系统中为这个句柄对象分配资源)

2)调用epoll_ctl向epoll对象中添加这100万个连接的套接字

3)调用epoll_wait收集发生的事件的连接

如此一来,要实现上面说是的场景,只需要在进程启动时建立一个epoll对象,然后在需要的时候向这个epoll对象中添加或者删除连接。同时,epoll_wait的效率也非常高,

因为调用epoll_wait时,并没有一股脑的向操作系统复制这100万个连接的句柄数据,内核也不需要去遍历全部的连接。

所有添加到epoll中的事件都会与设备(网卡)驱动程序建立回调关系,也就是说,当相应的事件发生时会调用这个回调方法。这个回调方法在内核中叫ep_poll_callback,它会将发生的事件添加到rdlist双链表中

epoll的数据结构中,有一个rdlist,是系统发现的有事件的连接组成的双向链表,当应用程序调用epoll.wait时,内核会把发生的事件复制到用户态,同时

将事件数量返回给用户

内核态,linux系统最高权限,用户态,一般是最低权限,那么应用程序想调用一些高权限才能访问的设备时,需要切换到内核态,由内核去完成

用户态切换到内核态时,一般会伴随一些参数,传递给内核

参考博文:https://blog.csdn.net/davidsguo008/article/details/73556811

最新文章

  1. jQuery简单入门(四)
  2. (转)PhoneGap工作原理及需改进的地方
  3. git .gitignore 文件 解决二进制文件冲突问题
  4. ERROR 1130: Host 'root@localhost' is not allowed to connect to MySQL server
  5. linux文件系统---10
  6. localStorage的跨与实现方案
  7. C#常用語法糖(Csharp Syntactic sugar)
  8. .Net缓存
  9. BZOJ 1483: [HNOI2009]梦幻布丁( 链表 + 启发式合并 )
  10. ngnix配置文件
  11. mongodb的NUMA问题
  12. nginx代理天地图做缓存解决跨域问题
  13. oracle 安装介绍
  14. Java 之 Web前端(二)
  15. Linux系统安全之pam后门安装使用详解
  16. gulp-px2rem-plugin 插件的一个小bug
  17. MySQL中的文件
  18. 学JS的心路历程-闭包closure
  19. 安装 xcode 5.1.1
  20. 资源 | 源自斯坦福CS229,机器学习备忘录在集结

热门文章

  1. C# winform 打包成安装程序(exe)
  2. 趣图:当我修复一个隐藏Bug之后
  3. 趣图:我说自己菜 vs 大佬说自己菜
  4. springboot实现防重复提交和防重复点击
  5. GTA5整合版
  6. python3 读取写入excel操作-win32com
  7. 再解决不了前端加密我就吃shi
  8. 01 C语言基本介绍
  9. C++读写ini配置文件GetPrivateProfileString()&WritePrivateProfileString()
  10. 【LGR-070】洛谷 3 月月赛-官方题解