浅谈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调用三种数据库的方法(2)
Oct 09 PHP
php strstr查找字符串中是否包含某些字符的查找函数
Jun 03 PHP
PHP 计算代码执行耗时的代码修正网上普遍错误
May 14 PHP
关于IIS php调用com组件的权限问题
Jan 11 PHP
使用PHP会话(Session)实现用户登陆功能
Jun 29 PHP
php导出word文档与excel电子表格的简单示例代码
Mar 08 PHP
PHP统一页面编码避免乱码问题
Apr 09 PHP
详解HTTP Cookie状态管理机制
Jan 14 PHP
tp5 实现列表数据根据状态排序
Oct 18 PHP
详解no input file specified 三种解决方法
Nov 29 PHP
php下的原生ajax请求用法实例分析
Feb 28 PHP
tp5.1 框架join方法用法实例分析
May 26 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 for 循环语句使用方法详细说明
2010/05/09 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
2020/07/19 PHP
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
2009/02/18 Javascript
基于jquery的无限级联下拉框js插件
2011/10/29 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
node.js中的fs.realpath方法使用说明
2014/12/16 Javascript
javascript定义变量时加var与不加var的区别
2014/12/22 Javascript
JavaScript学习笔记之JS对象
2015/01/22 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
2015/01/28 Javascript
jQuery提示插件alertify使用指南
2015/04/21 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
jquery实现限制textarea输入字数的方法
2017/09/06 jQuery
vue proxyTable 接口跨域请求调试的示例
2017/09/12 Javascript
vue cli使用绝对路径引用图片问题的解决
2017/12/06 Javascript
利用vue.js实现被选中状态的改变方法
2018/02/08 Javascript
解决vue处理axios post请求传参的问题
2018/03/05 Javascript
vuex实现的简单购物车功能示例
2019/02/13 Javascript
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
2019/12/23 Javascript
[15:23]教你分分钟做大人:虚空假面
2014/10/30 DOTA
[22:20]初生之犊-TI4第5名LGD战队纪录片
2014/08/13 DOTA
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
使用python的pandas为你的股票绘制趋势图
2019/06/26 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
TensorFlow tf.nn.max_pool实现池化操作方式
2020/01/04 Python
Python高阶函数与装饰器函数的深入讲解
2020/11/10 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
html5 桌面提醒:Notifycations应用介绍
2012/11/27 HTML / CSS
税务干部鉴定材料
2014/02/11 职场文书
慈善捐赠倡议书
2014/08/30 职场文书
地方白酒代理协议书
2014/10/25 职场文书
学生会任命书范本
2015/09/21 职场文书
MySQL创建管理LIST分区
2022/04/13 MySQL
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS
Sentry的安装、配置、使用教程(Sentry日志手机系统)
2022/07/23 Python