当前位置: 移动技术网 > IT编程>开发语言>PHP > 浅谈socket同步和异步、阻塞和非阻塞、I/O模型

浅谈socket同步和异步、阻塞和非阻塞、I/O模型

2017年12月12日  | 移动技术网IT编程  | 我要评论

色搜搜,六哥喊麦,参鸡汤庄的泡菜女孩

在进行网络编程时,常常见到同步(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模型就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网