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 ...
随机推荐
- [Python] Python 虚拟机 - virtualenv
virtualenv virtualenv 用于创建一个隔离的 Python 环境. 每个项目都有自己的依赖包,这些依赖包有时存在版本冲突,处理这种情况最好方法就是为每个项目创建一个专属的环境. 安装 ...
- distri.lua线程间通信的设计
首先简单介绍下distri.lua中的线程设计方案. distri.lua提供一个API函数fork用于创建新的C线程,这个C线程运行独立的lua虚拟机,为了在各线程之间通信 每个线程都会创建一个ch ...
- Tiobe最新编程语言排行
https://www.tiobe.com/tiobe-index/
- SQL Server 2012 R2升级到SQL Server 2016无法正常启动数据库服务解决方案
原定周末把公司的TFS升级到2018,由于TFS 2018需要SQL Server至少是2016以上版本,所以还需要将原来的SQL Server 2012 R2一并升级.今天早上负责的同事告诉我升级失 ...
- 设备重力感应 window.DeviceOrientationEvent
设备屏幕方向与运动 https://developers.google.cn/web/fundamentals/native-hardware/device-orientation/ MDN devi ...
- ELK之使用kafka作为消息队列收集日志
参考:https://www.cnblogs.com/fengjian2016/p/5841556.html https://www.cnblogs.com/hei12138/p/7805475 ...
- CentOS7 下安装mysql历程
一.成功他妈的经历 背景(废话不用看):自己对Linux不是很熟悉,说难听点就是门都没有么到!基于这近年大数据之类的热闹话题,自己就想学习一下!开始下的是Minimal ISO这个版本,Vbox5虚拟 ...
- informix数据库触发器的写法
虽然有各种数据库,但触发器的原理都是一样的,懂一种数据库的写法就可以了解其他的. 以前写过mysql数据库的触发器,这次写informix的,还顺带看了oracle的,除了语法上的不同,informi ...
- 网站性能优化实战——从12.67s到1.06s的故事
文章摘自https://juejin.im/post/5b0b7d74518825158e173a0c 作为互联网项目,最重要的便是用户体验.在举国“互联网+”的热潮中,用户至上也已经被大多数企业所接 ...
- piano class 12
1,不要记谱子,眼睛要一直看着谱子,手指凭感觉找琴键 2,弹的时候一定要按照谱子上标出来的指法弹奏,很重要 3,两只手要会跷跷板弹奏 4,八分音符,一般第二个会比第一个弱一点,但是要看自己感觉 5,慢 ...