跳过正文
  1. 博客/
  2. 后端/
  3. 网络/

Select和epoll浅析

2 分钟· ·
后端 网络
作者
Allen
一个强大、轻量级的 Hugo 主题。
目录

这篇文章是【Tomcat高并发浅析】的姊妹篇,专门通过分析Select和epoll两个框架来介绍如何实现高并发

起因
#

我们知道建立TCP连接之后,就是创建了Socket链接,服务器得监控用户所有的Socket,以防用户发送请求过来

首先最简单就是用个for循环,遍历每个Socket链接看看有没有数据,如果没有就进程休眠一会再来,这个就非常低效,得一直检查一直检查,所以操作系统就开发了一个接口,因为网卡数据是他控制的,首先他让进程睡觉,只要操作系统接受到了网卡数据,根据网卡数据请求的TCP上面的端口找到对应的进程,然后唤醒它,进程就开始遍历每个Socket链接,里面其中一个一定会有数据,因为操作系统已经明确告诉它了

这个就是select框架,这个实现起来特别简单,不需要加很多东西就能实现,但是有个缺点就是,进程醒来之后他不知道哪个socket链接有数据,所以他得遍历所有的,假如有成千上万的Socket链接,那遍历一遍得好久,所以操作系统就限制了最多你可以监控1024个Socket接口,所有假如你使用select作为监控,你只可以同时监听1024个socket,意味着你同时只能和1024个用户建立连接

这样看起来真的太低效了,当然也不是毫无优点,假如你用户少,而且都是活跃用户,这样操作系统叫醒一次你就可以同时处理很多用户了,但是假如你用户很多,那遍历耗费时间也太长了

所以在Linux内核2.4提供了epoll框架,他终于开放自己的事件驱动核心,专门给他写了个函数,首先他用红黑树存贮了所有Socket连接以及他的回调函数,这样当网卡数据来了之后,他直接去回调那个函数了,这样进程不需要遍历了,直接执行函数,当然也有一定的代价,就是存贮这些Socket连接和回调地址,但是相对于的解除了1024的限制,第二直接找到有数据的Socket,读取数据一步到位,具体怎么实现我就不详细讲了,有兴趣的可以去查阅相关资料

总结
#

服务器之所以很轻松的实现上万Socket监控靠的是操作系统的帮助,我们可以理解各种并发都是事件,操作系统就是事件并发高手,所以借助操作系统我们能够很轻松的实现管理看起来非常复杂的事情

相关文章

HTTP复用
10 分钟
后端 网络
从子网到“互联网”
8 分钟
后端 网络
代理的前世今生
5 分钟
后端 网络
大数据架构小结
4 分钟
后端 框架 大数据
TB级数据存贮经验总结
8 分钟
后端 框架 大数据
如何在Ubuntu上发布Scala Jar包到Maven中央仓库
7 分钟
后端 框架 Java