浅谈socket同步和异步、阻塞和非阻塞、I/O模型


Posted in PHP onDecember 15, 2016

在进行网络编程时,常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式

同步/异步主要针对C端:

同步:c端发出一个功能调用时,在没有得到结果之前,c端死等结果

例如:普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事

异步:c端一个异步过程调用发出后,调用者不会立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。

例如:ajax请求(异步): 事件触发->服务器处理(浏览器可做其他的)->处理完毕,ajax回调函数处理结果

阻塞/非阻塞主要针对S端:

阻塞(等待):阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回,效率低

<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX))
{
//..处理订单
flock($fp,LOCK_UN);
}
fclose($fp);
?>

非阻塞(立即返回):指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回,效率高,适合高并发

<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX | LOCK_NB))
{
//..处理订单
flock($fp,LOCK_UN);
}
else
{
echo "系统繁忙,请稍后再试";
}
fclose($fp);
?>

同步、异步和阻塞、非阻塞是组合关系,因此有4种方式:

同步阻塞、同步非阻塞、异步阻塞、异步非阻塞

linux有五种I/O模型

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

2)非阻塞I/O (nonblocking I/O)

3)I/O复用(select 和poll) (I/O multiplexing)

4)信号驱动I/O (signal driven I/O (SIGIO))

5)异步I/O (asynchronous I/O (the POSIX aio_functions))

前四种都是同步,只有最后一种才是异步IO

select、poll、epoll 区别总结:

1、单进程最大连接数:

select:单个进程所能打开的最大连接数有FD_SETSIZE宏定义

poll:poll本质上和select没有区别,但是它没有最大连接数的限制,原因是它是基于链表来存储的

epoll:虽然连接数有上限,但是很大,1G内存的机器上可以打开10万左右的连接,2G内存的机器可以打开20万左右的连接

2、文件描述符(FD)剧增后带来的IO效率问题

select:每次调用文件描述符(FD)时都会对连接进行线性遍历,所以随着FD的增加会造成遍历速度慢的"线性下降性能问题"

poll:同上

epoll:根据每个fd上的callback函数来实现的,只有活跃的socket才会主动调用callback,所以在活跃socket较少的情况下,使用epoll没有前面两者的线性下降的性能问题,但是所有socket都很活跃的情况下,可能会有性能问题。

3、 消息传递方式

select:内核需要将消息传递到用户空间,都需要内核拷贝动作

poll:同上

epoll:epoll通过内核和用户空间共享一块内存来实现的。

总结:

综上,在选择select,poll,epoll时要根据具体的使用场合以及这三种方式的自身特点。

1、表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调。

2、select低效是因为每次它都需要轮询。但低效也是相对的,视情况而定,也可通过良好的设计改善

以上这篇浅谈socket同步和异步、阻塞和非阻塞、I/O模型就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP中一个控制字符串输出的函数
Oct 09 PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
Aug 07 PHP
一个基于PDO的数据库操作类
Mar 24 PHP
php设计模式之命令模式的应用详解
May 21 PHP
解析thinkphp import 文件内容变量失效的问题
Jun 20 PHP
使用PHP实现蜘蛛访问日志统计
Jul 05 PHP
检测codeigniter脚本消耗内存情况的方法
Mar 21 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
May 13 PHP
关于laravel模板中生成URL的几种模式总结
Oct 18 PHP
PHP实现笛卡尔积算法的实例讲解
Dec 22 PHP
php的instanceof和判断闭包Closure操作示例
Jan 26 PHP
PHP中echo与print区别点整理
Mar 09 PHP
PHP接口并发测试的方法(推荐)
Dec 15 #PHP
浅谈PHP的反射机制
Dec 15 #PHP
php 三元运算符实例详细介绍
Dec 15 #PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Dec 14 #PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Dec 14 #PHP
Thinkphp 中 distinct 的用法解析
Dec 14 #PHP
PHP 500报错的快速解决方法
Dec 14 #PHP
You might like
php中生成随机密码的自定义函数代码
2013/10/21 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
PHP折半(二分)查找算法实例分析
2018/05/12 PHP
PHP ADODB生成下拉列表框功能示例
2018/05/29 PHP
Apache站点配置SSL强制跳转443
2021/03/09 Servers
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
让人期待的2011年度最佳 jQuery 插件分享
2012/03/16 Javascript
原生javascript兼容性测试实例
2013/07/01 Javascript
jquery实现metro效果示例代码
2013/09/06 Javascript
jQuery实现炫酷的鼠标轨迹特效
2015/02/01 Javascript
JavaScript仿淘宝页面图片滚动加载及刷新回顶部的方法解析
2016/05/24 Javascript
jquery对所有input type=text的控件赋值实现方法
2016/12/02 Javascript
关于Vue.js一些问题和思考学习笔记(1)
2016/12/02 Javascript
JS 调用微信扫一扫功能
2016/12/22 Javascript
原生js实现商品放大镜效果
2017/01/12 Javascript
详解vue-cli + webpack 多页面实例配置优化方法
2017/07/13 Javascript
vue + vuex todolist的实现示例代码
2018/03/09 Javascript
Vue表单类的父子组件数据传递示例
2018/05/03 Javascript
关于TypeScript模块导入的那些事
2018/06/12 Javascript
微信小程序之批量上传并压缩图片的实例代码
2018/07/05 Javascript
JS中appendChild追加子节点无效的解决方法
2018/10/14 Javascript
JavaScript代码简化技巧实例解析
2020/09/09 Javascript
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
Python配置虚拟环境图文步骤
2019/05/20 Python
Tensorflow实现神经网络拟合线性回归
2019/07/19 Python
python3中布局背景颜色代码分析
2020/12/01 Python
CSS3中的Transition过度与Animation动画属性使用要点
2016/05/20 HTML / CSS
不可轻视HTML5!App三年内将被html5顶替彻底消失
2015/11/18 HTML / CSS
boostrap modal 闪现问题的解决方法
2020/09/01 HTML / CSS
请说出几个常用的异常类
2013/01/08 面试题
大学生职业生涯规划书范文
2014/01/14 职场文书
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
活动总结怎么写
2014/04/28 职场文书
企业领导班子四风对照检查材料
2014/09/27 职场文书
万里长城导游词
2015/01/30 职场文书
如何书写你的职业生涯规划书?
2019/06/27 职场文书