在
网络编程中,往往有四种方式调用
同步(同步)或异步(异步),阻塞(block)/非阻塞(阻塞)
同步/异步主要用于C端:
同步:当C端发送一个
函数调用时,C端在未得到结果之前就死了。
例如:普通的B/S模式(同步):提交请求>
等待服务器
处理gt在返回客户端
浏览器过程中不能做任何事情。
异步:在发送了C方的异步
进程调用之后,调用方不会立即得到结果。当实际处理这个调用的部分完成时,调用者将被状态、通知和回调通知。
例如:Ajax(异步请求):服务器(浏览器可以触发事件,其他)>处理,Ajax回调处理结果
阻塞/非阻塞主要针对s侧:
阻塞(等待):阻塞调用是指在调用结果返回之前当前
线程被挂起。函数在获得结果之后返回,效率较低。
< PHP
$ FP = fopen(锁。txt
如果(羊群($ FP,lock_ex))
{
…处理订单
羊群($ FP,lock_un);
}
Fclose($ FP);
>
非阻塞(立即返回):该函数不会阻塞当前线程,直到结果不立即获得,而且它立即返回,效率高,适合于高并发性。
< PHP
$ FP = fopen(锁。txt
如果(羊群($ FP,lock_ex | lock_nb))
{
…处理订单
羊群($ FP,lock_un);
}
其他的
{
系统忙,请稍后再试。
}
Fclose($ FP);
>
同步、异步和阻塞和非阻塞是组合关系,所以有4种
方法:
同步阻塞,同步无阻塞,异步阻塞,异步非阻塞
Linux有五种I/O模型。
1)阻塞I/O(阻塞I/O)
2)非阻塞我 / O(非阻塞I / O)
3)I/O重用(选择和轮询)(I/O多路复用)
4)
信号驱动我 / O(信号驱动我 / O(SIGIO))
5)异步I / O(异步I / O(POSIX aio_functions))
前四个是同步的,最后一个是异步IO。
选择,投票,epoll的
区别总结:
1。单个进程
连接的最大数量:
选择那一个进程可以打开的最大连接数有一个fd_setsize宏定义
轮询:轮询与选择基本上没有什么不同,但它没有最大连接数的限制,因为它是基于链表的。
Epoll:虽然连接数有一个上限,这是非常大的。1G
内存机可以打开约10万的连接,而2G内存机可以打开约20万的连接。
2,
文件描述符(FD)急剧增加引起的IO效率问题。
选择:每次调用文件描述符(FD)时,我们将线性地连接该连接。因此,随着FD的增加,会导致慢遍历的线性下降
性能问题。
民意调查:同上。
根据epoll:每个FD实现回调函数,只有积极的插座会主动调用回调函数,所以在不活跃的插座的
情况下,使用epoll的线性下降,性能问题不在他们面前,但所有的插座都非常活跃,可能会有性能问题。
三.
消息传递
模式 选择:内核需要将消息传递给
用户空间,所有这些都需要内核
复制操作。
民意调查:同上。
epoll epoll:通过在内核和用户空间共享一块内存实现。
总结:
综上所述,选择,投票,epoll应根据具体使用情况和这三种方式的特点。
1、epoll的性能表面上是最好的。然而,当连接数和连接是非常活跃的,选择和调查的性能可能优于epoll。毕竟,epoll通知机制需要很多函数回调。
2,选择是低效的,因为每次都需要轮询。但是效率低是相对的,取决于情况,并且可以通过良好的设计来改进。
以上是关于socket同步和异步、阻塞和非阻塞。我 / O模型是萧边
分享你的全部内容。我希望能给你一个
参考,希望你能
支持它。