浅谈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 不同编码下的字符串长度区分
Sep 26 PHP
PHP fopen 读取带中文URL地址的一点见解
Sep 25 PHP
mcrypt启用 加密以及解密过程详细解析
Aug 07 PHP
分享PHP header函数使用教程
Sep 05 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
Aug 21 PHP
Chrome Web App开发小结
Sep 04 PHP
php中mysql操作buffer用法详解
Mar 19 PHP
php实现批量上传数据到数据库(.csv格式)的案例
Jun 18 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
Jun 13 PHP
Swoole实现异步投递task任务案例详解
Apr 02 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
May 13 PHP
PHP 出现 http500 错误的解决方法
Mar 09 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中将ip地址转成十进制数的两种实用方法
2013/08/15 PHP
jQuery动态添加删除select项(实现代码)
2013/09/03 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
js图片滚动效果时间可随意设定当鼠标移上去时停止
2014/06/26 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
使用jquery.form.js实现图片上传的方法
2016/05/05 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
Vue.js 表单校验插件
2016/08/14 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
2017/02/14 Javascript
Angular中实现树形结构视图实例代码
2017/05/05 Javascript
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
采用python实现简单QQ单用户机器人的方法
2014/07/03 Python
用Python实现一个简单的能够上传下载的HTTP服务器
2015/05/05 Python
Python selenium文件上传方法汇总
2020/11/19 Python
Django 生成登陆验证码代码分享
2017/12/12 Python
对numpy中布尔型数组的处理方法详解
2018/04/17 Python
python画折线图的程序
2018/07/26 Python
对Python subprocess.Popen子进程管道阻塞详解
2018/10/29 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
Python3实现将一维数组按标准长度分隔为二维数组
2019/11/29 Python
python tkinter 设置窗口大小不可缩放实例
2020/03/04 Python
使用phonegap获取设备的一些信息方法
2017/03/31 HTML / CSS
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
幼儿园实习生辞职信
2014/01/20 职场文书
护理毕业生自我鉴定
2014/02/11 职场文书
三查三看党性分析材料
2014/02/18 职场文书
传承焦裕禄精神思想汇报2014
2014/09/10 职场文书
个人收入证明范本
2014/09/18 职场文书
乡镇领导班子四风对照检查材料
2014/09/27 职场文书
学校捐书活动总结
2015/05/08 职场文书
唐山大地震观后感
2015/06/05 职场文书
信息简报范文
2015/07/21 职场文书
2016年暑期见闻作文
2015/11/25 职场文书
2016年学校党支部公开承诺书
2016/03/25 职场文书
详解MySQL 联合查询优化机制
2021/05/10 MySQL