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 相关文章推荐
Php注入点构造代码
Jun 14 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
Mar 26 PHP
php float不四舍五入截取浮点型字符串方法总结
Oct 28 PHP
php实现telnet功能示例
Apr 08 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
Jul 02 PHP
php进行支付宝开发中return_url和notify_url的区别分析
Dec 22 PHP
PHP实现的多维数组排序算法分析
Feb 10 PHP
php-fpm.conf配置文件中文说明详解及重要参数说明
Oct 10 PHP
PHP5中使用mysqli的prepare操作数据库的介绍
Mar 18 PHP
PHP钩子实现方法解析
May 21 PHP
PHP7 错误处理机制修改
Mar 09 PHP
thinkphp 获取控制器及控制器方法
Apr 16 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
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
2008/11/14 PHP
域名和cookie问题(域名后缀)
2012/10/10 PHP
php使用cookie实现记住登录状态
2015/04/27 PHP
php投票系统之增加与删除投票(管理员篇)
2016/07/01 PHP
Laravel框架执行原生SQL语句及使用paginate分页的方法
2018/08/17 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
Javascript技术技巧大全(五)
2007/01/22 Javascript
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
jquery keypress,keyup,onpropertychange键盘事件
2010/06/25 Javascript
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
2011/01/12 Javascript
jquery仿搜索自动联想功能代码
2014/05/23 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
2015/09/12 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
Bootstrap框架安装使用详解
2017/01/21 Javascript
js中的面向对象入门
2017/03/06 Javascript
nodeJS实现路由功能实例代码
2017/06/08 NodeJs
react-intl实现React国际化多语言的方法
2020/09/27 Javascript
python数据结构之二叉树的建立实例
2014/04/29 Python
python连接oracle数据库实例
2014/10/17 Python
使用Python多线程爬虫爬取电影天堂资源
2016/09/23 Python
利用Python如何生成hash值示例详解
2017/12/20 Python
详解Python给照片换底色(蓝底换红底)
2019/03/22 Python
Python爬虫之App爬虫视频下载的实现
2020/12/08 Python
Python 实现二叉查找树的示例代码
2020/12/21 Python
酒店出纳岗位职责
2013/12/29 职场文书
《社戏》教学反思
2014/04/15 职场文书
我们的节日国庆活动方案
2014/08/19 职场文书
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
2015年元旦促销方案书
2014/12/09 职场文书
监守自盗观后感
2015/06/10 职场文书
红白喜事主持词
2015/07/06 职场文书
环保主题班会教案
2015/08/13 职场文书
《思路决定出路》读后感3篇
2019/12/11 职场文书
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
详解nginx location指令
2022/01/18 Servers