浅谈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 相关文章推荐
Windows IIS PHP 5.2 安装与配置方法
Jun 08 PHP
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
Apr 15 PHP
PHP 图片水印类代码
Aug 27 PHP
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
Sep 30 PHP
PHP中常用的转义函数
Feb 28 PHP
使用PHP函数scandir排除特定目录
Jun 12 PHP
Win7下手动安装apache2.2、php5.4笔记
Apr 03 PHP
浅谈PHP中的面向对象OOP中的魔术方法
Jun 12 PHP
Yii2.0多文件上传实例说明
Jul 24 PHP
关于Laravel-admin的基础用法总结和自定义model详解
Oct 08 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
Nov 23 PHP
解决Laravel使用验证时跳转到首页的问题
Nov 17 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中getservbyport与getservbyname函数用法实例
2014/11/18 PHP
PHP crypt()函数的用法讲解
2019/02/15 PHP
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
node.js中的http.createClient方法使用说明
2014/12/15 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
JavaScript实现向右伸出的多级网页菜单效果
2015/08/25 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
2015/12/10 Javascript
AngularJS中的指令全面解析(必看)
2016/05/20 Javascript
基于jQuery实现表格的排序
2016/12/02 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
jQuery操作css样式
2017/05/15 jQuery
JS沙箱模式实例分析
2017/09/04 Javascript
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
vuejs 制作背景淡入淡出切换动画的实例
2018/09/01 Javascript
浅谈layui里的上传控件问题
2019/09/26 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
2019/12/07 Javascript
[02:07]DOTA2超级联赛专访BBC:难忘网吧超神经历
2013/06/09 DOTA
python检查序列seq是否含有aset中项的方法
2015/06/30 Python
利用Python脚本生成sitemap.xml的实现方法
2017/01/31 Python
Python实现基于二叉树存储结构的堆排序算法示例
2017/12/08 Python
pandas把dataframe转成Series,改变列中值的类型方法
2018/04/10 Python
Python实现一个带权无回置随机抽选函数的方法
2019/07/24 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
KIKO MILANO西班牙官网:意大利领先的化妆品和护肤品品牌
2019/05/03 全球购物
化学实验员岗位职责
2013/12/28 职场文书
九年级政治教学反思
2014/02/06 职场文书
幼儿园教学随笔感言
2014/02/23 职场文书
合伙经营协议书范本
2014/04/18 职场文书
城管综合整治方案
2014/05/01 职场文书
2014年保卫部工作总结
2014/11/21 职场文书
文化大革命观后感
2015/06/17 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
原生JS实现飞机大战小游戏
2021/06/09 Javascript
Spring IOC容器Bean的作用域及生命周期实例
2022/05/30 Java/Android