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 相关文章推荐
4.与数据库的连接
Oct 09 PHP
PHP IN_ARRAY 函数使用注意事项
Jul 24 PHP
PHP程序员面试 切忌急功近利(更需要注重以后的发展)
Sep 01 PHP
一个PHP验证码类代码分享(已封装成类)
Jul 17 PHP
PHP实现Javascript中的escape及unescape函数代码分享
Feb 10 PHP
Symfony2实现在controller中获取url的方法
Mar 18 PHP
php实现将base64格式图片保存在指定目录的方法
Oct 13 PHP
php微信公众平台交互与接口详解
Nov 28 PHP
thinkPHP5.0框架开发规范简介
Mar 25 PHP
PHP实现用户登录的案例代码
May 10 PHP
PHP pthreads v3下worker和pool的使用方法示例
Feb 21 PHP
gearman中任务的优先级和返回状态实例分析
Feb 27 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中开发XML应用程序之基础篇 添加节点 删除节点 查询节点 查询节
2010/07/09 PHP
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
2017/03/13 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
php数组指针函数功能及用法示例
2020/02/11 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
javascript 事件查询综合 推荐收藏
2010/03/10 Javascript
jquery 元素相对定位代码
2010/10/15 Javascript
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
jquery()函数的三种语法介绍
2013/10/09 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
2015/02/16 Javascript
AngularJS 输入验证详解及实例代码
2016/07/28 Javascript
微信小程序开发之入门实例教程篇
2017/03/07 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
layui 对table中的数据进行转义的实例
2019/09/12 Javascript
浅析vue-router中params和query的区别
2019/12/24 Javascript
vue 中url 链接左边的小图标更改问题
2019/12/30 Javascript
vue npm install 安装某个指定的版本操作
2020/08/11 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
2020/10/29 Javascript
[02:26]DOTA2英雄米拉娜基础教程
2013/11/25 DOTA
基于python的BP神经网络及异或实现过程解析
2019/09/30 Python
Python接口测试get请求过程详解
2020/02/28 Python
超级实用的8个Python列表技巧
2020/08/24 Python
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
C,C++的几个面试题小集
2013/07/13 面试题
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
大一自我鉴定范文
2013/12/27 职场文书
给孩子的新年寄语
2014/04/08 职场文书
借名购房协议书范本
2014/10/06 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
2015新学期开学寄语
2015/02/26 职场文书
2015年五一劳动节演讲稿
2015/03/18 职场文书
淡雅古典唯美少女娇媚宁静迷人写真
2022/03/21 杂记
Python加密与解密模块hashlib与hmac
2022/06/05 Python