浅谈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
Zend Studio 无法启动的问题解决方法
Dec 04 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
Aug 24 PHP
php下获取客户端ip地址的函数
Mar 15 PHP
php抽奖小程序的实现代码
Jun 18 PHP
php如何实现不借助IDE快速定位行数或者方法定义的文件和位置
Jan 17 PHP
PHP单例模式与工厂模式详解
Aug 29 PHP
360搜索引擎自动收录php改写方案
Apr 28 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
Aug 09 PHP
Thinkphp5.0 框架Model模型简单用法分析
Oct 11 PHP
php中用unset销毁变量并释放内存
May 10 PHP
ThinkPHP 5 AJAX跨域请求头设置实现过程解析
Oct 28 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 读取Postgresql中的数组
2013/04/14 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
PHP数据库表操作的封装类及用法实例详解
2016/07/12 PHP
详解php实现页面静态化原理
2017/06/21 PHP
防止jQuery ajax Load使用缓存的方法小结
2014/02/22 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
2016/03/29 Javascript
从对象列表中获取一个对象的方法,依据关键字和值
2017/09/20 Javascript
深入理解ES6之数据解构的用法
2018/01/13 Javascript
关于vue-router的那些事儿
2018/05/23 Javascript
使用D3.js+Vue实现一个简单的柱形图
2018/08/05 Javascript
用原生 JS 实现 innerHTML 功能实例详解
2019/04/03 Javascript
vue组件中watch props根据v-if动态判断并挂载DOM的问题
2019/05/12 Javascript
原生js实现trigger方法示例代码
2019/05/22 Javascript
在vue中把含有html标签转为html渲染页面的实例
2019/10/28 Javascript
Python with的用法
2014/08/22 Python
使用python3.5仿微软记事本notepad
2016/06/15 Python
python3实现ftp服务功能(服务端 For Linux)
2017/03/24 Python
Python制作Windows系统服务
2017/03/25 Python
Python探索之ModelForm代码详解
2017/10/26 Python
Python socket套接字实现C/S模式远程命令执行功能案例
2018/07/06 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
Python 实现递归法解决迷宫问题的示例代码
2020/01/12 Python
Python和Bash结合在一起的方法
2020/11/13 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
2020/12/07 Python
以设计师精品品质提供快速时尚:Mostata
2019/05/10 全球购物
德国2018年度最佳在线药房:Bodfeld Apotheke
2019/11/04 全球购物
大学生的自我鉴定范文
2014/01/21 职场文书
外贸采购员岗位职责
2014/03/08 职场文书
大三学年自我鉴定范文(3篇)
2014/09/28 职场文书
师德承诺书
2015/01/20 职场文书
2015年仓管员工作总结
2015/04/21 职场文书
道歉信怎么写
2015/05/12 职场文书
2019邀请函格式及范文
2019/05/20 职场文书
职场领导同事生日简短祝福语
2019/08/06 职场文书
python使用shell脚本创建kafka连接器
2022/04/29 Python