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. Ubuntu19 安装Theano出现“No module named ‘theano.compat.six’”

    解决办法:直接在下载好pythearn2包的目录下,对setup.py文件进行修改:将  from theano.compat.six.moves import input 改为  from six. ...

  2. Visual Studio中相对路径中的宏定义

    $(RemoteMachine) 设置为“调试”属性页上“远程计算机”属性的值.有关更多信息,请参见更改用于 C/C++ 调试配置的项目设置. $(References) 以分号分隔的引用列表被添加到 ...

  3. 计划任务cron

    cron 计划任务 作用: 计划任务主要是做一些周期性的任务,目前最主要的用途是定期备份数据 Schedule one-time tasks with at. 一次性调度执行 atSchedule r ...

  4. Leetcode547: Friend Circles 朋友圈问题

    问题描述 在一个班级里有N个同学, 有些同学是朋友,有些不是.他们之间的友谊是可以传递的比如A和B是朋友,B和C是朋友,那么A和C也是朋友.我们定义 friend circle为由直接或者间接都是朋友 ...

  5. promise和axios

    1.接口调用方式 原生ajax 基于jQuery的ajax fetch axios 异步 JavaScript的执行环境是「单线程」 所谓单线程,是指JS引擎中负责解释和执行JavaScript代码的 ...

  6. Centos 下安装 Nginx(新)

    今天重新实践了下 CentOS 7.6 下安装 Nginx,总结了一条更直接并简单的方式 从官方获取写入 nginx.repo 的方式 从官网查看文档,获取 nginx.repo 的文档内容,将其内容 ...

  7. 精通awk系列(3):铺垫知识:读取文件的几种方式

    回到: Linux系列文章 Shell系列文章 Awk系列文章 读取文件的几种方式 读取文件有如下几种常见的方式: 下面使用Shell的read命令来演示前4种读取文件的方式(第五种按字节数读取的方式 ...

  8. C# - VS2019 WinFrm应用程序调用WebService服务

    WinFrm应用程序调用WebService服务 关于WebService的创建.发布与部署等相关操作不再赘述,传送门如下:C# VS2019 WebService创建与发布,并部署到Windows ...

  9. django中使用原生的sql查询实例

    在app文件夹下创建database_operations.py文件,写如下内容: import pymysql from 项目名.settings import DATABASES class Da ...

  10. ling to sql创建临时变量 let的使用

    使用let赋值给临时变量 var dailys = from f in _postgreDbContext.draws let temp = f.review_time.Value.Date wher ...