浅谈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 编程请选择正确的文本编辑软件
Dec 21 PHP
php 将bmp图片转为jpg等其他任意格式的图片
Jun 21 PHP
php 获取select下拉列表框的值
May 08 PHP
PHP过滤★等特殊符号的正则
Jan 27 PHP
ThinkPHP自动完成中使用函数与回调方法实例
Nov 29 PHP
浅谈json_encode用法
Mar 05 PHP
基于PHP后台的Android新闻浏览客户端
May 23 PHP
Laravel实现自定义错误输出内容的方法
Oct 10 PHP
php生成图片缩略图功能示例
Feb 22 PHP
PHP的mysqli_stmt_init()函数讲解
Jan 24 PHP
PHP实现微信退款的方法示例
Mar 26 PHP
PHP进阶学习之依赖注入与Ioc容器详解
Jun 19 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
日本十大科幻动漫 宇宙骑士垫底,第一已成经典
2020/03/04 日漫
PHP5.5新特性之yield理解与用法实例分析
2019/01/11 PHP
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
ajax处理php返回json数据的实例代码
2013/01/24 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
2013/05/21 Javascript
js控制表单不能输入空格的小例子
2013/11/20 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
Javascript中的关键字和保留字整理
2014/10/16 Javascript
Javascript中的高阶函数介绍
2015/03/15 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
2016/10/31 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
Vue.js 实现微信公众号菜单编辑器功能(二)
2018/05/08 Javascript
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
vue2.0 如何在hash模式下实现微信分享
2019/01/22 Javascript
node中使用log4js4.x版本记录日志的方法
2019/08/20 Javascript
在Node.js中将SVG图像转换为PNG,JPEG,TIFF,WEBP和HEIF格式的方法
2019/08/22 Javascript
JavaScript或jQuery 获取option value值方法解析
2020/05/12 jQuery
Python中动态创建类实例的方法
2017/03/24 Python
Python编程修改MP3文件名称的方法
2017/04/19 Python
Python编程实现及时获取新邮件的方法示例
2017/08/10 Python
Django 用户认证组件使用详解
2019/07/23 Python
利用setuptools打包python程序的方法步骤
2020/01/18 Python
Python 解析xml文件的示例
2020/09/29 Python
详解Django ORM引发的数据库N+1性能问题
2020/10/12 Python
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
乐高积木玩具美国官网:LEGO Shop US
2016/09/16 全球购物
纯净、自信、100%的羊绒服装:360Cashmere
2021/02/20 全球购物
如何配置、使用和清除Smarty缓存
2015/12/23 面试题
环境科学专业研究生求职信
2013/10/02 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
关于保护环境的建议书
2014/05/13 职场文书
酒桌上的开场白
2015/06/01 职场文书
房产证明范本
2015/06/19 职场文书
2016年学校爱国卫生月活动总结
2016/04/06 职场文书
八年级作文之一起的走过日子
2019/09/17 职场文书
2021好看的国漫排行榜前十名 《完美世界》上榜,《元龙》排名第一
2022/03/18 国漫