PHP7中I/O模型内核剖析详解


Posted in PHP onApril 14, 2019

1.同步:我客户端(C端调用者)一个功能,该功能没有结束前,我死等结果。
2.异步:我(c端调用者)调用一个功能,不知道该功能结果,该功能有结果后通知我,即回调通知

3.阻塞:就是调用我(s端被调用者,函数),我(s端被调用者,函数)没有完全接受完数据或者没有得到结果之前,我不会返回。

4.非阻塞:就是调用我(s端被调用者,函数),我(s端被调用者,函数)立即返回,得出结果后通知调用者

五种I/O模型

(1) 阻塞I/O (Blocking I/O)

PHP7中I/O模型内核剖析详解

当用户进程进行系统调用时,内核就开始了I/O的第一个阶段,准备数据到缓冲区中,当数据都准备完成后,则将数据从内核缓冲区中拷贝到用户进程的内存中,这时用户进程才解除block的状态重新运行。

(2) 非阻塞I/O (Non-Blocking I/O)

PHP7中I/O模型内核剖析详解

用户进程只有在第二个阶段被阻塞了,而第一个阶段没有阻塞,但是在第一个阶段中,用户进程不需要盲等,不停的去轮询内核,看数据是否准备好了,因此该模型是比较消耗CPU的。

(3) I/O复用(I/O Multiplexing)

PHP7中I/O模型内核剖析详解

I/O执行的两个阶段都是用户进程都是阻塞的,但是两个阶段是独立的,在一次完整的I/O操作中,该用户进程是发起了两次系统调用。和阻塞I/O不同的是第一段可以等待多个描述符就绪

(4) 信号驱动的I/O (Signal Driven I/O)

PHP7中I/O模型内核剖析详解

只有在I/O执行的第二阶段阻塞了用户进程,而在第一阶段是没有阻塞的。该模型在I/O执行的第一阶段,当数据准备完成之后,会主动的通知用户进程数据已经准备完成,即对用户进程做一个回调。该通知分为两种,一为水平触发,即如果用户进程不响应则会一直发送通知,二为边缘触发,即只通知一次。

(5) 异步I/O (Asynchrnous I/O)

PHP7中I/O模型内核剖析详解

当用户进程发起系统调用后,立刻就可以开始去做其它的事情,然后直到I/O执行的两个阶段都完成之后,内核会给用户进程发送通知,告诉用户进程操作已经完成了。

I/O多路复用技术

select

(1).select()的机制中提供一fd_set的数据结构,每一个元素都能与一打开的文件句柄(不管是Socket句柄,还是其他 文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成, 当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一Socket或文件可读或可写。主要用于Socket通信当中。

(2).程序执行select后,如果没有数据输入,程序会一直等待(阻塞时),直到有数据为止,也就是程序中无需循环和sleep。

(3).每次调用select,都需要把fd_set集合从用户态拷贝到内核态,这个开销在fd_set很多时会很大

(4).同时每次调用select都需要在内核遍历传递进来的所有fd_set,这个开销在fd_set很多时也很大

(5).select支持的文件描述符数量太小了,默认是1024

poll

(1).poll的实现和select非常相似,只是描述fd_set集合的方式不同,poll使用pollfd链表结构而不是select的fd_set结构,其他的都差不多。

(2).监视描述符个数无上限;

epoll/kqueue

(1).监视描述符个数无上限;

(2).效率提升,不是轮询的方式,不会随着fd数目的增加效率下降。只有活跃可用的fd才会调用callback函数;即epoll/kqueue最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,epoll/kqueue的效率就会远远高于select和poll。

(3).内存拷贝,利用mmap()文件映射内存加速与内核空间的消息传递;

PHP 相关文章推荐
CMS中PHP判断系统是否已经安装的方法示例
Jul 26 PHP
php结合js实现点击超链接执行删除确认操作
Oct 31 PHP
php文档工具PHP Documentor安装与使用方法
Jan 25 PHP
PHP实现根据时间戳获取周几的方法
Feb 26 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
Jul 01 PHP
完美解决在ThinkPHP控制器中命名空间的问题
May 05 PHP
PHP 实现浏览记录并按日期分组
May 11 PHP
php静态成员方法和静态的成员属性的使用方法
Oct 26 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
Dec 13 PHP
postman的安装与使用方法(模拟Get和Post请求)
Aug 06 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
Mar 30 PHP
PHP dirname(__FILE__)原理及用法解析
Oct 28 PHP
浅析PHP7的多进程及实例源码
Apr 14 #PHP
什么是PHP7中的孤儿进程与僵尸进程
Apr 14 #PHP
php intval函数用法总结
Apr 14 #PHP
PHP中上传文件打印错误错误类型分析
Apr 14 #PHP
PHP扩展Swoole实现实时异步任务队列示例
Apr 13 #PHP
php+ajax实现商品对比功能示例
Apr 13 #PHP
PHP开发的文字水印,缩略图,图片水印实现类与用法示例
Apr 12 #PHP
You might like
人族 TERRAN 概述
2020/03/14 星际争霸
php文本转图片自动换行的方法
2013/03/13 PHP
php教程之phpize使用方法
2014/02/12 PHP
php构造函数与析构函数
2016/04/23 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
用box固定长宽实现图片自动轮播js代码
2014/06/09 Javascript
javascript定义类和类的实现实例详解
2015/12/01 Javascript
JavaScript的removeChild()函数用法详解
2015/12/27 Javascript
理解javascript对象继承
2016/04/17 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
Javascript 判断两个IP是否在同一网段实例代码
2016/11/28 Javascript
vue.js+Element实现表格里的增删改查
2017/01/18 Javascript
javascript九宫格图片随机打乱位置的实现方法
2017/03/15 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
nodejs多版本管理总结
2018/04/03 NodeJs
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
vue从后台渲染文章列表以及根据id跳转文章详情详解
2020/12/14 Vue.js
Python实现获取操作系统版本信息方法
2015/04/08 Python
Python的字典和列表的使用中一些需要注意的地方
2015/04/24 Python
Python实现的破解字符串找茬游戏算法示例
2017/09/25 Python
Python实现输出某区间范围内全部素数的方法
2018/05/02 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
2019/02/21 Python
Python3匿名函数lambda介绍与使用示例
2019/05/18 Python
python判断正负数方式
2020/06/03 Python
python如何查看网页代码
2020/06/07 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
2020/09/03 Python
HTML5里autofocus自动聚焦属性使用介绍
2016/06/22 HTML / CSS
优质飞蝇钓和渔具:RiverBum
2020/05/10 全球购物
销售人员求职的自我评价分享
2014/03/15 职场文书
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
离职感谢信怎么写
2015/01/22 职场文书
志愿者工作心得体会
2016/01/15 职场文书
nginx location 带斜杠【 / 】与不带的区别
2022/04/13 Servers
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android