浅谈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
php4的session功能评述(三)
Oct 09 PHP
php实现天干地支计算器示例
Mar 14 PHP
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
Jun 25 PHP
php中动态调用函数的方法
Mar 16 PHP
在WordPress中实现发送http请求的相关函数解析
Dec 29 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
Mar 21 PHP
基于PHP微信红包的算法探讨
Jul 21 PHP
关于Laravel Route重定向的一个注意点
Jan 16 PHP
PHP的PDO连接讲解
Jan 24 PHP
thinkphp5使用无限极分类
Feb 18 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
Jun 12 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/01/17 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
PHP代码优化技巧小结
2015/09/29 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
2019/07/26 PHP
很可爱的输入框
2008/08/03 Javascript
Extjs学习笔记之四 工具栏和菜单
2010/01/07 Javascript
window.name代替cookie的实现代码
2010/11/28 Javascript
JS中的this变量的使用介绍
2013/10/21 Javascript
js实现网页倒计时、网站已运行时间功能的代码3例
2014/04/14 Javascript
js实现倒计时关键代码
2017/05/05 Javascript
基于Vuejs和Element的注册插件的编写方法
2017/07/03 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
Bootstrap开发中Tab标签页切换图表显示问题的解决方法
2018/07/13 Javascript
用Vue编写抽象组件的方法
2019/05/06 Javascript
vue 解决路由只变化参数页面组件不更新问题
2019/11/05 Javascript
python实现ftp客户端示例分享
2014/02/17 Python
python单例模式实例分析
2015/04/08 Python
Python数据结构之翻转链表
2017/02/25 Python
对Python的多进程锁的使用方法详解
2019/02/18 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
2019/09/06 Python
pandas数据拼接的实现示例
2020/04/16 Python
python实现飞船大战
2020/04/24 Python
Django ORM实现按天获取数据去重求和例子
2020/05/18 Python
伦敦香水公司:The London Perfume Company
2019/11/13 全球购物
应届生如何写自荐信
2014/01/05 职场文书
党员学习十八大感想
2014/01/17 职场文书
岗位职责说明书
2014/05/07 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
法人委托书范本格式
2014/09/15 职场文书
2014年社区工作总结
2014/11/18 职场文书
小班教师个人总结
2015/02/05 职场文书
学历证明样本
2015/06/16 职场文书
Python学习之os包使用教程详解
2022/03/21 Python
Elasticsearch 配置详解
2022/04/19 Java/Android