hadoop学习笔记(二)——IO的5种模型

        之前说了为了分析hadoopRPC机制,就要了解NIO,在说NIO之前我想先把IO的5种模式简要的记录下。

        首先在Unix网络编程中IO大致分为5种:

        1.阻塞IO

        2.非阻塞IO

        3.多路复用IO

        4.信号驱动IO

        5.异步IO

        因为第四种不常用,所以我就分析剩下的四种模型。

         当然我在研究这些模式的时候还是经常搞混一些东西,比如大家肯定听过什么同步IO,阻塞IO,同步非阻塞IO,当时我也对这些概念很模糊,现在就先来理一理。

       在Unix中的同步和异步的定义先来看一看:

       同步IO操作:IO操作将导致请求进程阻塞,直到IO操作完成。

      异步IO操作:IO操作不导致请求进程阻塞

        然后我理解中IO模型可以从两部分来分,一种是阻塞和非阻塞,一种是同步和异步。怎么区别他们呢,这里首先就要理解IO操作的整体过程,我所理解的是IO的操作一般就分为两部分,第一步是发起IO请求(就是等待数据准备),第二步是实际IO操作(就是将数据从内核拷贝到进程中)。阻塞和非阻塞的区别就在第一步,同步和异步的区别就在第二步。有了这两个概念,我们就来简略的分析下5种IO模型。

       一.阻塞IO

      这种IO模式就是最常见的IO模式,就像我们操作read()的时候,首先发送读取数据的IO请求,当数据还没到来的时候,进程就要一直等待直到请求被接受,数据到来,这时候才进行数据的读取操作,这里我们可以看出IO的两个操作,发起请求的时候进程要被阻塞,实际IO操作的时候进程也要被阻塞。我们以一个例子来形象说明,当你叫了一个外卖的时候,叫完外卖,什么事都不干,就等着外卖到来,这就是阻塞IO。

        二.非阻塞IO

      这种IO模型是这样的,依旧以操作read()为例,首先发送IO请求,当数据还没来的时候进程不用等待,但是会不断轮询看看数据是否到来,没来的话返回一个error,直到数据到来为止。可以发现这种模型在发起请求的时候进程是没在等待的。还是以外卖的例子,当你叫完外卖的时候,不是什么事都不干,而是一直打电话问外卖到了没有,这就是非阻塞IO。

        三.多路复用IO

       这种IO模型引入了seclect/epoll的概念,其中epoll是select的升级版。就先以select来说,他调用了一个select函数,或者说是代理。我们知道在阻塞IO中一个线程只能处理一个IO请求,要是想处理多个IO请求呢,这时候就引入了select的代理,它可以同时帮多个IO代理,不断轮询流中的数据,当有可读或者可写的数据的时候就告知给在等待的IO线程。多路复用IO就是这样一种IO模型,这时候我们以socket为例,首先进程要先调用一个select,这时候进程就会被阻塞,而同时,内核会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。可以知道这中模型在发送请求阶段进程还是阻塞的只不过是select阻塞了进程。这种模式和阻塞模式很像,不同的是可以处理多个IO请求。以外卖的例子为例,这时候不同的是你可以同时叫还几分不同的外卖,哪份外卖来了就可以去取那份外卖,取的时候别的外卖是进不来的。

       四.异步IO模型

      之前我们知道同步和异步的概念主要就是在实际IO操作的时候,同步IO在实际IO操作的时候将导致进程阻塞,异步IO将不会导致进程阻塞。异步IO模型就是当你发出IO请求的时候,进程可以做别的事情,所有的数据请求,实际 IO操作都在后台完成,只要完成的时候通知你就行了。以外卖的例子为例,这时候我们加一个过程,就是取外卖的过程,同步IO模型就是外卖到的时候你要自己下楼去取,异步IO模型就是外卖会直接送到你的桌面上,然后通知你外卖到了。

       综上我们可以知道,阻塞IO,非阻塞IO,多路复用IO,信号驱动IO,其实都是同步IO。他们的主要区别就在第一步发送请求的时候进程是否被阻塞,第二步实际IO操作的时候进程都是要被阻塞的。

最后一张图来理清这几种IO之间的区别:


hadoop学习笔记(二)——IO的5种模型_第1张图片
 

   

      好了IO模型就先讲到这里,其实自己觉得还很浅显有些问题没有明确,欢迎大神指出,下一篇将说说java的NIO。

     

      

 

 

 

 

 

 

 

 

你可能感兴趣的:(hadoop)