zoukankan      html  css  js  c++  java
  • 阻塞、非阻塞、同步、异步浅析(转)

    在网络编程中,我们经常会遇到阻塞、非阻塞、同步、异步这两组概念,许多人很容易混淆,现在就给大伙儿说说我对着两组概念的理解。

    先说说阻塞与非阻塞,这主要和程序等待消息时的状态有关

    1、阻塞

    程序会阻塞在某一个函数,而不往下执行,就如挂在那里一样,所有的其他业务也都不执行,为一直等到消息到来才往下执行。

    2、非阻塞

    程序不会阻塞在某一个函数,不等待消息到来,立即返回,往下执行。

    举个例子,TCP协议中的send,系统会为其分配一块发送缓存区,假设现在总的缓存 区的大小为1000.,而缓存区里已经有了500个数据,这时调用send,发送1000个字节数据,这时如果在阻塞模式下,send的会先最多的数据放入缓存,直到缓存区满,然后程序就会阻塞在那里,一直等到将所有数据全部发出去为止,而如果在非阻塞模式下,send的会先将最多的数据放入缓存之后,就马上返回,剩余数据下回接着发送,不会卡在send函数中。

    同步和异步这两个概念,其实是与消息通知机制有关的。

    1、同步

    发送消息,等待消息处理完后,才往下执行。就如MFC里的SendMessage(),

    2、异步

    发送消息,不等待消息处理完,就往下执行,让后通过特定的接口或者事件,消息通知你事情完成了。如MFC里的PostMessage()

    粗略的讲了一下以上的两个概念,估计大家会问,那么阻塞与同步,非阻塞与异步有啥区别,用例说明。

    比如我们现在去银行,你可以选择两种方式,取票等待和排队等待,如果你排队等待,你就得等前面所有人都办理完了,才能办理业务,此时如果在等待的过程中,你啥事都不能干,这时你就处于阻塞状态了,如果你还能一边打电话,一边喝饮料,看书,不过你还得时不时的抬头看看,前面的人还有多少,啥时候轮到你,免的错过办理,这时你就是处于同步状态。

    也就是说,阻塞就是程序挂在那里,其他一切事情都不能做,直到当前事件返回为止,而同步得再原地等待消息,而与此同时,不影响其他业务的执行,体现在程序里就是其他线程的业务处理。

    如果你取票等待,那么你只要坐在椅子上,这时你可以做你想做的事情,比如听听歌,看看书,打打电话,而到你时,窗口会自动叫号通知你,这时你就处于非阻塞状态。

    如果此时你还觉得不过瘾,想出去溜达溜达,那么你可以和大厅的工作人员说一下,我去哪里,待会到我了,到某某地方通知我一下,然后你就可以出去做你想做的事情,直到工作人员来叫你为止。这时你就是处于异步状态。两者结合起来就是所谓的异步非阻塞模式,这种由于效率很高,在网络编程里经常被用到。

    http://blog.csdn.net/lenyusun/article/details/6607041

  • 相关阅读:
    软件性能测试指标及其注意地方
    Oracle过程及函数的参数模式详解
    【转】Web Service单元测试工具实例介绍之SoapUI
    【转】如何读懂Oracle文档中的语法图
    浅谈session测试
    Cookie管理工具
    php 在linux 用file_exists() 函数判断 另外一台服务器映射过来的文件是否存在 总是返回false
    SecureCRT 设置字体跟颜色
    bootstrat 设置 select option 选项的值
    php 如何把中文写入json中 当json文件中还显示的是中文
  • 原文地址:https://www.cnblogs.com/bizhu/p/2506197.html
Copyright © 2011-2022 走看看