浅谈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 相关文章推荐
玩转图像函数库―常见图形操作
Sep 03 PHP
PHP 得到根目录的 __FILE__ 常量
Jul 23 PHP
php获取后台Job管理的实现代码
Jun 10 PHP
php之XML转数组函数的详解
Jun 07 PHP
解析php中两种缩放图片的函数,为图片添加水印
Jun 14 PHP
yii操作session实例简介
Jul 31 PHP
PHP递归创建多级目录
Nov 05 PHP
php封装一个异常的处理类
Jun 08 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
May 28 PHP
微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解
Apr 10 PHP
PHP pthreads v3下worker和pool的使用方法示例
Feb 21 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
May 02 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
实现树状结构的两种方法
2006/10/09 PHP
PHP面向对象分析设计的经验原则
2008/09/20 PHP
PHP 事务处理数据实现代码
2010/05/13 PHP
使用迭代器 遍历文件信息的详解
2013/06/08 PHP
PHP中数据类型转换的三种方式
2015/04/02 PHP
[原创]php简单隔行变色功能实现代码
2016/07/09 PHP
javascript网页关键字高亮代码
2008/07/30 Javascript
javascript 触发事件列表 比较不错
2009/09/03 Javascript
JS TextArea字符串长度限制代码集合
2012/10/31 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
2015/06/29 Javascript
基于Jquery和html5实现炫酷的3D焦点图动画
2016/03/02 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
2016/05/26 Javascript
Angularjs的$http异步删除数据详解及实例
2017/07/27 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
简单实现jquery隔行变色
2017/11/09 jQuery
vue中如何实现后台管理系统的权限控制的方法步骤
2019/09/05 Javascript
浅谈TypeScript的类型保护机制
2020/02/23 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
原生JS实现相邻月份日历
2020/10/13 Javascript
[01:26]神话结束了,却也刚刚开始——DOTA2新英雄玛尔斯驾临战场
2019/03/10 DOTA
Python itertools模块详解
2015/05/09 Python
Python中转换角度为弧度的radians()方法
2015/05/18 Python
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
浅谈python requests 的put, post 请求参数的问题
2019/01/02 Python
python读取文件名并改名字的实例
2019/01/07 Python
Python异常处理知识点总结
2019/02/18 Python
Python实现滑动平均(Moving Average)的例子
2019/08/24 Python
解析Python 偏函数用法全方位实现
2020/06/26 Python
美国知名奢侈美容品牌零售商:Cos Bar
2017/04/21 全球购物
如何打开WebSphere远程debug
2014/10/10 面试题
评析教师个人的自我评价
2014/02/19 职场文书
作风年建设汇报材料
2014/08/14 职场文书
离婚协议书范本2014
2014/10/27 职场文书
2015年公司新年寄语
2014/12/08 职场文书
CSS3实现的3D隧道效果
2021/04/27 HTML / CSS