笔记-编程-IO模型
笔记-编程-IO模型
1. 简介
常用IO模型
1) 同步阻塞IO(Blocking IO)
2) 同步非阻塞IO(Non-blocking IO)
3) IO多路复用(IO Multiplexing)
4) 异步IO(Asynchronous IO)
5) 信号IO
注:这里主要讨论的是网络IO,linux和windows下有所不同,不过原理是相似的;
1.1. 相关概念
- 同步/异步
同步指前后两件任务,有严格的顺序一致性;
异步对顺序的要求和依赖关系没那么强;
- 阻塞/非阻塞
阻塞:请求-响应比较耗时,如IO
非阻塞:请求-响应比较迅速,如没有等待IP完成就直接返回状态
2. IO模型
2.1. 阻塞IO
用户线程在读写时被阻塞
数据拷贝指请求到的数据先存放在内核空间, 然后从内核空间拷贝至程序的缓冲区

缺点在于如果数据没有就绪,就会一直阻塞在read方法处。
2.2. 非阻塞IO
用户线程不断发起IO请求. 数据未到达时系统返回一状态值; 数据到达后才真正读取数据,用户线程每次请求IO都可以立即返回;
缺点在于需不断轮询,无谓地消耗了大量的CPU,一般很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性

2.3. IO多路复用
使用一个线程去轮询多个socket状态,只有socket真正有读写事件时,才真正调用实际的IO读写操作,相比非阻塞,大大减少了资源占用。
一旦事件响应体很大,就会导致后续的事件迟迟得不到处理,并会影响新的事件轮询。

2.4. 异步IO
异步IO才是最理想的IO模型。

相比于IO多路复用,异步IO并不常用,因为目前操作系统对异步IO的支持并不完善,IO多路复用也基本够用. 有很多做法是用IO多路复用模型模拟异步IO(IO事件触发时不直接通知用户线程,而是将数据读写完毕后放到用户指定的缓冲区中)。
JDK7已经支持了AIO, netty采用过又放弃了, 据说是性能并没有多路复用好.
2.5.
信号驱动IO模型
当用户线程发起一个IO请求操作,会给对应的socket注册一个信号函数;
然后用户线程继续执行,当内核数据就绪时,会发送一个信号给用户线程,开始IO操作;
一般用于UDP中,对于TCP套接口几乎没用的,原因是该信号产生的过于频繁,并且该信号的出现并没有告诉我们发生了什么事情。

笔记-编程-IO模型的更多相关文章
- 4.6 并发编程/IO模型
并发编程/IO模型 背景概念 IO模型概念 IO模型分类 阻塞IO (blocking IO) 特点: 两个阶段(等待数据和拷贝数据两个阶段)都被block 设置 server.setsockopt ...
- python 并发编程 io模型 目录
python 并发编程 IO模型介绍 python 并发编程 socket 服务端 客户端 阻塞io行为 python 并发编程 阻塞IO模型 python 并发编程 非阻塞IO模型 python 并 ...
- Python Web学习笔记之并发编程IO模型
了解新知识之前需要知道的一些知识 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调 ...
- Python之并发编程-IO模型
目录 一.IO模型介绍二.阻塞IO(blocking IO)三.非阻塞IO(non-blocking IO)四.多路复用IO(IO multiplexing)五.异步IO(Asynchronous I ...
- 15 并发编程-(IO模型)
一.IO模型介绍 1.阻塞与非阻塞指的是程序的两种运行状态 阻塞:遇到IO就发生阻塞,程序一旦遇到阻塞操作就会停在原地,并且立刻释放CPU资源 非阻塞(就绪态或运行态):没有遇到IO操作,或者通过某种 ...
- 并发编程 - io模型 - 总结
1.提交任务得方式: 同步:提交完任务,等结果,执行下一个任务 异步:提交完,接着执行,异步 + 回调 异步不等结果,提交完任务,任务执行完后,会自动触发回调函数2.同步不等于阻塞: 阻塞:遇到io, ...
- python并发编程&IO模型
一 IO模型介绍 为了更好地了解IO模型,可先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(n ...
- 并发编程——IO模型(6)
1.IO模型分类 同步IO #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回.按照这个定义,其实绝大多数函数都是同步调用.但是一般而言,我们在说同步.异步的时候,特指那些需要 ...
- 并发编程——IO模型
前言 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回.按照这个定义, ...
随机推荐
- Laravel项目的结构文章
http://esbenp.github.io/2016/04/11/modern-rest-api-laravel-part-1/
- 斐波那契数列【java实现】
java 实现斐波那契数列 以下是Java代码实现(递归与递推两种方式): import java.util.Scanner; /** * Fibonacci * * @author tongqian ...
- enable orgmode latex preview to support retina on mac
Table of Contents 1. enable orgmode latex preview to support retina on mac 1.1. get the proper versi ...
- linux 命令——35 ln(转)
ln 是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要 ...
- CRM User Status profile中Business Transaction字段的用途
有朋友问到User Status profile中Business Transaction字段的用途,如下图INPR, FINI所示. 实际上,这个字段作为一个桥梁,连接了User Status和Sy ...
- VMware安装win7系统
1.创建一个虚拟机 2.配置iso映射文件 3.设置boot设置第一启动为cd 4.快速分区后重启电脑,然后选择[A]安装win7. 重启电脑后安装win7系统 搞定...
- UVA 12118 Inspector's Dilemma(连通性,欧拉路径,构造)
只和连通分量以及度数有关.不同连通分量只要连一条边就够了,连通分量为0的时候要特判.一个连通分量只需看度数为奇的点的数量,两个端点(度数为奇)是必要的. 如果多了,奇点数也一定是2的倍数(一条边增加两 ...
- 【BZOJ2730】[HNOI2012] 矿场搭建(找割点)
点此看题面 大致题意: 一张无向图,要求你在去掉任意一个节点之后,剩余的每个节点都能到达一个救援出口,问至少需要几个救援出口. 第一步:\(Tarjan\)求割点 首先,我们要跑一遍\(Tarjan\ ...
- gearmand 编译 Unable to find libevent
如果出现configure: error: Unable to find libevent,则输入命令:yum -y install libevent libevent-devel然后重新config ...
- python_78_软件目录结构规范
一定要看http://www.cnblogs.com/alex3714/articles/5765046.html #print(__file__)#打印的是文件的相对路径 import os pri ...