聊聊IO的模式

来源:互联网 发布:sql泰勒公式 编辑:程序博客网 时间:2024/05/29 07:47

前言

        IO是我们在编程的过程中不得不面对的一个比较棘手的问题,事实上最近我接触了NodeJs这门号称要一统编程界的后起之秀,在体验了Node之后,都说他是异步的,然后我就非常好奇的去探索下到底异步IO和同步的IO有啥区别呢?然后我就发现了自己真的对这个概念理解的不够透彻。

描述IO的维度

        实际上,IO呢有两个重要的维度去描述它,一个就是是否阻塞,另一个就是是否同步。但是我们在理解的时候往往就把他们的概念混淆了。这也难怪,这两个属性本身就很难分的清楚啊。那么,下面我们来聊聊这两个维度的区别吧!

同步和异步

        事实上,同步和异步的唯一区别就在于是否需要一直等着结果,我们每一次发起IO实际上大部分的时候都是从文件系统里面获取数据或者是存储数据,是否需要一直等待获取数据。下面的这幅图就说明了这一点:


12


        接下来,我们来列举一个现实生活中的例子来解释这个问题。比如说你向某人借钱,然后这个时候他说没有足够的钱借给你,需要点时间去筹钱。如果你这个时候就是等,等着他把钱给到你才算结束,那就是同步。当然,你给他说,你先筹,我先回去,筹备好了给我打电话就行。这个时候就是所谓的异步。那么,下面的小节我们来谈谈阻塞和非阻塞的概念。

阻塞和非阻塞

        还是刚才借钱的例子,假如你选择了回家,回家之后你这钱实在急用,你不停的打电话问他,钱到位了没?到位了没?这就是阻塞了,实际上,你现在什么事情都做不了。
而如果你还去打个高尔夫,喝一杯Coffee,那就是非阻塞的。就是说两件事之间相互不影响,你的其与计划还是再往下不断的进行中。

两个维度的组合

        好了,现在我们该来看看这两个维度如果组合起来了,会有怎样的效果?实际上,从数学的排列组合我们知道,共有四种组合。这四种组合肯定会有优略之分。下面我们来看看。再看这个问题之前,我们先来看看这两个维度的优先级谁高一些。
        很明显,同步和异步的高,因为假如是同步的,这个时候是否阻塞实际已经不重要了,更进一步的说,是否同步是描述我们的程序同IO系统的交互行为,而是否阻塞是描述我们在和IO系统的交互的时候的行为。
        那么到了这里结果就很明显了。对于同步IO而言,无所谓是否阻塞。因为我们必须等待IO系统的数据。实际上java采取的就是同步阻塞IO,当然,我说的是普通的IO,别的特殊的如NIO等暂不涉及。
        而如果是异步的呢?那么是否阻塞问题就很大了?阻塞的话还是起不了多大作用,因为你还是不能去做别的事情,而如果非阻塞的话,那就完美了。你可以并行的去做别的事情。
        综合来看,异步非阻塞的IO模式胜出。实际上,Node也正是采用了这种IO模式。

总结

        我觉得,要搞清楚IO模型的问题,首先需要了解去描述它的一个维度,然后就是这些维度的优先级,比如我们这里的话就有两个维度,而明显是同步的优先级高一些。而这里的是否同步我们可以看得出来实际上是操作系统控制的。而是否阻塞则可以由程序本身来做。所以高低立现。
        我们对于那些艰涩难懂的概念一定要多咀嚼多理解,才能实际的运用到我们的工作中去。今天的IO分享就到这里了。

1 0
原创粉丝点击