Hadoop RPC热身之Java NIO

来源:互联网 发布:linux c 服务器 编辑:程序博客网 时间:2024/06/05 22:36

在讲NIO之前先来谈谈阻塞与非阻塞IO,同步与异步IO。

我们知道IO读请求操作包含两步

1)查看数据是否就绪;

2)进行数据拷贝(内核将数据拷贝到用户线程)。

为什么会存在数据拷贝?因为用户空间是非特权区域,不能直接访问硬件设备。

阻塞与非阻塞区别在第一阶段,如果待读取的数据没有就绪,是不是一直处于等待状态

而同步与异步区别在于第二阶段,看数据拷贝是由用户线程完成还是内核线程完成

UNIX系统有五种IO模型:

阻塞IO模型,非阻塞IO模型,多路复用IO模型,信号驱动IO模型,异步IO模型

不过有人认为NIO是多路复用IO模型,有的说是异步IO模型,不过我认为支持异步非阻塞IO模型总是没错的。

除了上述优点外,NIO还有个重要概念就是它是基于块的,传统的IO是基于字节的,就像编程思想里说的:通道好比煤矿,缓冲区(块缓冲区)就像卡车,卡车满载而归。

图1是大概的逻辑模型,这样就减少了以前的不必要等待,也就是你该干嘛干嘛去,等好了通知你。


图1  基于事件驱动模型图

至于程序就不贴了,网上也很多,具体可看API。下面我想说说大概流程,便于记住

以前我们写程序,先创建网络套接字连接,获取连接上的输入输出流,这个Stream是按照字节来的。

现在呢,

我们创建的叫通道Channel,java虚拟机呢有个线程叫通道管理器selector,这时你把通道的监听交给这个通道管理器。这一步是不是证明你不用死等了?

光注册事件没用啊,你怎么捕获呢?好,你可以写个死循环,一直询问有没有我感兴趣的事件(比如读事件啊)。如果有,就在得到的事件下编写相应逻辑代码。

我们知道,阻塞和cpu的切换是一种资源浪费,我们也可能想过怎么去减少等待的时间与cpu资源的占用。NIO很好的给我们提供了解决方案。

当然了,NIO不止这一个特性,他的共享缓冲区也是蛮强大的,对于分析hadoop的RPC机制,今天先分析到这

0 0
原创粉丝点击