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 ...
随机推荐
- 【hive】 hive 加载数据
1. insert 插入数据 要保证启动了jobhistory 否则会抛出异常 hdfs中查看内容 2. create table 表名字 select 字段... from 表名 hdfs查看数据 ...
- [Android] 基于 Linux 命令行构建 Android 应用(五):Ant 构建命令
Android SDK 提供的 android 工具可以在项目根目录自动生成 Ant 构建文件 build.xml[1].进入项目根目录后,你可以使用以下 Ant 命令[2]. ant clean 清 ...
- 二叉树的遍历--C#程序举例二叉树的遍历
二叉树的遍历--C#程序举例二叉树的遍历 关于二叉树的介绍笨男孩前面写过一篇博客 二叉树的简单介绍以及二叉树的存储结构 遍历方案 二叉树的遍历分为以下三种: 先序遍历:遍历顺序规则为[根左右] 中序遍 ...
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验四:按键模块③ — 单击与双击
实验四:按键模块③ - 单击与双击 实验三我们创建了"点击"还有"长点击"等有效按键的多功能按键模块.在此,实验四同样也是创建多功能按键模块,不过却有不同的有效 ...
- 【BZOJ4637】期望 Kruskal+矩阵树定理
[BZOJ4637]期望 Description 在米国有一所大学,名叫万国歌剧与信息大学(UniversalOperaandInformaticasUniversity).简称UOI大学.UOI大学 ...
- Web 通信 之 长连接、长轮询(long polling)(转载)
基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性. 一.什么是长连接.长轮询? 用通俗易 ...
- 180425、cookie工具类
package com.thinkgem.jeesite.common.utils; import java.io.UnsupportedEncodingException; import java. ...
- js事件绑定的几种方式
在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数 一. 在DOM元素中直接绑定 这里的DOM元素,可以理解为HTM ...
- easyui tree 更改图标
easyui tree 更改图标 ,onLoadSuccess: function (node, data) { $('#tt .tree-icon').css("background&qu ...
- SPOJ - TSUM 母函数+FFT+容斥
题意:n个数,任取三个加起来,问每个可能的结果的方案数. 题解:构造母函数ABC,比如现在有 1 2 3 三个数.则 其中B表示同一个数加两次,C表示用三次.然后考虑去重. A^3表示可重复地拿三个. ...