为了账号安全,请及时绑定邮箱和手机立即绑定

web服务器用到的底层技术为什么大多是线程阻塞和多路复用?

web服务器用到的底层技术为什么大多是线程阻塞和多路复用?

慕桂英4014372 2019-02-20 10:52:33
我记得《unix网络编程》,一共提到五种io模型: 阻塞IO模型 非阻塞IO模型 IO复用模型 信号驱动IO 异步IO模型 可是为什么我见过的web服务器,要么是用阻塞io+线程(比如apache),要么是多路复用(比如epoll),但在我看来后两种io才是最完美的解决方式,可是为什么web服务器没有使用呢? 是因为发送信号,这个操作太浪费了?所以对于web服务器这种要接受大量请求的,每一个io都发送信号代价太大?还是因为别的?
查看完整描述

5 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

node是异步io吧
而且确实性能很好

查看完整回答
反对 回复 2019-03-01
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

Nginx就是一个异步IO的实现啊, 他有一个大的eventloop所以不允许有任何阻塞的进程 不然会阻塞所有, 在开发一个nginx模块的时候尤其要注意这一点, 这也带来了一些问题 比如全异步的IO会导致程序不宜读,所以后期维护上可能会带来问题 这个时候Lua来了~~

查看完整回答
反对 回复 2019-03-01
?
潇湘沐

TA贡献1816条经验 获得超6个赞

我来说下为什么不使用同步非阻塞模型。

由于socket是非阻塞的方式,因此用户线程发起IO请求时立即返回。但并没有读取到任何数据,用户线程需要不断地发起IO请求,知道数据到达后,才真正读取到数据,继续执行。

用户线程使用同步非阻塞IO模型的伪代码描述为:

{
    while(read(socketfd, buffer) != SUCCESS)
        ...
    process(buffer);
}

即用户需要不断地调用read,尝试读取socket中的数据,直到读取成功后,才继续处理接收的数据。整个IO请求过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断轮询、重复请求,消耗了大量的CPU的资源。所以一般很少用这种模型。

查看完整回答
反对 回复 2019-03-01
?
跃然一笑

TA贡献1826条经验 获得超6个赞

为什么不使用异步IO模型?
1)异步要通过大量的callback,hook函数实现,调试,维护,可读性都是一个很大的挑战,现在还没有很好的工具集来支持异步编程。
2)阻塞io+线程和多路复用已经比较好的解决了高并发问题,成本也不高。
3)异步IO不一定真的异步,比如POSIX AIO(glibc AIO),性能也不好。详见异步IO应用

查看完整回答
反对 回复 2019-03-01
  • 5 回答
  • 0 关注
  • 643 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信