一.事件驱动模型

服务器处理模型程序,通常有以下几种:

(1)收到一个请求则创建一个新的进程来处理这个请求

(2)收到一个请求则创建一个新的线程来处理这个请求

(3)收到一个请求,把它放入事件列表,让主进程通过非阻塞IO的方式来处理请求(如图所示),python中的协程就是通过这种方式来处理的

非事件驱动和事件驱动的比较:

非事件驱动:在需要等待某个条件触发时,会不断的检查这个条件,直到条件满足,很浪费cpu

事件驱动:在等待某个条件触发时有机会释放cpu,进入睡眠状态,当事件触发时cpu会唤醒它,这样更加有效的使用cpu

二、IO多路复用

1.什么叫IO多路复用?看图说话,用心体会

2.阻塞IO,看图说话

(1)程序发出系统调用,程序阻塞等待系统回应(数据等待,阻塞状态)

(2)系统收到数据并且把数据从内核拷贝到用户区(数据拷贝,阻塞状态)

(3)程序收到系统回应继续运行

结论:等待数据和拷贝数据这两个阶段都是阻塞的

3.非阻塞IO,看图说话

(1)程序定时向系统发送数据请求(非阻塞,但是消耗cpu性能)

(2)系统收到数据并把数据从内核区拷贝到用户区(阻塞)

(3)程序收到系统回应继续运行

结论:在等待数据阶段,定时向系统询问是不是有数据,这个阶段不是阻塞的,但是很消耗cpu时间,另外一个弊端就是数据到达不是及时处理的,因为在询问中间有时间间隔,第二个阶段跟跟阻塞IO是一样的

4.IO多路复用,看图说话

(1)比较IO多路复用的图和阻塞IO的图,发现区别不大,只是中间多了一步

(2)对于单个连接来说,IO多路复用还比不上阻塞IO和非阻塞IO

(3)IO多路复用主要适用于多个连接,不适用于单个连接

5.异步IO

这个就牛逼了

对于前面提到的两个阻塞,在这里都不阻塞

6.区分两个概念

首先是阻塞和非阻塞:

阻塞就是程序进入休眠状态,不会继续往下执行,交出cpu使用权限,非阻塞则相反;

异步和同步:

程序运行过程中只要某个阶段出现阻塞状态就为同步,反之则是异步

7.IO多路复用的应用:select poll epoll

select

    • 它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作。 
      select目前几乎在所有的平台上支持 
        
      select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,不过可以通过修改宏定义甚至重新编译内核的方式提升这一限制。 
        
      另外,select()所维护的存储大量文件描述符的数据结构,随着文件描述符数量的增大,其复制的开销也线性增长。同时,由于网络响应时间的延迟使得大量TCP连接处于非活跃状态,但调用select()会对所有socket进行一次线性扫描,所以这也浪费了一定的开销。

poll 
      它和select在本质上没有多大差别,但是poll没有最大文件描述符数量的限制。 
      一般也不用它,相当于过渡阶段

epoll

      直到Linux2.6才出现了由内核直接支持的实现方法,那就是epoll。被公认为Linux2.6下性能最好的多路I/O就绪通知方法。windows不支持

      没有最大文件描述符数量的限制。 比如100个连接,有两个活跃了,epoll会告诉用户这两个两个活跃了,直接取就ok了,而select是循环一遍。

市面上上见到的所谓的异步IO,比如nginx、Tornado、等,我们叫它异步IO,实际上是IO多路复用。

      

8.IO模型的更多相关文章

  1. 高性能IO模型浅析

    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking  ...

  2. 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型

    1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...

  3. Linux下常见的IO模型

    前言 阻塞IO(blocking IO) 非阻塞IO(nonblocking IO) IO复用(IO multiplexing) 异步IO(asynchronous IO (the POSIX aio ...

  4. IO模型

    前言 说到IO模型,都会牵扯到同步.异步.阻塞.非阻塞这几个词.从词的表面上看,很多人都觉得很容易理解.但是细细一想,却总会发现有点摸不着头脑.自己也曾被这几个词弄的迷迷糊糊的,每次看相关资料弄明白了 ...

  5. Linux下5种IO模型的小结

    概述 接触网络编程,我们时常会与各种与IO相关的概念打交道:同步(Synchronous).异步(ASynchronous).阻塞(blocking)和非阻塞(non-blocking).关于概念的区 ...

  6. 操作系统IO模型

    操作系统IO模型 声明:如下内容是根据APUE和mycat两本著作中关于I/O模式的一些内容加上自己的一些理解整理而成,仅供学习使用. 本节内容 UNIX下可用的五种I/O模型 三种I/O模型 Rea ...

  7. 同步异步,阻塞非阻塞 和nginx的IO模型

    同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication).所谓同步,就是在发出一个*调用*时,在没有得 ...

  8. 几种服务器端IO模型的简单介绍及实现

    一些概念: 同步和异步 同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发I/O操作并等待或者轮询的去查看I/O操作是否就绪,而异步是指用户进程触发I/O操作以后便开始做自己的事情,而 ...

  9. Linux 网络编程(IO模型)

    针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...

  10. Atitit  五种IO模型attilax总结 blocking和non-blocking synchronous IO和asynchronous I

    Atitit  五种IO模型attilax总结 blocking和non-blocking synchronous IO和asynchronous I   1.1. .3 进程的阻塞1 1.2. 网络 ...

随机推荐

  1. 5.hadoop常用命令

    1. 单独启动和关闭hadoop服务 启动名称节点 #hadoop-daemon.sh start namenode 启动数据节点 #hadoop-daemons.sh start datanode ...

  2. POJ 2187 Beauty Contest(凸包+旋转卡壳)

    Description Bessie, Farmer John's prize cow, has just won first place in a bovine beauty contest, ea ...

  3. DAY3敏捷冲刺

    站立式会议 工作安排 (1)服务器配置 (2)数据库配置 燃尽图 燃尽图有误,已重新修改,先贴卡片的界面,后面补修改后燃尽图 代码提交记录

  4. lintcode-185-矩阵的之字型遍历

    185-矩阵的之字型遍历 给你一个包含 m x n 个元素的矩阵 (m 行, n 列), 求该矩阵的之字型遍历. 样例 对于如下矩阵: [ [1, 2, 3, 4], [5, 6, 7, 8], [9 ...

  5. Swift-创建UIButton(其他UI组件雷同)

    let button = UIButton.init(frame: CGRectMake(, , , )) button.setTitle("按钮", forState: UICo ...

  6. Maven jeetsite项目 搭建

    , 一直没有系统的总结一下Maven的知识,今天,想从网上找一个Maven的项目,练练手,顺便学习一下maven的原理 和布局. 官网:http://www.jeesite.com/ 没想到,上来就给 ...

  7. InstallShield Limited Edition for Visual Studio 国内注册时国家无下拉框解决方法

    注册地址:http://learn.flexerasoftware.com/content/IS-EVAL-InstallShield-Limited-Edition-Visual-Studio 火狐 ...

  8. 移除 ios 上 input 的默认样式

    input{ -webkit-appearance:none; }

  9. 【python】Python: Enum枚举的实现

    从C#系语言过来用Python,好不容易适应了写代码不打花括号,突然有一天发现它居然木有枚举……于是stackoverflow了一把,发现神人的枚举(enum)实现到处都是,于是汉化总结过来. 如果是 ...

  10. 【bzoj1821】[JSOI2010]Group 部落划分 Group Kruskal

    题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成为谜团了——聪 ...