浅谈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 相关文章推荐
新浪新闻小偷
Oct 09 PHP
php 多个submit提交表单 处理方法
Jul 07 PHP
php 字符串替换的方法
Jan 10 PHP
使用 PHPMAILER 发送邮件实例应用
Nov 07 PHP
PHP中include与require使用方法区别详解
Oct 19 PHP
thinkPHP学习笔记之安装配置篇
Mar 05 PHP
Codeigniter检测表单post数据的方法
Mar 21 PHP
php使用MySQL保存session会话的方法
Jun 26 PHP
PHP获取指定月份第一天和最后一天的方法
Jul 18 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
Jan 05 PHP
Laravel5中Cookie的使用详解
May 03 PHP
PHP命令Command模式用法实例分析
Aug 08 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
德生PL660的电路分析和打磨
2021/03/02 无线电
基于PHP与XML的PDF文档生成技术
2006/10/09 PHP
php 过滤危险html代码
2009/06/29 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
PHP模板引擎Smarty内建函数详解
2016/04/11 PHP
PHP并发查询MySQL的实例代码
2017/08/09 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
php判断目录存在的简单方法
2019/09/26 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
PHP7 其他修改
2021/03/09 PHP
JavaScript 语言的递归编程
2010/05/18 Javascript
PHP和NodeJs开发的应用如何共用Session
2015/04/16 NodeJs
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
详解jQuery uploadify文件上传插件的使用方法
2016/12/16 Javascript
Bootstrap栅格系统简单实现代码
2017/03/06 Javascript
Vue2.0表单校验组件vee-validate的使用详解
2017/05/02 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
微信小程序实现tab左右切换效果
2020/11/15 Javascript
Seajs源码详解分析
2019/04/02 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
python下调用pytesseract识别某网站验证码的实现方法
2016/06/06 Python
Python中模块string.py详解
2017/03/12 Python
Django自定义认证方式用法示例
2017/06/23 Python
Python3学习urllib的使用方法示例
2017/11/29 Python
利用Python如何生成hash值示例详解
2017/12/20 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃
2020/11/02 Python
物流专业大学的自我评价
2014/01/11 职场文书
化妆品促销方案
2014/02/24 职场文书
运输服务质量承诺书
2014/03/27 职场文书
我的中国梦演讲稿500字
2014/08/19 职场文书
大学生见习期满自我鉴定
2014/09/13 职场文书
学生上课看漫画的检讨书
2014/09/26 职场文书