笔记-编程-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):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回.按照这个定义, ...
随机推荐
- Hibernate基础案例1
使用到的是MySQL数据库 1.在项目中先引入jar包,并添加引用 <dependencies> <dependency> <groupId>junit</g ...
- 关于response.write(alert(''))弹窗改变页面格式问题
不建议使用 Response.Write("<script>alert('增加年级失败')</script>"); 而使用 Page.ClientScrip ...
- Linux常用命令汇总(渐更)
后台启动jar nohup java -jar xxxxx.jar > xxxx.out 2>&1 & 封禁ip iptables -I INPUT -s 200.194. ...
- 读取java配置文件properties
java项目里很多参数都是写在配置文件properties上,如果需要读取的话,可以使用jdk里提供的Properties类进行处理. 具体写法如下: public class PropertiesC ...
- 制作centos安装u盘
格式化 mkfs.vfat /dev/sdb1 制作 dd if=CentOS-7-x86_64-Minimal-1503-01.iso of=/dev/sdb # 1. 注意是/dev/sdb 不是 ...
- X86/X64 函数调用约定
C 语言有 __cdecl.__stdcall.__fastcall.naked.__pascal. C++ 语言有 __cdecl.__stdcall.__fastcall.naked.__pasc ...
- hdu-3371 Connect the Cities---kruskal
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3371 题目大意: 给n个城市,m条路,k组已知路,求最小费用联通所有城市: 解题思路: kruska ...
- 【洛谷4252】[NOI2006] 聪明的导游(提答题)
点此看题面 大致题意: 给你一张\(n\)个点.\(m\)条边的无向图,让你找出图上的一条不经过重复节点的最长路(提答+\(spj\)). 随机化乱搞 针对这种提答题,我们就要用随机化乱搞(Cptra ...
- C语言 数组名不是首地址指针
今天上计算机系统课的时候老师讲到了C中的聚合类型的数据结构.在解释数组名的时候说"数组名是一个指针,指向该数组的第一个元素",附上ppt(第二行): 我觉得这是不正确的,是一个常见 ...
- python_9_for
#1 for i in range(10):#默认从0开始,步长为1 print("loop",i) #2 for i in range(0,10,1):#步长为1 print(& ...