1:IO的过程

  当我们调用系统函数read时,一般会经历两个阶段:

  1:等待数据准备(waiting for the data be ready)

  2:将数组从内核拷贝到进程(从内核态到用户态)(copying the data from the kernel to the process)

  在"等待数据准备"这个状态,我们最常见到的就是网路请求,即内核等待网络中的数据到网口的缓冲区。在数据到网口的缓冲区后,才会发生第二阶段,将数据从内核态拷贝到用户进程(用户态)。

  所以我么常说各种IO模型就是对这两个状态的不同的描述

2:常用的IO模型有哪些

  IO模型大体分为两大类:同步IO和异步IO;同步IO又包含:阻塞IO,非阻塞IO,IO多路复用,信号驱动IO

  区别是什么呢?当我们调用系统函数read时

  阻塞IO(blocking IO): 在上述的两个状态(等待数据和拷贝数据)都被阻塞了

  非阻塞IO(non-blocking IO):在这个场景中,在第一阶段,用户进程是会不断轮询kernel是否准备好数据。kernel准备没准备好数据都会返回,如果准备好,进行第二阶段。如果没准备好则返回error,用户进程收到error后会继续轮询知道数据准备好。

  IO多路复用(IO Multiplxing):又叫事件驱动IO。底层用的是 select/poll/epoll等调用,有点是单个线程可以监控多个网路IO。而在阻塞IO模型中,则必须使用多线程才能达到同样的效果。注意:这不意味着多路服用处理单个连接能处理的更快,只是单个线程能处理更多的连接。

  信号驱动(signal IO):这个场景中,用户进程会通知内核,在数据准备好后要发个信号通知用户进程;用户进程在收到信号后发起系统调用等待内核将数据拷贝到用户线程。在第二阶段仍是阻塞的。

  异步IO(asynchronous IO):这个和信号驱动类似,不同的是直到数据拷贝到用户进程后才会发信号通知用户进程。整个过程不会阻塞用户线程。 

3:IO多路复用和多线程的区别以及使用场景

  上面我们说到,在阻塞模式下,一个服务想要并行处理多个IO尽量使用多线程。但是创建线程耗时耗资源,所以我们一般都是使用线程池来代替多线程。

  我们也说到,多路复用可以单线程监控多个IO。而且单线程不会涉及到多线程同步的问题,也不会涉及到CPU线程上下文切换的问题。但是缺点也随之而来,如果同时有大量的IO需要处理的话,那么排在后面IO肯定等待的时间长。因此,这种场景适用于那些有大量连接,但是数据交互不频繁的场景,如聊天室。而多线程适用与那些大量短连接的场景,如web服务器。

  我们了解到的nginx,tornado,redis等都用了IO多路复用技术。Java中的NIO指的是(new IO),用的也是IO多路复用技术,而不是non-blocking IO。

4:计算密集型和IO密集型

  计算密集型任务最主要的是消耗CPU资源,即CPU运行时间/IO等待时间的比值高。如常见的加密解密,转码等操作都是很耗CPU的。在CPU密集型任务中,为了使CPU得到充分的利用,我们一般会采用多线程。但是线程数量不易太大,一般和CPU核心数持平,如果线程数量过大,可能会CPU会频繁的在线程间切换,造成资源浪费。而且CPU密集型任务使用执行效率比较高的语言也很重要。

  对于IO密集型任务,IO时间要远大于CPU运行时间。所以任务越多,那么CPU的效率也就越高。对于这种任务,使用执行效率高的语言对整体影响不大。我们可以在IO没有达到峰值的时候增加任务,如果IO已经达到峰值,再添加任务也只能等待了。

5:CPU和线程的关系

  CPU是系统资源,而线程可以看成我们的要执行指令的集合。我们的指令是否要执行是我们指定的,但是什么时候执行却是系统调度的。例如在线程执行一个阻塞命令时,CPU会闲置,也可以去处理其他的任务。

IO多路复用?我所理解的IO模式的更多相关文章

  1. 聊聊IO多路复用之select、poll、epoll详解

    本文转载自: http://mp.weixin.qq.com/s?__biz=MzAxODI5ODMwOA==&mid=2666538922&idx=1&sn=e6b436ef ...

  2. IO多路复用,同步,异步,阻塞和非阻塞 区别

    一.什么是socket?什么是I/O操作? 我们都知道unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO.管道.终端,对我们来说,一切都是 ...

  3. IO多路复用,同步,异步,阻塞和非阻塞 区别(转)

    转自:http://www.cnblogs.com/aspirant/p/6877350.html?utm_source=itdadao&utm_medium=referral 同步.异步 是 ...

  4. python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)

    昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...

  5. 并发编程(IO多路复用)

    阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 异步IO(Asynchro ...

  6. 什么是IO多路复用?Nginx的处理机制

    先来说一下什么是IO复用? IO复用解决的就是并发行的问题,比如多个用户并发访问一个WEB网站,对于服务端后台而言就会产生多个请求,处理多个请求对于中间件就会产生多个IO流对于系统的读写.那么对于IO ...

  7. 39 - 同步-异步-IO多路复用

    目录 1 同步与异步 2 阻塞与非阻塞 3 什么是IO 3.1 内核态用户态 3.2 IO两个阶段 3.3 IO模型 3.3.1 同步阻塞IO 3.3.2 同步非阻塞IO 3.3.3 IO多路复用 3 ...

  8. IO多路复用,协程,

    一.单线程的并发 import socket import select client1 = socket.socket() client1.setblocking(False) # 百度创建连接: ...

  9. python开发IO模型:阻塞&非阻塞&异步IO&多路复用&selectors

    一 IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非 ...

随机推荐

  1. 多线程之美2一ThreadLocal源代码分析

    目录结构 1.应用场景及作用 2.结构关系 2.1.三者关系类图 2.2.ThreadLocalMap结构图 2.3. 内存引用关系 2.4.存在内存泄漏原因 3.源码分析 3.1.重要代码片段 3. ...

  2. C语言笔记 07_枚举&指针

    emum(枚举) 枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读. 枚举语法定义格式为: enum 枚举名 {枚举元素1,枚举元素2,--}; 举个例子,比如:一星期有 7 天,如果 ...

  3. 浅析椭圆曲线加密算法(ECC)

    本文首发于先知社区,原文链接:https://xz.aliyun.com/t/6295 数学基础 黎曼几何中的"平行线" 欧几里得<几何原本>中提出五条公设: 过相异两 ...

  4. monkey命令解析详解

      我面试时遇到过几次让背个monkey命令的,可以这样简单说一个:adb shell monkey -p(约束包名) -s 200 -v -v --throttle 300 1500000 > ...

  5. 在mpvue引入flyio

    先来说微信小程序原生的请求接口方式吧,如官网文档,在页面中请求直接调用 在这里感谢接的是提供的免费接口https://blog.csdn.net/c__chao/article/details/785 ...

  6. 从微信小程序开发者工具源码看实现原理(三)- - 双线程通信

    文章概览: 引言 小程序开发者工具双线程通信的设计 1.on: 用来收集小程序开发者工具触发的事件回调 2.invoke:以api方式调用开发工具提供的基础能力 3.publish:用来向Appser ...

  7. Spring Boot2解决idea console 控制台输出乱码

    Idea默认配置是采用GBK, 而项目工程文件采用的是UTF-8. 编码不一致,导致idea Console控制台输出乱码. 网上的解决方案,大都是直接修改Settings=>Editor=&g ...

  8. SAP-BP 创建客商(摘抄)

    FORM frm_bp02 . * 更改供应商所需变量 DATA:l_xfeld TYPE xfeld, "复选框 ls_data TYPE vmds_ei_main, "供应商总 ...

  9. Flipcart 爬取流程

    第一步:爬取分类url from requests_html import HTMLSession session =HTMLSession() #https://www.flipkart.com/l ...

  10. pyhton的安装,环境变量的设置,pycharm的安装下载,中文汉化和字体的设置

    1.下载pycharm https://www.7down.com/soft/336988.html 1.pycharm的汉化下载汉化包:resources_cn.jar    放到pycharm的安 ...