Hadoop RPC热身之Java NIO

17 篇文章 0 订阅
15 篇文章 0 订阅

在讲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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值