Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4470363
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: LINUX

2011-12-31 19:24:31


    在 3. 阻塞 add_wait_queue wait_event wake_up 章节中,在设备驱动怎样去实现阻塞操作了。

==========================================================================

这里的同步异步,就是函数调用的时候的同步异步。

同步:
   就是发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件事做完了才能做下一件时。 其实大多数函数都是同步调用(例如sin)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子:
    sendmessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕之后,该函数才把消息处理函数所返回的result值返回给调用者。
   
异步:
    当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
    当你用异步方式调用一个function的时候,这个方法会马上返回,事实上多数情况下这种function call 只是向某个任务执行体提交一个任务而已。而你的主thread可以继续执行其他的事情,不必等待(阻塞),而当那个任务执行体执行完你提交的这个任务后,它会通过某种方法callback格尼的thread,告诉你,ide这个任务已经完成。
    事实上,在目前的应用中,很少有真正实现异步IO的。


阻塞:
     在执行设备操作中,若不能获得资源,则挂起进程直到满足可操作的条件后再进行操作。被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足。

非阻塞:
     操作的进程在不能进行设备操作时,并不挂起,它或者放弃,或者不停的查询,直到进行操作为止。


同步和异步:与消息的通知机制有关。


 

本质区别

现实例子

同步模式

由处理消息者自己去等待消息是否被触发

我去银行办理业务,选择排队等,排到头了就办理。

异步模式

由触发机制来通知处理消息者

我去银行办理业务,取一个小纸条上面有我的号码,等到排到我这一号时由柜台的人通知我轮到我去办理业务。


 

阻塞与非阻塞:与线程等待消息(无所谓同步或者异步)时的状态有关。


 

本质区别

现实例子

阻塞调用

线程挂起,不能做其他事。

上面的那个例子,不论是排队还是使用号码等待通知,如果在这个等待的过程中,等待者除了等待消息之外不能做其它的事情,那么该机制就是阻塞的。

非阻塞调用

线程活跃,能处理其他事。

在银行办理这些业务的时候一边打打电话发发短信一边等待,这样的状态就是非阻塞的。


 

它们之间的组合应用举例:


 

阻塞调用

非阻塞调用

同步模式

read/write

read/write

O_NONBLOCK

异步模式

IO复用:select/poll,epoll(LT模式)

AIO系列:aio_readaio_write等;epoll(ET模式)



总结: 
阻塞/非阻塞是内核级的,同步/异步是进程级的,同步非阻塞和异步阻塞一般不会采用,异步非阻塞一般效率比较高,他能够把cpu和io并行处理,当然,如果没有cpu和io并行的这种情况,那就用同步阻塞比较好,这样编程比较简单,且不用多次在内核空间和用户空间进行切换。
常用:同步阻塞、异步非阻塞 



资料:
1. linux同步/异步 阻塞/非阻塞
2. 4.4续 阻塞、非阻塞IO和同步、异步IO
3.同步和异步的概念
4.同步IO 阻塞IO 异步IO 非阻塞 转载
5.linux下同步模式、异步模式、阻塞调用、非阻塞调用
6.使用异步IO大大提高应用程序的性能


阅读(1891) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~