Nginx学习笔记(一)——理解IO模型

I/O请求概述

操作系统根据使用者的不同分为用户空间和内核空间,Apache、Nginx等是运行在用户空间对外提供服务的程序,一个服务器应该尽可能多的运行在用户空间来接受业务请求。

一个完整的I/O请求步骤为:

1.客户端与服务器建立连接发出请求,服务器接受请求(1--2),此时的I/O为网络I/O,网络I/O在服务器的内核中完成。

2.当客户端发起一个请求,服务器接收到该请求,并在用户空间启动一个进程或线程进行响应,直到服务器构建响应完成的过程(3--5)称为服务器      的I/O过程。

3.服务器将已构建好的响应再通过内核空间的网络I/O发还给客户端,同时将本次请求记录到日志中。

整个过程中服务器先在内核空间接收响应,而后在用户空间处理请求并构建响应,最后再通过内核空间的网络I/O发送响应。在用户空间处理请求构建响应的过程(3--5)就是我们通常所说的I/O过程,此过程也可以看作是一次客户端向服务器端调用资源请求的过程,客户端是调用者;服务器端是被调用者。

I/O的类型划分

根据调用者和被调用者的角度不同,可以将I/O请求类型分为:

1.同步、异步

同步和异步关注的是消息通知机制。同步:调用发出不会立即返回,但一旦返回就可以返回最终结果;异步:调用发出之后,被调用方立即返回消      息,但返回的非最终结果,被调用者通过状态、通知机制来通知调者,或通过回调函数来处理结果。

2.阻塞、非阻塞

阻塞和非阻塞关注的是调用者等待结果(消息、返回值)时的状态。阻塞:调用结果返回之前,调用者(使用的进程或线程)会被挂起,调用者只      有在得到结果之后才会返回;非阻塞:调用结果返回之前,调用不会阻塞当前线程。

I/O模型的划分

根据上述类型,I/O模型就可分为5种:同步阻塞、同步非阻塞、I/0复用、事件驱动和异步非阻塞(AIO)

要弄清I/O模型,首先要详细了解一个请求从开始到响应结束的过程。我们知道操作系统分为内核空间和用户空间,一个进程或线程同一时间只能处理一个I/0请求,当客户端发出一个请求后,服务器端会生成一个进程或线程来处理这个请求,所有的请求最终调用的是本地文件系统上的一个资源,而可以调用本地文件系统资源的只有内核,此时操作系统会由用户空间转入内核空间,此阶段为wait for data,当内核将本地文件系统上的资源加载到内核内存后,由于内核内存不允许用户空间的程序访问,还要将内核内存中的资源复制到用户空间的进程或线程内存中,此时阶段为copy data,复制完成后再由内核空间转入用户空间构建响应发送给客户端。5种I/O模型的区别就是在wait for data和copy data阶段的不同。

1.同步阻塞

当客户端发出请求后,服务器端使用一个进程处理求情,直到返回最终结果,整个过程中进程被挂起转入睡眠中,不再处理其他请求。

2.同步非阻塞

当客户端发出请求后,服务器端使用一个进程处理求情并立即给客户端返回一个消息,由于没有通知机制,客户端需要不停的检测响应是否以构建完成,此时称为忙等待,在copy data阶段进程仍然处于阻塞状态。

3.I/O复用

此模型可以理解为当客户端发出请求后,服务器端有一个代理进程处理求情,代理进程转而将具体的处理操作转交给其他进程处理,继续接受用户的请求,和上述两种模型不一样的地方是接收和处理用户请求不是同一个进程,此时用户请求是被阻塞在代理进程上。Apache默认prefork工作模式的select模型就是使用的这种I/O模型,由于接收用户请求是一个进程,而处理请求是另外一个进程,所以prefork模式默认支持1024个并发连接,超出这个并发数量就会因为进程间调度的开销导致效率递减。

4.事件驱动

当客户端发出请求后,服务器端使用一个进程处理求情,并立即给客户端返回一个消息,在copy data阶段进程仍然处于阻塞状态,处理完成后发送通知给请求者转而接收下一个请求。epoll机制采用的就是这种事件驱动I/O模型,发送通知又分为水平触发和边缘触发2种方式。水平触发:进程不断的给请求者发送通知直到来取数据为止;边缘触发:进程只给请求者发送一次通知。

5.异步非阻塞(AIO)

当客户端发出请求后,服务器端使用一个进程处理求情并立即给客户端返回一个消息,转而接收下一个请求,后续的处理由内核来完成,处理完成后发送通知给请求者。整个过程中用户和进程都没有被阻塞,提高了并发处理请求的能力。

优化机制

经常听到的优化机制有send file和mmap,通过一个I/O请求从开始到响应结束的过程我们知道,系统会先把请求的资源加载到内核空间,然后再复制到用户空间构建响应完成后再到内核空间进行发送,其中内核空间复制到用户空间打包再转入内核空间的过程中数据本身并没有改变,而白白浪费了时钟周期,所以send file机制就是当资源在内核空间加载完成后直接构建响应发送给请求者,而不进入用户空间,以减少中间环节提升效率;mmap与之类似,是在内核空间内存中画出一段空间供用户控件的程序访问而不再需要将数据复制到用户空间。

时间: 2024-10-16 18:16:44

Nginx学习笔记(一)——理解IO模型的相关文章

最大熵学习笔记(四)模型求解

  生活中我们经常听到人们说"不要把鸡蛋放到一个篮子里",这样可以降低风险.深究一下,这是为什么呢?其实,这里边包含了所谓的最大熵原理(The Maximum Entropy Principle).本文为一则读书笔记,将对最大熵原理以及由此导出的最大熵模型进行介绍,重点给出其中所涉及数学公式的理解和详细推导. 相关链接 最大熵学习笔记(零)目录和引言 最大熵学习笔记(一)预备知识 最大熵学习笔记(二)最大熵原理 最大熵学习笔记(三)最大熵模型 最大熵学习笔记(四)模型求解 最大熵学习笔

Django学习笔记(三)—— 模型 model

疯狂的暑假学习之 Django学习笔记(三)-- 模型 model 参考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # 用什么数据库管理系统 'NAME': '', # 数据库名称,如果用sqlite,要写完整路径 'USER': '', # 如果用sqlite,这个不用写 'PASSWORD': '', # 如果用sqlite,这个不用写

nginx学习笔记之基于端口的虚拟主机基于主机名的虚拟主机root、alias、index配置

nginx学习笔记之基于端口的虚拟主机基于主机名的虚拟主机root.alias.index配置 实验环境: centos 测试节点IP:172.16.3.101 基于端口的虚拟主机: vim /etc/nginx/nginx.conf # 向里面的http {}里面加入如下内容   server { # server定义一个虚拟主机         listen 8080; # 监听本机所有IP端口8080         server_name www.test.com; # 虚拟主机名为:w

树莓派学习笔记——使用文件IO操作GPIO SysFs方式

0 前言 本文描述如果通过文件IO sysfs方式控制树莓派 GPIO端口.通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction和value等,direction控制GPIO方向,而value可控制GPIO输出或获得GPIO输入. Linux学习可从应用出发,先不纠结Linux驱动编写,先把Linux给玩起来. [相同与不同] 本文和[EasyARM

Javascript MVC 学习笔记(一) 模型和数据

写在前面 最近在看<MVC的Javascript富应用开发>一书,本来是抱着一口气读完的想法去看的,结果才看了一点就傻眼了:太多不懂的地方了.只好看一点查一点,一点一点往下看吧,进度虽慢但也一定要坚持看完.本学习笔记是对书上所讲解内容的理解和记录. 笔记里的代码大多会按书上摘录下来,因为<MVC的Javascript富应用开发>是结合了JQuery库,所以对于JQuery中不太懂的知识点也会附在代码后面,也算是一些额外的收获. MVC概述 要学习MVC,首先得知道MVC是什么,MV

Direct-X学习笔记--封装一个网格模型类

之前学习了网格模型的导入,绘制,了解了X文件等相关知识,但是,那样绘制比较麻烦,而且绘制一个模型需要好多代码,完全是面向过程的思维,这次,学习一下怎么把网格模型的导入以及绘制等功能封装在一个类中.顺便加深一下对World Transform的理解.感觉自己的3D思维还是没有培养起来,想绘制一个对象,绘制出来和想象中的位置相差甚远. 一.复习一下网格模型相关知识 网格模型就是一个我们在美术工具中制作好的资源,通过一些API接口我们可以将美术童鞋做好的模型很方便的导入程序中.我们只需要了解怎样从文件

ARMV8 datasheet学习笔记5:异常模型

1.前言 2.异常类型描述 见 ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(1)-EL/ET/ST 一文 3. 异常处理路由对比 AArch32.AArch64架构下IRQ 和Data Abort 异常处理流程图对比. 3.1 IRQ 路由 3.1.1.   AArch32 IRQ 路由 图 AArch32 IRQ 路由 3.1.2.    AArch64 IRQ 路由 图 AArch64 IRQ路由 图 AArch64 IRQ向量查找 3.2.     D

Python学习笔记__9章 IO编程

# 这是学习廖雪峰老师python教程的学习笔记 1.概览 IO在计算机中指Input/Output,也就是输入和输出. 由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,所以涉及到数据交换的地方,通常是磁盘.网络等,这些地方就需要IO接口. 数据从内存往外发是Output 数据从外往内存发是Iutput 2.同步IO和异步IO 同步IO:发起IO请求后,等到IO的返回结果,在接着往下执行 异步IO:发起IO请求后,可以去做其他事.IO结果返回后,会通知调用者. 注:本章所讲

Python学习:并发编程之IO模型

本节内容: I/O模型介绍 阻塞I/O(blocking IO) 非阻塞I/O(non-blocking IO) 多路复用I/O(IO multiplexing) 异步I/O(Asynchronous I/O) IO模型比较分析 selectors模块 一 IO模型介绍 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wik