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 相关文章推荐
用函数读出数据表内容放入二维数组
Oct 09 PHP
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
Sep 02 PHP
开源SNS系统-ThinkSNS
May 18 PHP
基于PHP常用函数的用法详解
May 10 PHP
探讨如何把session存入数据库
Jun 07 PHP
PHP中的output_buffering详细介绍
Sep 27 PHP
用 Composer构建自己的 PHP 框架之基础准备
Oct 30 PHP
CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录
Mar 25 PHP
php解析字符串里所有URL地址的方法
Apr 03 PHP
4种PHP异步执行的常用方式
Dec 24 PHP
浅谈PHP中的
Apr 23 PHP
PHP简单获取多个checkbox值的方法
Jun 13 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
一个取得文件扩展名的函数
2006/10/09 PHP
PHP中将ip地址转成十进制数的两种实用方法
2013/08/15 PHP
PHP中比较时间大小实例
2014/08/21 PHP
jquery动态添加元素事件失效问题解决方法
2014/05/23 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
基于javascript实现单选及多选的向右和向左移动实例
2015/07/25 Javascript
javascript实现拖动元素交换位置
2015/11/29 Javascript
JS使用JSON作为参数实例分析
2016/06/23 Javascript
Vue表单验证插件的制作过程
2017/04/01 Javascript
微信小程序后台解密用户数据实例详解
2017/06/28 Javascript
微信小程序 自定义消息提示框
2017/08/06 Javascript
Vue+ElementUI实现表单动态渲染、可视化配置的方法
2018/03/07 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
2019/09/14 Javascript
微信小程序错误this.setData报错及解决过程
2019/09/18 Javascript
基于VSCode调试网页JavaScript代码过程详解
2020/07/20 Javascript
JavaScript实现跟随鼠标移动的盒子
2021/01/28 Javascript
[02:44]DOTA2英雄基础教程 克林克兹
2014/01/15 DOTA
Python 函数基础知识汇总
2018/03/09 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
2018/06/20 Python
Python中GIL的使用详解
2018/10/03 Python
Python的形参和实参使用方式
2019/12/24 Python
Python读入mnist二进制图像文件并显示实例
2020/04/24 Python
CSS3条纹背景制作的实战攻略
2016/05/31 HTML / CSS
印度尼西亚最大和最全面的网络商城:Blibli.com
2017/10/04 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
活动总结报告范文
2014/05/04 职场文书
大学生实习证明范文(5篇)
2014/09/18 职场文书
2015年六一儿童节演讲稿
2015/03/19 职场文书
业务员年终工作总结2015
2015/05/28 职场文书
学雷锋广播稿大全
2015/08/19 职场文书
市语委办2016年第十九届“推普周”活动总结
2016/04/05 职场文书
Python借助with语句实现代码段只执行有限次
2022/03/23 Python
Golang 链表的学习和使用
2022/04/19 Golang