我记得《unix网络编程》,一共提到五种io模型:
阻塞IO模型
非阻塞IO模型
IO复用模型
信号驱动IO
异步IO模型
可是为什么我见过的web服务器,要么是用阻塞io+线程(比如apache),要么是多路复用(比如epoll),但在我看来后两种io才是最完美的解决方式,可是为什么web服务器没有使用呢?
是因为发送信号,这个操作太浪费了?所以对于web服务器这种要接受大量请求的,每一个io都发送信号代价太大?还是因为别的?
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
node是异步io吧
而且确实性能很好
Nginx就是一个异步IO的实现啊, 他有一个大的eventloop所以不允许有任何阻塞的进程 不然会阻塞所有, 在开发一个nginx模块的时候尤其要注意这一点, 这也带来了一些问题 比如全异步的IO会导致程序不宜读,所以后期维护上可能会带来问题 这个时候Lua来了~~
我来说下为什么不使用同步非阻塞模型。
由于socket是非阻塞的方式,因此用户线程发起IO请求时立即返回。但并没有读取到任何数据,用户线程需要不断地发起IO请求,知道数据到达后,才真正读取到数据,继续执行。
用户线程使用同步非阻塞IO模型的伪代码描述为:
即用户需要不断地调用read,尝试读取socket中的数据,直到读取成功后,才继续处理接收的数据。整个IO请求过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断轮询、重复请求,消耗了大量的CPU的资源。所以一般很少用这种模型。
为什么不使用异步IO模型?
1)异步要通过大量的callback,hook函数实现,调试,维护,可读性都是一个很大的挑战,现在还没有很好的工具集来支持异步编程。
2)阻塞io+线程和多路复用已经比较好的解决了高并发问题,成本也不高。
3)异步IO不一定真的异步,比如POSIX AIO(glibc AIO),性能也不好。详见异步IO应用