浅谈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集成FCK的函数代码
Sep 27 PHP
解析php中heredoc的使用方法
Jun 17 PHP
PHP实现的简单mock json脚本分享
Feb 10 PHP
避免Smarty与CSS语法冲突的方法
Mar 02 PHP
php使用ob_flush不能每隔一秒输出原理分析
Jun 02 PHP
Symfony模板的快捷变量用法实例
Mar 17 PHP
PHP实现可自定义样式的分页类
Mar 29 PHP
PHP读取大文件的几种方法介绍
Oct 27 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
Nov 16 PHP
PHP生成随机数的方法总结
Mar 01 PHP
php JWT在web端中的使用方法教程
Sep 06 PHP
Laravel框架实现多数据库连接操作详解
Jul 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中mysql模块部分功能的简单封装
2011/09/30 PHP
PHP SPL标准库中的常用函数介绍
2015/05/11 PHP
PHP基于文件存储实现缓存的方法
2015/07/20 PHP
合格的PHP程序员必备技能
2015/11/13 PHP
PHP+Mysql无刷新问答评论系统(源码)
2016/12/20 PHP
2017年最新PHP经典面试题目汇总(上篇)
2017/03/17 PHP
php 数据结构之链表队列
2017/10/17 PHP
Js获取事件对象代码
2010/08/05 Javascript
javascript的内存管理详解
2013/08/07 Javascript
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
js中call与apply的用法小结
2013/12/28 Javascript
用原生js做个简单的滑动效果的回到顶部
2014/10/15 Javascript
node.js中的fs.symlinkSync方法使用说明
2014/12/15 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
2016/03/06 Javascript
常用Javascript函数与原型功能收藏(必看篇)
2016/10/09 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
2016/11/21 Javascript
微信小程序 详解Page中data数据操作和函数调用
2017/01/12 Javascript
想用好React的你必须要知道的一些事情
2017/07/24 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
pm2启动ssr失败的解决方法
2019/06/29 Javascript
[01:18:36]LGD vs VP Supermajor 败者组决赛 BO3 第一场 6.10
2018/07/04 DOTA
解决Python网页爬虫之中文乱码问题
2018/05/11 Python
Django restframework 源码分析之认证详解
2019/02/22 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
Python yield的用法实例分析
2020/03/06 Python
django列表筛选功能的实现代码
2020/03/27 Python
Python matplotlib实时画图案例
2020/04/23 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
CSS3实现缺角矩形,折角矩形以及缺角边框
2019/12/20 HTML / CSS
澳大利亚女装精品店:Alannah Hill
2020/07/29 全球购物
业务经理岗位职责
2013/11/11 职场文书
咖啡店创业计划书
2014/08/15 职场文书
2014年勤工助学工作总结
2014/11/24 职场文书
敬老院志愿者活动总结
2015/05/06 职场文书
PyQt5实现多张图片显示并滚动
2021/06/11 Python
A22国内电台短波广播频率表
2022/05/10 无线电