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

Select和epoll浅析

·2 分钟· ·
后端 网络
目录

这篇文章是【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 分钟
后端 网络
曾经有人问过我一个问题什么是TCP复用,我当时没有回答上来,后面我又遇到一些并发性能问题的时候,我才开始慢慢明白为什么会有这个问题,以及这个问题背后的秘密
从子网到“互联网”
·8 分钟
后端 网络
引言 # 最近重温《TCP/IP协议簇》,读到子网这个部分,概念都能弄懂,但是不明白子网存在的目的,很多资料都说有两个好处,一是能够判断IP存在局域网还是远程网,另外一个将大的网段分成多个小子网。
代理的前世今生
·5 分钟
后端 网络
引言 # 自己对代理认识不深,也只是会使用而已,由于最近想做一个代理池,于是查了很多资料,发现代理这个东西还是非常有趣的
大数据架构小结
·4 分钟
后端 框架 大数据
首先说说什么是大数据,最简单用数据量为单位,大于1亿就算大的,因为小于1亿就在数据库做就可以了,所以大数据是公司数据大到数据库处理不了的时候才要考虑的事情,小公司MySQL优化一下索引就可以了
TB级数据存贮经验总结
·8 分钟
后端 框架 大数据
项目背景 这个项目是深圳一家证卷公司一个TB级日志离线导入项目,当数据达到10T左右的时候,他们的存贮架构以及检索系统直接奔溃,在朋友的推荐下,我负责对这个项目进行整体的重构以及优化,对于我一个大数据新手来说这是一个挑战也是一个学习的机会,最终幸不辱命最终完成了系统的优化,由原来的48小时导入优化至7个小时,并且提供亚秒级的查询检索,下面就是我对这个项目的总结
如何在Ubuntu上发布Scala Jar包到Maven中央仓库
·7 分钟
后端 框架 Java
由于网上的教程大多数是Windows下的,而且都是介绍怎么打包Java的Jar包,关于Scala相关的比较少,因此我踩了不少坑才成功的把包发布到Maven中央仓库,你们可以才中央仓库里面搜到我的包