目录

23.1 IO模型

IO模型

/images/linux_mt/linux_mt1.jpg

nginx 是一个 web 服务器,同时还能作为 http 协议的反向代理服务器。相比于 http,nginx 使用了更先进的 IO 模型,异步通信以及进程间通信的技术,能支持更多的并发请求,具有更高的性能和稳定性。本章我们首先来学习如何使用 nginx 配置一个 web serve,nginx 的反向代理功能我们留在 28 章再来介绍。本章内容包括

  1. IO 事件模型
  2. nginx 框架与配置
  3. nginx web 服务配置

有关 web 的基础概念和 http 协议的内容将不再此累述,大家可以回看以下几个章节:

想要讲清楚 IO 模型并不容易,对于没有编程经验的来说这是一个很抽象的概念。想理解这个概念可以从以下几点入手:

  1. 我们的 web 需要同时响应多个用户请求,但是我们的程序通常是顺序执行的,一次只能响应一个用户请求
  2. 响应的内容通常位于磁盘上,而读取磁盘文件,利用网卡发送数据包都是内核提供的功能,应用程序需要发起系统调用
  3. 在系统调用返回结果之前,发起调用的应用程序通常只能等待

总结起来就是,web 程序需要同时处理多个用户请求,但是程序通常是顺序执行的,且经常经常阻塞在磁盘和网络 IO 之上。为能够为多个用户同时提供响应我们需要新的技术,这些技术目的是提高程序的 IO 效率称为 IO 模型。要想明白 IO 模型,我们首先要明白系统调用的过程。

1. IO 系统调用

1.1 IO 过程

/images/linux_mt/sync_block.png

我们以读取磁盘文件为例:

  1. 当我们需要读取文件时,首先发起 read 系统调用
  2. 此时会陷入内核,执行内核代码,将数据从磁盘读取到内核缓冲区中
  3. 将内核缓冲区中的数据从内核拷贝到应用程序内存空间

1.1 同步/异步

同步/异步关注的是

  1. 被调用者,如何通知调用者,即被调用者与调用者之间消息通知的机制
  2. 在 IO 上就是应用程序与操作系统的交互方式

1.2 阻塞/非阻塞

阻塞/非阻塞关注的是

  1. 调用者如何等待结果,即调用程序的执行模式

1.3 IO 模型类别

/images/linux_mt/io.jpg

  1. 同步阻塞
  2. 同步非阻塞
  3. IO复用(事件驱动IO):select, poll,epoll:
  4. 信号驱动I/O
  5. 异步IO

参考连接:

2. httpd 的IO 模型

  1. 多进程模型:prefork, 一个进程响应一个用户请求,并发使用多个进程实现;
  2. 多线程模型:worker, 一个进程生成多个线程,一个线程响应一个用户请求;并发使用多个线程实现;n进程,n*m个线程;
  3. 事件模型:event, 一个线程响应多个用户请求,基于事件驱动机制来维持多个用户请求;