我记得《unix网络编程》,一共提到五种io模型:
阻塞IO模型
非阻塞IO模型
IO复用模型
信号驱动IO
异步IO模型
可是为什么我见过的web服务器,要么是用阻塞io+线程(比如apache),要么是多路复用(比如epoll),但在我看来后两种io才是最完美的解决方式,可是为什么web服务器没有使用呢?
是因为发送信号,这个操作太浪费了?所以对于web服务器这种要接受大量请求的,每一个io都发送信号代价太大?还是因为别的?
5 回答
![?](http://img1.sycdn.imooc.com/54584c9c0001489602200220-100-100.jpg)
慕的地8271018
TA贡献1796条经验 获得超4个赞
Nginx就是一个异步IO的实现啊, 他有一个大的eventloop所以不允许有任何阻塞的进程 不然会阻塞所有, 在开发一个nginx模块的时候尤其要注意这一点, 这也带来了一些问题 比如全异步的IO会导致程序不宜读,所以后期维护上可能会带来问题 这个时候Lua来了~~
![?](http://img1.sycdn.imooc.com/5458689e000115c602200220-100-100.jpg)
潇湘沐
TA贡献1816条经验 获得超6个赞
我来说下为什么不使用同步非阻塞模型。
由于socket是非阻塞的方式,因此用户线程发起IO请求时立即返回。但并没有读取到任何数据,用户线程需要不断地发起IO请求,知道数据到达后,才真正读取到数据,继续执行。
用户线程使用同步非阻塞IO模型的伪代码描述为:
{
while(read(socketfd, buffer) != SUCCESS)
...
process(buffer);
}
即用户需要不断地调用read,尝试读取socket中的数据,直到读取成功后,才继续处理接收的数据。整个IO请求过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断轮询、重复请求,消耗了大量的CPU的资源。所以一般很少用这种模型。
添加回答
举报
0/150
提交
取消