web服务器用到的底层技术为什么大多是线程阻塞和多路复用?
我记得《unix网络编程》,一共提到五种io模型:
阻塞IO模型
非阻塞IO模型
IO复用模型
信号驱动IO
异步IO模型
可是为什么我见过的web服务器,要么是用阻塞io+线程(比如apache),要么是多路复用(比如epoll),但在我看来后两种io才是最完美的解决方式,可是为什么web服务器没有使用呢?
是因为发送信号,这个操作太浪费了?所以对于web服务器这种要接受大量请求的,每一个io都发送信号代价太大?还是因为别的?
miku999
9 years, 3 months ago
Answers
epoll 是 linux 2.6 以后才出现的,所以,Nginx 使用了 epoll 模型。所以,Nginx 处理静态文件或者做反代很强行,因为主要是 IO 操作。
epoll 是 select/poll 的增强版,就是基于事件通知的。
Apache、Tomcat,他们虽然也是 Web 服务器,但是也承担应用服务器的角色,之所以称他们为应用服务器,是因为他们真的要跑具体的业务应用,如科学计算、图形图像、数据库读写等。它们很可能是 CPU 密集型的服务,事件驱动并不合适。
鱼与熊掌不可兼得。事件驱动适合于 IO 密集型服务,多进程或线程适合于 CPU 密集型服务。
再者,根据 TCP、HTTP 协议的特点,大部分服务器都会保留 time_wait 的持久链接。Web 服务器主要是用来处理 HTTP 协议的请求。
没有最完美的,只有更适合的
沙包你妹啊
answered 9 years, 3 months ago