NginxI/O模型理论基础

时间:2023-03-09 04:45:16
NginxI/O模型理论基础

I/O模型介绍

同步IO

关注的是消息通信机制  调用者需要等待被调用者先执行完毕才能往下继续执行   被调用者在执行完自己的任务后并不会同之调用者执行结果需要调用者自己去获取被调用者的执行状态

异步IO

关注的是消息通信机制     调用者向被调用者发起调用后 被调用者会自动通过状态,通知或者回调机制主动通知调用者自己的运行状态

阻塞IO

关注调用者在等待结果返回之前所处的状态     指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者会被挂起

非阻塞IO

关注调用者在等待结果返回之前所处的状态     指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成直到最终的调用结果返回之前 调用者都不会被挂起

以洗衣机洗衣服为例子说明

同步阻塞

同步:洗衣机洗完衣服后不会通知你,所以你不知道具体什么时候洗完

阻塞: 洗衣机在洗完衣服之前人是不能做其它任何事情 必须守在洗衣机跟前 浪费时间和精力

说明:

整个IO请 求的过程中,用户线程是被阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够

同步非阻塞

同步:洗衣机洗完衣服后不会通知你,所以你不知道具体什么时候洗完

非阻塞:  洗衣机在洗完衣服之前人是可以去做其它事情,但是由于不知道什么时候洗完 需要人隔一段时间就放下当前正在做的事情,跑去洗衣机跟前看看是否洗完衣服 人这样来回的询问也会浪费掉许多时间和精力

说明:

整个IO请求的过程,虽然用户线程每次发起IO请求后可以立即返回,但是为 了等到数据,仍需要不断地轮询、重复请求,消耗了大量的CPU的资源.是比较浪费CPU的方式,一般很少直接使用这种模型

异步阻塞

异步:洗衣机洗完衣服后会自动发出声响通知人衣服已经洗完

阻塞: 在洗衣机洗完衣服之前人会一直站在洗衣机跟前什么也不干  浪费资源

异步非阻塞

异步:洗衣机洗完衣服后会自动发出声响通知人衣服已经洗完

非阻塞: 人在启动洗衣机后便可以去看电视了,在洗衣的过程中人看电视和洗衣服两件事情互相不干扰.等洗衣机洗完衣服后发出响声,这个时候人就知道洗衣已经完成

IO多路复用模型

多个连接共用一个等待机制,本模型会阻塞进程,但是进程是阻塞在select或者poll这两 个系统调用上,而不是阻塞在真正的IO操作上 .从流程上来看,使用select函数进行IO请求和同步阻塞模型没有太大的区别,甚至还多了添加监视IO,以及调用select函数的额外操作,效率更差.但是select可以监控多个IO上是否已有IO操作准备就绪,即可达到在 同一个线程内同时处理多个IO请求的目的.而不像阻塞IO那种,一次只能监控一个IO.

IO多路复用是最常使用的IO模型,但是其异步程度还不够“彻底”,因为它使用了会阻 塞线程的select系统调用.因此IO多路复用只能称为异步阻塞IO模型,而非真正的异步 IO

信号驱动IO模型

1.数据从磁盘读取到内核空间这段时间不阻塞

2.数据从内核拷贝到用户空间这段时间是阻塞的

用户进程可以通过sigaction系统调用注册一个信号处理程序,然后主程序可以 继续向下执行,当有IO操作准备就绪时(数据已经到达内核空间),由内核通知触发一个SIGIO信号处理程 序执行,然后将用户进程所需要的数据从内核空间拷贝到用户空间这段时间相当于是阻塞的

异步IO模型

异步IO与信号驱动IO最主要的区别是信号驱动IO是由内核通知何时可以进行IO 操作,而异步IO则是由内核告诉我们IO操作何时完成了。具体来说就是,信号 驱动IO当内核通知触发信号处理程序时,信号处理程序还需要阻塞在从内核空 间缓冲区拷贝数据到用户空间缓冲区这个阶段,而异步IO直接是在第二个阶段 完成后内核直接通知可以进行后续操作了

NginxI/O模型理论基础

select机制

几乎支持所有的平台,本质上就是通过设置或者检查存放fd标志位的数据结构来进行下一步处理

单个进程可监视的fd数量被限制,即能监听的端口数量有限

对socket是线性扫描,即采用轮询的方式,效率低下

select采取了内存拷贝方法来实现内核将fd消息通知给用户空间,这样一个用来存放大量fd的数据结构,这样会使的用户空间和内核空间在传递该结构时开销巨大

poll机制

本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态

没有最大连接数的限制,原因是它是基于链表来存储

大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是否有意义

poll的特点是  "水平触发" 如果报告了fd后 没有被处理,那么下次还会报告该fd

epoll机制

支持 "边缘触发"  它只通知进程哪些fd刚刚变为就绪态,并且只会通知一次

使用 事件 的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知

没有最大并发连接的限制

非轮询的方式,不会随着fd数目的增加而效率下降.只有活跃可用的fd才会调用callback函数,即epoll最大的优点就在于它只管理活跃的连接而跟连接总数无关

内存拷贝 利用mmap加速与内核空间的消息传递   即epoll使用mmap减少复制开销

NginxI/O模型理论基础

术语介绍

event-driven(事件驱动)

异步通知,采用callback的回调机制来通知应用程序哪些fd已经处于就绪态状态

aio(异步IO)

异步IO  把文件写入磁盘的时候 先把内容写入缓冲区中 然后再由系统后台慢慢的从缓冲区同步到磁盘

sendfile

把硬盘数据拷贝到 kernel buffer,然后数据被 kernel 直接拷贝到另外一个与 socket 相关的 kernel buffer

默认要把读取的数据从内核态拷贝到应用态 应用态把数据进行应用层报文封装 然后再把封装好的数据再次拷贝回内核态进行网络发送 sendfile机制减少了这个过程

mmap(内存映射)

在内存中开辟一块空间来映射磁盘文件对应占用的大小,读取或者修改文件直接操作对应的内存空间即可,大大提高了操作效率.减少了文件从磁盘读入内存的开销

NginxI/O模型理论基础