io多路复用的原理和实现_IO多路复用的三种机制:select 、poll 、epoll
目录
- 概述
- IO多路复用本质
- IO多路复用的优势
- IO多路复用Select机制
- IO多路复用Poll机制
- IO多路复用Epoll机制
- select,poll,epoll机制区别总结
- php7进阶到架构师相关阅读
概述
这是关于php进阶到架构之后端开发必备学习的第三篇文章:IO多路复用的三种机制:select 、poll 、epoll
- 第一篇:理解TCP/IP与UDP协议、Socket的正确姿势
- 第二篇:一文搞懂进程,线程,CPU核心数,时间片轮转机制
- 第三篇:IO多路复用的三种机制:select 、poll 、epoll
IO多路复用本质
检测多个文件描述符是否有变化 。
让单个进程可以监视多个文件描述符,
一旦某个描述符就绪(一般是读就绪或写就绪),
能够通知程序进行相应的读写操作
select,poll,epoll都是IO多路复用的机制。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的
IO多路复用的优势
与多进程和多线程技术相比,
I/O多路复用技术的最大优势是系统开销小,
系统不必创建进程/线程,
也不必维护这些进程/线程,
从而大大减小了系统的开销。
在介绍select、poll、epoll之前,首先介绍一下Linux操作系统中基础的概念:
用户空间 / 内核空间
操作系统的核心是内核,
独立于普通的应用程序,
可以访问受保护的内存空间,
也有访问底层硬件设备的所有权限。
为了保证用户进程(如qq,新浪等进程)不能直接操作内核(kernel),保证内核的安全,
操作系统将虚拟空间划分为两部分,
一部分为内核空间,
一部分为用户空间。
进程切换
为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。
任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的,并且进程切换是非常耗费资源的。
进程阻塞
正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,则由系统自动执行阻塞原语(Block),使进程由运行状态变为阻塞状态
只有处于运行态的进程(获得了CPU资源),才可能将其转为阻塞状态。
当进程进入阻塞状态,是不占用CPU资源的。
文件描述符
文件描述符(File descriptor),是一个用于表述指向文件的引用的抽象化概念。
文件描述符在形式上是一个非负整数。
实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。
当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。
在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。
但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。
IO多路复用Select机制
select机制中提供一种fd_set的数据结构,实际上是一个long类型的数组。
每一个数组元素都能与一打开的文件句柄建立联系,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一Socket或文件可读。
select机制的问题
1.每次调用select,都需要把fd_set集合从用户态拷贝到内核态,如果fd_set集合很大时,那这个开销也很大
2.同时每次调用select都需要在内核遍历传递进来的所有fd_set,如果fd_set集合很大时,那这个开销也很大
3.为了减少数据拷贝带来的性能损坏,内核对被监控的fd_set集合大小做了限制,并且这个是通过宏控制的,大小不可改变(限制为1024)
IO多路复用Poll机制
poll改变了文件描述符集合的描述方式,
使用了pollfd结构而不是select的fd_set结构,
使得poll支持的文件描述符集合限制远大于select的1024
poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。
也就是说,poll只解决了上面select的问题3,并没有解决问题1,2的性能开销问题。
IO多路复用Epoll机制
epoll在Linux2.6内核正式提出,是基于事件驱动的I/O方式。
相对于select来说,epoll没有描述符个数限制,使用一个文件描述符管理多个描述符,将用户关心的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。
epoll是Linux内核为处理大批量文件描述符而作了改进的poll,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。
select,poll,epoll机制区别总结
epoll是Linux目前大规模网络并发程序开发的首选模型。在绝大多数情况下性能远超select和poll。
既然如此,为何select,poll,epoll同时存在呢?那是因为它们也是不同历史时期的产物。
1984,在BSD实现select
1997,实现了poll
2002, 大神 Davide Libenzi 实现了epoll
php7进阶到架构师相关阅读
https://www.kancloud.cn/gofor/gofor
最后,欢迎大家留言补充,讨论~~~
io多路复用的原理和实现_IO多路复用的三种机制:select 、poll 、epoll相关推荐
- IO多路复用的三种机制Select,Poll,Epoll
目录 1. IO多路复用 2.操作系统基础概念 3.Select 4.Poll 5.Epoll 6.总结 1. IO多路复用 I/O多路复用(multiplexing)的本质是通过一种机制(系统内核缓 ...
- io多路复用的原理和实现_IO多路复用机制详解
select,poll,epoll机制区别总结: 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞I ...
- poll函数_如何理解IO多路复用的三种机制Select,Poll,Epoll?
专注分享Linux后台服务器开发,包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TC ...
- 【C/C++服务器开发】文件,文件描述符,I/O多路复用,select / poll / epoll 详解
文章目录 一.前言 1.文件的概念 2.文件描述符和文件指针 文件描述符 文件描述符和文件指针的区别 文件描述符太多了怎么办 二.I/O多路复用 1.I/O多路复用的由来 不要打电话给我,有需要我会打 ...
- java nio原理 epoll_多路复用 Select Poll Epoll 的实现原理(BIO与NIO)
BIO blocking阻塞的意思,当我们在后端开发使用的时候,accetp 事件会阻塞主线程. 当accept事件执行的时候,客户的会和服务建立一个socket 连接.一般后端就会开启一个线程执行后 ...
- python3 异步 非阻塞 IO多路复用 select poll epoll 使用
有许多封装好的异步非阻塞IO多路复用框架,底层在linux基于最新的epoll实现,为了更好的使用,了解其底层原理还是有必要的. 下面记录下分别基于Select/Poll/Epoll的echo ser ...
- select poll epoll IO操作多路复用及猴子补丁
一:select(能监控数量有限,不能告诉用户程序具体那个连接有数据) select目前几乎所有的平台都支持,其良好的跨平台支持也是一个优点 select的缺点在于单个进程能够监控的文件描述的数量存在 ...
- Python异步非阻塞IO多路复用Select/Poll/Epoll使用
来源:http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架,底层在linux基于最新的epoll实现,为了更好的使用,了解其底层原理 ...
- IO多路复用select/poll/epoll详解以及在Python中的应用
IO multiplexing(IO多路复用) IO多路复用,有些地方称之为event driven IO(事件驱动IO). 它的好处在于单个进程可以处理多个网络IO请求.select/epoll这两 ...
最新文章
- 中国电子学会图形化四级编程题:绳子算法
- BCH的压力测试其实已经开始了
- web.xml中web-app标签报错
- [SAP ABAP开发技术总结]动态语句、动态程序
- os7.4 java环境安装_CentOS7.0安装Scala和sun jdk的方法
- leetcode 135. 分发糖果
- Java 将文件的内容复制到另一个文件
- idea高效找出全部未被使用的代码
- 读取浏览器cookies的python脚本
- php array函数 array_sum 求数组所有值和
- 缠中说禅重新编排版《论语》(整理版)
- 爆强的一句话,工作之余放松放松!
- journalctl命令
- 51单片机红外遥控小车
- magic2410支持大容量sdhc卡解决办法
- ansys的kbc_ANSYS APDL 应用技巧
- 笔记本(win10、win7)开机在LOGO过后出现闪屏几下才进入系统成功解决问题步骤分享
- 西门子博图指令——Array数据中元素的写入
- 降本提效!注册中心在蚂蚁集团的蜕变之路
- 如何安装wordcloud?
热门文章
- Angular应用i18n - internationalization翻译的实现单步调试
- SAP UI的加载动画效果和幽灵设计(Ghost Design)
- nz-input-group is not a known element的解决方法
- 微信开发系列之五 - 将SAP UI5应用嵌入到微信中
- Eclipse Server runtime设置里找不到apache tomcat的处理方法
- SAP Hybris安装包里自带的Maven和Gradle
- 使用SAP Analytics Cloud显示全球新冠肺炎确诊人数和发展趋势的预测
- SAP CRM webclient ui开发workbench里点了Test按钮,发生了什么事
- Netweaver的端口号和Spring boot内嵌的Tomcat端口
- SAP CRM后台取数据逻辑的性能优化