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直接是在第二个阶段 完成后内核直接通知可以进行后续操作了

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减少复制开销

术语介绍
event-driven(事件驱动)
异步通知,采用callback的回调机制来通知应用程序哪些fd已经处于就绪态状态
aio(异步IO)
异步IO 把文件写入磁盘的时候 先把内容写入缓冲区中 然后再由系统后台慢慢的从缓冲区同步到磁盘
sendfile
把硬盘数据拷贝到 kernel buffer,然后数据被 kernel 直接拷贝到另外一个与 socket 相关的 kernel buffer
默认要把读取的数据从内核态拷贝到应用态 应用态把数据进行应用层报文封装 然后再把封装好的数据再次拷贝回内核态进行网络发送 sendfile机制减少了这个过程
mmap(内存映射)
在内存中开辟一块空间来映射磁盘文件对应占用的大小,读取或者修改文件直接操作对应的内存空间即可,大大提高了操作效率.减少了文件从磁盘读入内存的开销

NginxI/O模型理论基础的更多相关文章
- 【小白的CFD之旅】16 流程
那天听了小牛师兄关于CFD应用的四种境界的说法后,小白发现自己连第一种境界都算不上,自己对于CFD还只是停留在做了少数几个案例的基础上,可以说是对其一无所知.不过小白不是那种遇到挫折就退缩的人,他决定 ...
- 机器学习理论基础学习13--- 隐马尔科夫模型 (HMM)
隐含马尔可夫模型并不是俄罗斯数学家马尔可夫发明的,而是美国数学家鲍姆提出的,隐含马尔可夫模型的训练方法(鲍姆-韦尔奇算法)也是以他名字命名的.隐含马尔可夫模型一直被认为是解决大多数自然语言处理问题最为 ...
- 机器学习理论基础学习3.4--- Linear classification 线性分类之Gaussian Discriminant Analysis高斯判别模型
一.什么是高斯判别模型? 二.怎么求解参数?
- 「视频直播技术详解」系列之七:直播云 SDK 性能测试模型
关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 本系列文章大纲如下: ...
- Unity3D游戏开发初探—2.初步了解3D模型基础
一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...
- 基于海明距离的加权平均值人职匹配模型(Sqlserver2014/16内存表实现)
最近给某大学网站制作一个功能,需要给全校所有的学生提供就业单位发布职位的自动匹配,学生登陆就业网,就可以查看适合自己的职位,进而可以在线投递. 全校有几万名学生,注册企业发布的职位也有上万,如何在很短 ...
- [zz] 混合高斯模型 Gaussian Mixture Model
聚类(1)——混合高斯模型 Gaussian Mixture Model http://blog.csdn.net/jwh_bupt/article/details/7663885 聚类系列: 聚类( ...
- AngularJS理论基础
AngularJS理论基础 AngularJs是一个用于设计动态web应用的结构框架. 它是一个框架,不是类库,是像EXT一样提供一整套方案用于设计web应用.它不仅仅是一个javascript框架, ...
- 使用LFM(Latent factor model)隐语义模型进行Top-N推荐
最近在拜读项亮博士的<推荐系统实践>,系统的学习一下推荐系统的相关知识.今天学习了其中的隐语义模型在Top-N推荐中的应用,在此做一个总结. 隐语义模型LFM和LSI,LDA,Topic ...
随机推荐
- 为C函数自动添加跟踪语句
目录 为C函数自动添加跟踪语句 声明 一. 问题提出 二. 代码实现 2.1 函数匹配测试 2.2 插入跟踪语句 三. 效果验证 为C函数自动添加跟踪语句 标签: Python 正则表达式 声明 本文 ...
- HTML5——表单美化
闲聊: 今天小颖在跟着慕课网学习:表单美化 看完了自己跟着敲了敲,顺便做个笔记嘻嘻,好记性不如烂笔头,脑子记不住,就写成笔记,以后也方便查看,嘻嘻. 正文: 1.表单美化_单选按钮篇 2.表单美化_复 ...
- js---手机端滑动进度条
最近做项目,有一个滑动音乐播放进度条的效果,但是使用input的 range 来做会出现一些问题,想了想还是用JS来写.直接上代码: <!doctype html> <html la ...
- spring的一些其他功能
今天看书,知识点多一点了,涉及到了较多的知识,如scheduling计划任务,spring对多线程的支持,以及配置开发.测试和生产环境的profile.这些都是集成在spring中的,需要用时可以参考 ...
- ubuntu-18.04 root登录图形界面失败问题解决方案
一.设置root密码 二.进入/etc/pam.d目录 主要修改两个文件(圈了红色框框),记得命令行下切换root账户(sudo -i)进行vim修改,刚安装的ubuntu没有vim支持,请根据提示进 ...
- C#5种方式生成缩略图
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- 电子产品使用感受之--Windows 10 小米笔记本Air HDMI转VGA无信号问题
最近一直通过HDMI转VGA线缆链接我的戴尔P2314H显示器,前天睡觉前,看到电脑上英伟达显卡推了驱动更新,顺手更新了一下,就去睡觉了,转天晚上再用,HDMI接口就没有信号了,上网查了一些信息,获知 ...
- HDU 4699 - Editor - [对顶栈]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4699 Problem Description Sample Input8I 2I -1I 1Q 3LD ...
- python与pycharm安装
1.python install 1.1 下载安装包 - https://www.python.org/downloads 1.2 installl 1.2.1 双击exe安装文件 1.3 如果安装 ...
- ATM JAVA实现 部分代码
package score;//信1705-2 20173600 王重阳 import java.util.Scanner; public class Main { public static voi ...