浅谈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开发模式(简写版)
Mar 15 PHP
php 设计模式之 工厂模式
Dec 19 PHP
不要轻信 PHP_SELF的安全问题
Sep 05 PHP
php文件上传表单摘自drupal的代码
Feb 15 PHP
完美解决PHP中的Cannot modify header information 问题
Aug 12 PHP
session在php5.3中的变化 session_is_registered() is deprecated in
Nov 12 PHP
PHP源码分析之变量的存储过程分解
Jul 03 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
Jan 21 PHP
php+xml编程之SimpleXML的应用实例
Jan 24 PHP
php图片添加水印例子
Jul 20 PHP
thinkphp5使用无限极分类
Feb 18 PHP
PHP策略模式写法
Apr 01 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木马攻击防御之道
2008/03/24 PHP
php命名空间学习详解
2014/02/27 PHP
php include类文件超时问题处理
2015/02/06 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
javascript addBookmark 加入收藏 多浏览器兼容
2009/08/15 Javascript
js二维数组定义和初始化的三种方法总结
2014/03/03 Javascript
jquery插件bxslider用法实例分析
2015/04/16 Javascript
javascript编写贪吃蛇游戏
2015/07/07 Javascript
详解jQuery中的元素的属性和相关操作
2015/08/14 Javascript
jQuery插件开发汇总
2016/05/15 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
2016/09/26 Javascript
js通过classname来获取元素的方法
2016/11/24 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
2016/12/23 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
SVG实现时钟效果
2018/07/17 Javascript
JavaScript中concat复制数组方法浅析
2019/01/20 Javascript
JavaScript 替换所有匹配内容及正则替换方法
2020/02/12 Javascript
JavaScript布尔运算符原理使用解析
2020/05/06 Javascript
vue实现匀速轮播效果
2020/06/29 Javascript
Python查看多台服务器进程的脚本分享
2014/06/11 Python
Python基础之函数用法实例详解
2014/09/10 Python
python开发之thread线程基础实例入门
2015/11/11 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
Python-ElasticSearch搜索查询的讲解
2019/02/25 Python
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
python数据预处理方式 :数据降维
2020/02/24 Python
完美解决ARIMA模型中plot_acf画不出图的问题
2020/06/04 Python
Python enumerate() 函数如何实现索引功能
2020/06/29 Python
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
波兰在线香水店:Perfumy.pl
2019/08/12 全球购物
航空大学应届生求职信
2013/11/10 职场文书
播音主持专业个人自我评价
2014/01/09 职场文书
思想品德课教学反思
2014/02/10 职场文书
军训自我鉴定200字
2014/02/13 职场文书
一文搞懂如何实现Go 超时控制
2021/03/30 Python
如何用JavaScript检测当前浏览器是无头浏览器
2021/04/27 Javascript