浅谈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
《APMServ 5.1.2》使用图解
Oct 23 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
Aug 22 PHP
php XMLWriter类的简单示例代码(RSS输出)
Sep 30 PHP
利用PHP实现图片等比例放大和缩小的方法详解
Jun 06 PHP
PHP JS Ip地址及域名格式检测代码
Sep 27 PHP
php截取中文字符串函数实例
Feb 23 PHP
PHP生成各种常见验证码和Ajax验证过程
Jan 10 PHP
PHP实现多图上传(结合uploadify插件)思路分析
Nov 30 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
Mar 04 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
Jun 13 PHP
用php实现分页效果的示例代码
Dec 10 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之数组学习
2011/05/29 PHP
PHP的autoload机制的实现解析
2012/09/15 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
2016/11/16 PHP
url 特殊字符 传递参数解决方法
2010/01/01 Javascript
js字符编码函数区别分析
2011/12/28 Javascript
Jquery带搜索框的下拉菜单
2013/05/06 Javascript
js中同步与异步处理的方法和区别总结
2013/12/25 Javascript
JS中捕获console.log()输出的方法
2015/04/16 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
9个让JavaScript调试更简单的Console命令
2016/11/14 Javascript
详解angularjs 关于ui-router分层使用
2017/06/12 Javascript
详解用vue.js和laravel实现微信授权登陆
2017/06/23 Javascript
JS严格模式知识点总结
2018/02/27 Javascript
代码详解javascript模块加载器
2018/03/04 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
swiper实现异形轮播效果
2019/11/28 Javascript
Vue实现input宽度随文字长度自适应操作
2020/07/29 Javascript
Vue使用轮询定时发送请求代码
2020/08/10 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
前端性能优化建议
2020/09/17 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
python利用selenium进行浏览器爬虫
2019/04/25 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
2019/12/31 Python
python MultipartEncoder传输zip文件实例
2020/04/07 Python
Python SMTP配置参数并发送邮件
2020/06/16 Python
用canvas做一个DVD待机动画的实现代码
2019/04/12 HTML / CSS
美国休闲服装品牌:J.Crew Factory
2017/03/04 全球购物
工商治理实习生的自我评价分享
2014/02/20 职场文书
2014年应急管理工作总结
2014/11/26 职场文书
2015年护士节活动总结
2015/02/10 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书
2019广播稿怎么写
2019/04/17 职场文书
Nginx解决前端访问资源跨域问题的方法详解
2021/03/31 Servers
一篇文章学会Vue中间件管道
2021/06/20 Vue.js
golang为什么要统一错误处理
2022/04/03 Golang