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


    汪书会互联网打杂

    刘博Liu Echowen sub 等人赞同
    因为中文语意的问题,很多时候确实会导致混用,而且语境不一样意义也可能不一样。如果只是从计算机编程这个角度说, 讨论最多的也是IO 模型 ,阻塞非阻塞 和 同步异步说的应该是不同的东西。

    阻塞非阻塞:可以简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞。
    同步异步: 你总是做完一件再去做另一件,不管是否需要时间等待,这就是同步;异步呢则反之,你可以同时做几件事,并非一定需要一件事做完再做另一件事。同步简单理解成一问一答同步进行,异步可以简单理解为不必等一个问题有答了再去问另一个问题,尽管问,有答了再通知你。

    举个例子:
    我去买一本书,立即买到了,这就是非阻塞;
    如果恰好书店没有,我就等一直等到书店有了这本书买到了才走,这就是阻塞;
    如果书店恰好没有,我就告诉书店老板,书来了告诉我一声让我来取或者直接送到我家,然后我就走了,这就是异步。
    那同步呢? 前面两种情况,非阻塞和阻塞都可以称为同步。
    如果说书店有这书,我还让老板通知我以后来取就没这个必要了。

    反映在编程方面就是 用户进程 调用 系统调用。(用户进程对应我,内核 对应 书店老板,书对应数据资源data , 买书就是一个系统调用了)
    这 阻塞非阻塞与同步异步IO机制,都是伴随计算机系统发展,用来解决一些出现的问题。阻塞非阻塞、同步异步可以组合,但是没必要组合,应该说是不同的IO机 制,没必要纠结怎么区分,如果定要组合心里才爽,可以 这样认为:阻塞非阻塞都是同步,异步就没什么阻塞不阻塞了,都异步了还阻塞啥,肯定是非阻塞了。(异步非阻塞听起来多别扭)

    unix网络编程中说到:
    将IO模型分为五类:阻塞IO,非阻塞IO,IO复用,信号驱动,异步IO
    其中阻塞IO就是那种recv, read,一直等,等到有了拷贝了数据才返回;
    非阻塞就是不用等,立即返回,设置描述符为非阻塞就行了,但是要进程自己一直检查是否可读;
    IO复用其实也是阻塞的,不过可以用来等很多描述符;
    信号驱动采用信号机制等待;
    异步IO就不用等待了,当他告知你的时候,已经可以返回了,数据都拷贝好了。

    posix.1 严格定义的异步IO是要求没有任何一点阻塞,而上述的前面四个(阻塞IO,非阻塞IO,IO复用,信号驱动)都不同程度阻塞了,而且都有一个共同的阻塞: 内核拷贝数据到进程空间的这段时间需要等待。 (这么说上面的举例中: 必须要书送到我家,否则都不算异步,纠结。。。)
    转载:知乎 http://www.zhihu.com/question/19732473/answer/14413599
    学习技术不只是为养家糊口,也为夜深人静的时候能够一个人静静享受这其中的乐趣。
  • 相关阅读:
    通过网络方式安装linux的五种方法
    谈FTP服务器攻击技术及其展望 (下)
    谈FTP服务器攻击技术及其展望 (修改中)
    Fedora 14 x64 试用手记
    加固Samba安全三法
    VMWare高可用集群在企业的应用
    Leetcode-1008 Construct Binary Search Tree from Preorder Traversal(先序遍历构造二叉树)
    Leetcode-1006 Clumsy Factorial(笨阶乘)
    Leetcode-1007 Minimum Domino Rotations For Equal Row(行相等的最少多米诺旋转)
    Leetcode-1005 Maximize Sum Of Array After K Negations(K 次取反后最大化的数组和)
  • 原文地址:https://www.cnblogs.com/renxs/p/3677225.html
Copyright © 2020-2023  润新知