《PHP教程:浅谈socket同步和异步、阻塞和非阻塞、I/O模型》要点:
本文介绍了PHP教程:浅谈socket同步和异步、阻塞和非阻塞、I/O模型,希望对您有用。如果有疑问,可以联系我们。
在进行网络编程时,常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式PHP学习
同步/异步主要针对C端: PHP学习
同步:c端发出一个功能调用时,在没有得到结果之前,c端死等结果PHP学习
例如:普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事PHP学习
异步:c端一个异步过程调用发出后,调用者不会立刻得到结果.实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者.PHP学习
例如:ajax请求(异步): 事件触发->服务器处理(浏览器可做其他的)->处理完毕,ajax回调函数处理结果PHP学习
阻塞/非阻塞主要针对S端:PHP学习
阻塞(等待):阻塞调用是指调用结果返回之前,当前线程会被挂起.函数只有在得到结果之后才会返回,效率低
PHP学习
<?php $fp = fopen("lock.txt", "w+"); if(flock($fp,LOCK_EX)) { //..处理订单 flock($fp,LOCK_UN); } fclose($fp); ?>
非阻塞(立即返回):指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回,效率高,适合高并发
PHP学习
<?php $fp = fopen("lock.txt", "w+"); if(flock($fp,LOCK_EX | LOCK_NB)) { //..处理订单 flock($fp,LOCK_UN); } else { echo "系统繁忙,请稍后再试"; } fclose($fp); ?>
同步、异步和阻塞、非阻塞是组合关系,因此有4种方式:PHP学习
同步阻塞、同步非阻塞、异步阻塞、异步非阻塞PHP学习
linux有五种I/O模型PHP学习
1)阻塞I/O(blocking I/O)PHP学习
2)非阻塞I/O (nonblocking I/O)PHP学习
3)I/O复用(select 和poll) (I/O multiplexing)PHP学习
4)信号驱动I/O (signal driven I/O (SIGIO))PHP学习
5)异步I/O (asynchronous I/O (the POSIX aio_functions))PHP学习
前四种都是同步,只有最后一种才是异步IOPHP学习
select、poll、epoll 区别总结:PHP学习
1、单进程最大连接数:PHP学习
select:单个进程所能打开的最大连接数有FD_SETSIZE宏定义PHP学习
poll:poll本质上和select没有区别,但是它没有最大连接数的限制,原因是它是基于链表来存储的PHP学习
epoll:虽然连接数有上限,但是很大,1G内存的机器上可以打开10万左右的连接,2G内存的机器可以打开20万左右的连接PHP学习
2、文件描述符(FD)剧增后带来的IO效率问题PHP学习
select:每次调用文件描述符(FD)时都会对连接进行线性遍历,所以随着FD的增加会造成遍历速度慢的"线性下降性能问题"PHP学习
poll:同上PHP学习
epoll:根据每个fd上的callback函数来实现的,只有活跃的socket才会主动调用callback,所以在活跃socket较少的情况下,使用epoll没有前面两者的线性下降的性能问题,但是所有socket都很活跃的情况下,可能会有性能问题.PHP学习
3、 消息传递方式PHP学习
select:内核需要将消息传递到用户空间,都需要内核拷贝动作PHP学习
poll:同上PHP学习
epoll:epoll通过内核和用户空间共享一块内存来实现的.PHP学习
总结:PHP学习
综上,在选择select,poll,epoll时要根据具体的使用场合以及这三种方式的自身特点.PHP学习
1、表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调.PHP学习
2、select低效是因为每次它都需要轮询.但低效也是相对的,视情况而定,也可通过良好的设计改善PHP学习
以上这篇浅谈socket同步和异步、阻塞和非阻塞、I/O模型就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持维易PHP.PHP学习
转载请注明本页网址:
http://www.vephp.com/jiaocheng/2299.html