Linux驱动学习9(同步/异步与阻塞/非阻塞的区别 )

转载 2013年12月03日 14:34:27
很多人对阻塞,非阻塞,同步,异步,并发,竞态的概念不是很清晰,今天我把我理解的用一个模型来说明一下这些概念。 

首先建立一个模型:                                                 

我们去银行办理业务,屌丝的做法是:

1、银行未准备好,则一直排队,直到前面的人告诉你可以办理了,则你去处理业务  

2、一到银行,看银行未准备好,要么转身就走;要么在大厅里面坐着,一直看着银行有没有准备好。  

3、先看看银行有没有准备好。如果有,则自己办理业务,如果没有,则出去晃一圈,再回来,看有没有,依次循环。   

高富帅的做法是:

1、先和银行打一个招呼,过一段时间,银行看自己准备好了,通知你过去办理业务。    

2、你要把你需要办理的业务和银行先说一下,然后回家等待,银行业务办好了的通知你,告诉你办好了。 (说明一下银行未准备好指:客户要取的,

没有;要存时,满了;有其他客户在办理业务。从内核的观点讲就是阻塞的情况)  

那么从上面的例子可以看出,屌丝的共同点是什么呢?就是去银行办业务,都是亲力亲为,即先看银行条件允许没,再自己去办理业务。而高富帅只

要先和银行打下招呼,当银行准备好时,

它会通知你,甚至,他可以把你交予的任务完成直接告诉你结果。            


上图部分把我们的模型和内核的一些概念联系了起来,下面我把一些概念再解释一下: 

同步的定义:由处理消息者自己去等待消息是否被触发(屌丝都要自己去看看银行有么有人正在办理业务) 

异步的定义:由触发机制来通知处理消息者(高富帅是银行通知你已经办好业务了) 

阻塞:当你读取文件。若为空,你不能读取文件,这是就要阻塞;若文件满时,你不能写文件,这要阻塞。(当客户要取自己存在银行里面的保险

柜东西,若里面没有东西,自然不行,直到有人往里面存东西)当两个进程同时操作一个设备文件,就会发生竞态,这时也会发生阻塞。总而言之:

当文件没有准备好时,睡眠,你就要一直等它就绪,才能对其操作。 

非阻塞:当你读取文件时,文件没有准备好,或者'你'可以转身作别的事情,或者一直询问他有没有准备好。 



讲完上面几个概念,下面可以理解下屌丝高富帅的几个行为了: 屌丝(同步)的做法: 

1、银行未准备好,则一直排队,直到前面的人告诉你可以办理了,则你去处理业务。 这是阻塞型读写。 当以阻塞方式read(),write()时,要取的,

没有;要存时,满了;有其他进程在存取。进程睡眠。其他进程唤醒你,或者其他进程释放信号量。此时可以读写。 

2、一到银行,看银行未准备好,要么转身就走;要么在大厅里面坐着,一直看着银行有没有准备好。 这是非阻塞型读写。 当以非阻塞方式read(),

write()时,要取的,没有;要存时,满了;有其他进程在存取。此时要么返回,进行其他操作;要么继续查询银行有没有准备好。 

3、先看看银行有没有准备好。如果有,则自己办理业务,如果没有,则出去晃一圈,再回来,看有没有,依次循环。若准备好了,再进行读写。

这里把读取过程分为两步:先询问银行准备好没;读取数据。而上面屌丝做法1、2把这两步并成了一步。这种我们把它称为select(),poll()的方法。 

调用select()时,它先会把可读\可写的状态放在fd中,若是可读\可写,则在调用read(),write()。  

高富帅的做法: 

1、先和银行打一个招呼,过一段时间,银行看自己准备好了,通知你过去办理业务。   这是异步通知的机制。 这里打一个招呼指,启动FASYNC机制

。进程是通过函数singal(SIGIO,handle)来通知你去办理业务的。 

2、你要把你需要办理的业务和银行先说一下,然后回家等待,银行业务办好了的通知你,告诉你办好了。  这是AIO机制。 这里通过aio_read()\aio_write()

来通知发送,接受一个数据,通过aio_error()、 aio_return()来通知你是否完成数据的处理。  

有几篇博文讲的不错,但是有的还是有点问题: 

http://www.cppblog.com/converse/archive/2009/05/13/82879.html 这篇博文博主讲的不是很正确,但是| 啸天猪这个同学的观点我很认同。。。。。。。。。。。

同步: '你'亲自办这件事

异步: 交代要做的事情,然后忙其他的事情;'别人'(内核)会充当你的跑腿,在条件就绪后将这事办成,然后通知你(callback);

阻塞: 如果条件未就绪,'你'必须死等它就绪;进程睡眠
非阻塞:如果条件未就绪,'你'可以转身作别的事情;进程可以作任何想做的事情,不过通常是低效的轮询。

以这种理解方式,阻塞/非阻塞只对同步操作有意义;异步I/O总是意味着进程不会因为I/O陷入睡眠。

将" select"归类为异步+blocking不妥,select实际上完成的只是read/write的第一部分:等待条件就绪;唯一的改进是可以等待多个条件。"select + read/write"的调用形式容易产生"系统通知我条件就绪"的假象,可实际上你不过是在条件就绪的时候醒来,然后仍然亲自动手完成了数据复制的操作。

依然使用银行的隐喻:

柜台R:只能取款
柜台W:只能存款

read: 亲自在柜台R排队(进程睡眠) + 取款
write: 亲自在柜台W排队(进程睡眠) + 存款

select + read/write : 亲自同时在R、W两个柜台排队(进程睡眠) + (存款|取款|存款+取款)

AIO : 告诉心腹小弟要取款若干,然后忙别的事情;小弟取款完毕将其如数奉上。

UNP一书中6.2节对I/O模型的分类我觉得很合理:

1).read/write、read + NON_BLOCK、select、signal driven I/O 都属于同步I/O; 它们的共同特点是:将数据从内核空间复制到到用户空间的这个操作,是由用户空间的代码显式发起的。

2).只有AIO 属于 异步I/O;内核不露声色的将数据从内核空间复制到用户空间,然后通知进程。 



IO模型介绍以及同步异步阻塞非阻塞的区别

阻塞:用户进程访问数据时,如果未完成IO,等待IO操作完成或者进行系统调用来判断IO是否完成非阻塞:用户进程访问数据时,会马上返回一个状态值,无论是否完成同步:用户进程发起IO(就绪判断)后,轮询内核...
  • it_man
  • it_man
  • 2014年04月22日 17:17
  • 4643

怎样理解阻塞非阻塞与同步异步的区别

怎样理解阻塞非阻塞与同步异步的区别? 发现很多人对这两个概念往往混为一谈 6 条评论  分享 按投票排序按时间排序 47 ...
  • baicp3
  • baicp3
  • 2016年03月16日 09:30
  • 1537

同步异步以及阻塞和非阻塞的区别

一、同步与异步的区别:      同步:一个服务的完成需要依赖其他服务时,只有等待被依赖的服务完成后,才算完成,这是一种可靠的服务序列。要么成功都成功,失败都失败,服务的状态可以保持一致   ...
  • wanghang88
  • wanghang88
  • 2016年07月07日 09:52
  • 987

怎样理解同步异步与阻塞非阻塞的区别?

比喻很经典-- 老张爱喝茶,废话不说,煮开水。 出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。 1 老张把水壶放到火上,立等水开。(同步阻塞) 老张觉得自己有点傻 2...
  • javaofliang
  • javaofliang
  • 2016年10月14日 10:31
  • 664

怎样理解阻塞非阻塞与同步异步的区别?

作者:严肃 链接:https://www.zhihu.com/question/19732473/answer/20851256 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 “...
  • z69183787
  • z69183787
  • 2016年10月24日 12:12
  • 970

java 同步阻塞io和异步非阻塞io

NIO 设计背后的基石:反应器模式,用于事件多路分离和分派的体系结构模式。 反应器(Reactor):用于事件多路分离和分派的体系结构模式 通常的,对一个文件描述符指定的文件或设备, 有两...
  • zshake
  • zshake
  • 2014年11月06日 00:32
  • 849

nginx 同步与异步 阻塞与非阻塞

0.序      首先通过阅读参考文章的内容,了解大概,我写出下文。并且我参考上述文章的写作方式,以生活中的事件来理解技术上的问题。      初学同步与异步、阻塞与非阻塞,难免有些理解错误,还希...
  • AKAK2424
  • AKAK2424
  • 2016年05月08日 13:23
  • 1691

IO与文件读写---同步/异步与阻塞/非阻塞的区别(转) _适用于TI dsp驱动

首先来解释同步和异步的概念,这两个概念与消息的通知机制有关. 举个例子,比如我去银行办理业务,可能选择排队等候,也可能取一个小纸条上面有我的号码,等到排到我这一号时由柜台的人通知我轮到我去办理业务了...
  • u010893262
  • u010893262
  • 2017年05月09日 18:11
  • 235

【高并发编程】再谈同步、异步、阻塞、非阻塞

同步、异步、阻塞、非阻塞的概念一直是计算机学科中很重要的概念,而这种细微的差别常常被大家混淆,我自己在过一段时间后也需要复习。今天再次翻出这个概念,仍然觉得不够清晰,今天再次深入了解了这四大天王。 以...
  • xxxxxx91116
  • xxxxxx91116
  • 2016年04月24日 16:13
  • 5985

【java】同步、异步、阻塞、非阻塞

理解同步与异步 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。  异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。    举个例子:普通...
  • lzm18064126848
  • lzm18064126848
  • 2015年09月20日 11:40
  • 3371
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux驱动学习9(同步/异步与阻塞/非阻塞的区别 )
举报原因:
原因补充:

(最多只允许输入30个字)