23.1 IO模型
目录
IO模型
nginx 是一个 web 服务器,同时还能作为 http 协议的反向代理服务器。相比于 http,nginx 使用了更先进的 IO 模型,异步通信以及进程间通信的技术,能支持更多的并发请求,具有更高的性能和稳定性。本章我们首先来学习如何使用 nginx 配置一个 web serve,nginx 的反向代理功能我们留在 28 章再来介绍。本章内容包括
- IO 事件模型
- nginx 框架与配置
- nginx web 服务配置
有关 web 的基础概念和 http 协议的内容将不再此累述,大家可以回看以下几个章节:
想要讲清楚 IO 模型并不容易,对于没有编程经验的来说这是一个很抽象的概念。想理解这个概念可以从以下几点入手:
- 我们的 web 需要同时响应多个用户请求,但是我们的程序通常是顺序执行的,一次只能响应一个用户请求
- 响应的内容通常位于磁盘上,而读取磁盘文件,利用网卡发送数据包都是内核提供的功能,应用程序需要发起系统调用
- 在系统调用返回结果之前,发起调用的应用程序通常只能等待
总结起来就是,web 程序需要同时处理多个用户请求,但是程序通常是顺序执行的,且经常经常阻塞在磁盘和网络 IO 之上。为能够为多个用户同时提供响应我们需要新的技术,这些技术目的是提高程序的 IO 效率称为 IO 模型。要想明白 IO 模型,我们首先要明白系统调用的过程。
1. IO 系统调用
1.1 IO 过程
我们以读取磁盘文件为例:
- 当我们需要读取文件时,首先发起 read 系统调用
- 此时会陷入内核,执行内核代码,将数据从磁盘读取到内核缓冲区中
- 将内核缓冲区中的数据从内核拷贝到应用程序内存空间
1.1 同步/异步
同步/异步关注的是
- 被调用者,如何通知调用者,即被调用者与调用者之间消息通知的机制
- 在 IO 上就是应用程序与操作系统的交互方式
1.2 阻塞/非阻塞
阻塞/非阻塞关注的是
- 调用者如何等待结果,即调用程序的执行模式
1.3 IO 模型类别
- 同步阻塞
- 同步非阻塞
- IO复用(事件驱动IO):select, poll,epoll:
- 信号驱动I/O
- 异步IO
参考连接:
- https://songlee24.github.io/2016/07/19/explanation-of-5-IO-models/
- https://blog.csdn.net/wuzhengfei1112/article/details/78242004
- https://blog.csdn.net/lijinqi1987/article/details/71214974
2. httpd 的IO 模型
- 多进程模型:prefork, 一个进程响应一个用户请求,并发使用多个进程实现;
- 多线程模型:worker, 一个进程生成多个线程,一个线程响应一个用户请求;并发使用多个线程实现;n进程,n*m个线程;
- 事件模型:event, 一个线程响应多个用户请求,基于事件驱动机制来维持多个用户请求;