浅谈I/O模型
在学习线程,NIO等知识时都需要知道一些基础知识。
一、什么是同步或异步
同步:个人通俗理解多个人排队打饭一个窗口,只有前面一个人打完了,后面的人才能打。如果前面人因为什么原因一直站在那里不走,后面的人就一直需要等待。
如果有多个任务或事件要发生,多个任务或事件要逐个去执行,如果其中有一个事件或任务出现问题都会影响整个流程,其他任务都需要进行等待
异步:多个人排队打发多个窗口,每个人选择一个窗口不需要等待,一个人出现窗口占用,其他人不受影响。
多个任务或事件并发执行,一个任务或事件不会影响整个流程的暂时等待
示例1 典型的同步操作 方法在调用是从上到下依次执行, 只有fun1执行完成后,fun2才会被执行
void fun1(){
}
void fun2(){
}
main(){
fun1();
fun2();
}
示例2 主线程开启两个子线程 两个子线程调用互不影响 两个方法的调用也互不影响 fun1() 与 fun2()之间不需要等待
fun1(){}
fun2(){}
main(){
new Thread(){
public void run(){
fun1();
}
}.start();
new Thread(){
public void run(){
fun2();
}
}.start();
}
二、什么是阻塞 和非阻塞
阻塞:一个任务在执行过程中发出一个请求操作,由于请求的操作条件一直不满足,这个请求会一直等待,知道请求操作的条件满足后返回
非阻塞:一个任务在执行过程中发出一个请求操作,如果请求的操作条件一直不满租,会立即返回一个信息告知条件不满足,不会一直等待。
同步和异步着重点在于多个任务的执行过程中,一个任务的执行是否会导致整个流程的暂时等待;
而阻塞和非阻塞着重点在于发出一个请求操作时,如果进行操作的条件不满足是否会返会一个标志信息告知条件不满足。
理解阻塞和非阻塞可以同线程阻塞类比地理解,当一个线程进行一个请求操作时,如果条件不满足,则会被阻塞,即在那等待条件满足
三、什么是阻塞IO 和什么是非阻塞IO
IO操作:通过IO对磁盘或者SOCKET链接(也就是网络链接) 和外部设备的读写操作
当用户线程发出一个用户请求操作(以读取操作为例),内核要查看读取的数据是否就绪,对于阻塞IO来说,如果数据没有准备就绪,就会一直等待数据就绪,对于非阻塞IO来说,如果数据没有就绪,会反馈一个标志信息数据没有就绪,当数据就绪之后拷贝到用户线程。
IO读请求操作分为两个阶段:
1)查看数据是否就绪
2)内核将数据拷贝给用户线程
是否为阻塞IO 和非阻塞IO 区别在与第一个阶段 数据是否就绪 如果数据没有就绪是否一直等待,如果一直等待就为阻塞IO 如果返回一个信息标志 则为非阻塞IO
四、什么是同步IO 和什么是异步IO
同步IO和异步IO的区别关键在于数据拷贝阶段,是由用户线程完成的还是内核完成的,异步IO必须有操作系统底层支持。
同步IO:如果一个IO进行请求操作,那么在操作之前,该线程一定会被阻塞。
异步IO:如果一个IO请求操作,在操作完成之前,该线程一定不会被阻塞。
对于同步IO:当用户发出IO请求操作之后,如果数据没有就绪,需要通过用户线程或者内核不断地去轮询数据是否就绪,当数据就绪时,再将数据从内核拷贝到用户线程;
而异步IO:只有IO请求操作的发出是由用户线程来进行的,IO操作的两个阶段都是由内核自动完成,然后发送通知告知用户线程IO操作已经完成。也就是说在异步IO中,不会对用户线程产生任何阻塞。
五、参考模型
1)阻塞IO模型
2)非阻塞IO模型
3)多路复用IO模型
4)信号驱动IO模型
5)异步IO模型
参考博客:
http://www.cnblogs.com/dolphin0520/p/3916526.html
浅谈I/O模型的更多相关文章
- 【Linux】浅谈I/O模型
关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是无法直接操作I/O设备的,其必须通过系统调用请求内核来协助完成I/O动作,而内核会为每个I/O设备维护一个buffer. 如下图所示: ...
- 浅谈Java内存模型
Java内存模型虽说是一个老生常谈的问题 ,也是大厂面试中绕不过的,甚至初级面试也会问到.但是真正要理解起来,还是相当困难,主要这个东西看不见,摸不着.网上已经有大量的博客,但是人家的终究是人家的,自 ...
- 浅谈CSS盒子模型
[摘要]盒子模型是CSS中的一个重要概念,虽然CSS中没有盒子这个单独的属性对象,但它却是CSS中无处不在的一个重要组成部分.掌握盒子模型的原理和使用方法可以极大地丰富HTML元素的表现效果,同时对于 ...
- 浅谈css盒模型
在我们网页上的每一个元素,一个按钮,一段文本,一张图片等等,浏览器都将它们当做一个“盒子”看待,并把这样的盒子称为盒模型(box model).使用Chrome的右键>审查元素对某个网页上的元素 ...
- 浅谈隐语义模型和非负矩阵分解NMF
本文从基础介绍隐语义模型和NMF. 隐语义模型 ”隐语义模型“常常在推荐系统和文本分类中遇到,最初来源于IR领域的LSA(Latent Semantic Analysis),举两个case加快理解. ...
- Java NIO1:浅谈I/O模型
一.什么是同步?什么是异步? 同步和异步的概念出来已经很久了,网上有关同步和异步的说法也有很多.以下是我个人的理解: 同步就是:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或 ...
- [JS学习笔记]浅谈Javascript事件模型
DOM0级事件模型 element.on[type] = function(){} 兼容性:全部支持 lay1 lay2 lay3 e.target:直接触发事件的元素[IE8及以下不支持tage ...
- 浅谈JVM内存模型
JAVA虚拟机在执行JAVA程序的时候,会把它管理的内存分成若干不同的数据区域,每个区域都有各自的用途.目前大致把JVM内存模型划分为五个区域:程序计数器,虚拟机栈,本地方法栈,堆和方法区. 程序计数 ...
- 【转】浅谈UML的概念和模型之UML九种图
原文地址:浅谈UML的概念和模型之UML九种图 目录: UML的视图 UML的九种图 UML中类间的关系 上文我们介绍了,UML的视图,在每一种视图中都包含一个或多种图.本文我们重点讲解UML每种图的 ...
随机推荐
- 从零开始的全栈工程师——js篇2.11(原型)
原型 原型分析 1.每个 函数数据类型(普通函数,类)都有一个prototype属性 并且这个属性是一个对象数据类型2.每个Prototype上都有一个constructor属性 并且这个属性值是当前 ...
- 第6章 传输层(详解TCP的三次握手与四次挥手)
第6章 传输层 传输层简介 传输层为网络应用程序提供了一个接口,并且能够对网络传输提供了可选的错误检测.流量控制和验证功能.TCP/IP传输层包含很多有用的协议,能够提供数据在网络传输所需的必要寻址信 ...
- C#启动或停止 计算机中“服务”
第一.要添加一个引用System.ServiceProcess 第二.要在程序中使用命名空间ServiceProcess 代码片段: using System.ServiceProcess; Serv ...
- [SVN]TortoiseSVN报“500 Internal Server Error”错误的解决方法
背景:由于某种原因,本人重启了一下SVN服务的物理机,重启过后发现所有人访问SVN都报如下错误. 由于重启之前是没有做过任何改动,所以面对这个错误有点摸不着头脑,防火墙.网管.清缓存等方法都试过,还没 ...
- Git 推送和删除标签
事实上Git 的推送和删除远程标签命令是相同的,删除操作实际上就是推送空的源标签refs:git push origin 标签名相当于git push origin refs/tags/源标签名:re ...
- IDA逆向:结构体的逆向
源代码: int _tmain(int argc, _TCHAR* argv[]) { struct v1 { int a; short b; char c; int d; double e; }; ...
- 【洛谷5390】[Cnoi2019] 数学作业(位运算)
点此看题面 大致题意: 给你一个集合,求所有子集异或和之和. 大致思路 首先,我们很容易想到去对二进制下每一位分别讨论. 枚举当前位,并设共有\(x\)个数当前位上为\(1\),则有\((n-x)\) ...
- 博弈论经典算法(一)——对抗搜索与Alpha-Beta剪枝
前言 在一些复杂的博弈论题目中,每一轮操作都可能有许多决策,于是就会形成一棵庞大的博弈树. 而有一些博弈论题没有什么规律,针对这样的问题,我们就需要用一些十分玄学的算法. 例如对抗搜索. 对抗搜索简介 ...
- 机器学习_线性回归和逻辑回归_案例实战:Python实现逻辑回归与梯度下降策略_项目实战:使用逻辑回归判断信用卡欺诈检测
线性回归: 注:为偏置项,这一项的x的值假设为[1,1,1,1,1....] 注:为使似然函数越大,则需要最小二乘法函数越小越好 线性回归中为什么选用平方和作为误差函数?假设模型结果与测量值 误差满足 ...
- python_27_多级字典嵌套及操作
#key-value 字典无下标 所以乱序,key值尽量不要取中文 person_log={ '大二':{ 'Ya Nan':['free','cute','soso'], 'Sha sha':['微 ...