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模型理论基础的更多相关文章

  1. 【小白的CFD之旅】16 流程

    那天听了小牛师兄关于CFD应用的四种境界的说法后,小白发现自己连第一种境界都算不上,自己对于CFD还只是停留在做了少数几个案例的基础上,可以说是对其一无所知.不过小白不是那种遇到挫折就退缩的人,他决定 ...

  2. 机器学习理论基础学习13--- 隐马尔科夫模型 (HMM)

    隐含马尔可夫模型并不是俄罗斯数学家马尔可夫发明的,而是美国数学家鲍姆提出的,隐含马尔可夫模型的训练方法(鲍姆-韦尔奇算法)也是以他名字命名的.隐含马尔可夫模型一直被认为是解决大多数自然语言处理问题最为 ...

  3. 机器学习理论基础学习3.4--- Linear classification 线性分类之Gaussian Discriminant Analysis高斯判别模型

    一.什么是高斯判别模型? 二.怎么求解参数?

  4. 「视频直播技术详解」系列之七:直播云 SDK 性能测试模型

    ​关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 本系列文章大纲如下: ...

  5. Unity3D游戏开发初探—2.初步了解3D模型基础

    一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...

  6. 基于海明距离的加权平均值人职匹配模型(Sqlserver2014/16内存表实现)

    最近给某大学网站制作一个功能,需要给全校所有的学生提供就业单位发布职位的自动匹配,学生登陆就业网,就可以查看适合自己的职位,进而可以在线投递. 全校有几万名学生,注册企业发布的职位也有上万,如何在很短 ...

  7. [zz] 混合高斯模型 Gaussian Mixture Model

    聚类(1)——混合高斯模型 Gaussian Mixture Model http://blog.csdn.net/jwh_bupt/article/details/7663885 聚类系列: 聚类( ...

  8. AngularJS理论基础

    AngularJS理论基础 AngularJs是一个用于设计动态web应用的结构框架. 它是一个框架,不是类库,是像EXT一样提供一整套方案用于设计web应用.它不仅仅是一个javascript框架, ...

  9. 使用LFM(Latent factor model)隐语义模型进行Top-N推荐

    最近在拜读项亮博士的<推荐系统实践>,系统的学习一下推荐系统的相关知识.今天学习了其中的隐语义模型在Top-N推荐中的应用,在此做一个总结. 隐语义模型LFM和LSI,LDA,Topic ...

随机推荐

  1. python日志,一个改版SMTPHandler

    1.官方logging包的SMTPHandler不支持ssl的邮箱,修改成兼容ssl以支持大部分国内邮箱. 2.增加一个频率控制的参数,比如要设置一个报警邮件,异常时候通知我们,但假设1分钟内异常几千 ...

  2. 【中间件安全】Tomcat 安全加固规范

    1. 适用情况 适用于使用Tomcat进行部署的Web网站. 2. 技能要求 熟悉Tomcat配置操作,能够利用Tomcat进行建站,并能针对站点使用Tomcat进行安全加固. 3. 前置条件 1.根 ...

  3. DLL断点调试

    一般来说调试DLL是把DLL工程和exe工程放到一个解决方案里.如果不放到一个解决方案里,那两者的输出目录要一致,属性-连接器-常规-输出目录.保证dll,dll的pdb,exe,exe的pdb在一个 ...

  4. VIM 的帮助文档在哪里?看这里。

    我一直奇怪,像VIM这么优秀的软件怎么就没有个详细的文档. 再优秀,新手不会用也是白搭啊.再说,谁生下来就是老手么? 只有那个简单的tutor么? 虽说看了这个tutor也能用了,但作为“编辑器之神” ...

  5. Java实现五子棋

    代码: package com.hotusm.datastructure.list; import com.hotusm.datastructure.Log; /** * @author luqiba ...

  6. css3整理--background-size

    background-size语法: /*Mozilla*/ -moz-background-size: auto || <length> || <percentage> || ...

  7. [原]openstack-kilo--issue(十九) ImportError: Could not import settings 'openstack_dashboard.settings' (Is it on sys.path? Is there an import error in the settings file?): No module named main

    查看此问题的时候请先查看 这个问题包含在(十)中,此篇只是从(十)中分离出来 openstack-kilo--issue(十)ERROR: openstack Unable to establish ...

  8. Spring MVC Redis 整合笔记

    extends:http://blog.csdn.net/defonds/article/details/48716161, http://blog.csdn.net/java2000_wl/arti ...

  9. ORM正向和反向查询

    表结构 from django.db import models # Create your models here.class Publisher(models.Model): id = model ...

  10. 使用 vm 加载文件中的数据到变量里面

    .json 不能写注释, 还需要严格的双引号 或者使用 .json5 // test.db [ // name {name: 1} ] // test.js const fs = require('f ...