支撑 Java NIO 与 NodeJS 的底层技术

众所周知在近几个版本的Java中增加了一些对Java NIO、NIO2的支持,与此同时NodeJS技术栈中最为人称道的优势之一就是其高性能IO,那么我们今天要讨论的话题就是支撑这些技术的底层技术。

开始之前先要提出的一个问题是:

为什么NodeJS和Java NIO2没有在更早的时间出现?

答案:个人认为是底层的支撑技术还不成熟。

那么,底层技术指的是什么呢?对的,我想很多人已经猜到,是操作系统技术。本文提出的两个概念Java NIO2和NodeJS无一例外都是用户态技术或者说是应用层技术,而这些应用层技术是运行于OS之上的,与此同时随着操作系统的进步,可以支撑的编程模型也更加的丰富。可以这么说,这两项技术完全是为了应用操作系统进步带来的红利而进化出来的技术。一般来说最先享受这种红利的技术一定是C\C++,因为OS的进步最新提供的大部分是系统调用,而C\C++是最方便应用这些系统调用的,但是同时也是最复杂的。其他平台为了也获得同样的性能,就必须不断的进化,封装,使用户可以用上这些红利,一旦那个平台停滞更新,也就是这个平台没落的时候了。对用户来说封装的越方便,对用户来说就越是友好,可能使用的人就越多。虽然很多人可以很快的写出基于这些平台的代码,但是往往不得其精髓,因为本质上还是不理解这些技术的动机和原理。下面我们讨论的这些技就是这两项技术相关的底层技术。

不管哪一种OS设计中,下面5种IO模型都是必不可少的。

  • 1. blocking I/O
  • 2. nonblocking I/O
  • 3. I/O multiplexing (select, poll and epoll)
  • 4. signal driven I/O (SIGIO)
  • 5. asynchronous I/O (the POSIX aio_ functions)

1. blocking I/O

如图所示,这种IO模型的优点是编程简单,也是OS最早支持的IO模型之一,缺点是系统调用阻塞用户动态线程执行,从而造成CPU时间浪费,IO效率低。

2. nonblocking I/O

如图所示,这种IO模型的一个改进是IO是非阻塞了,但是需要长轮询,同样浪费CPU时钟周期。

3. I/O multiplexing (select, poll and epoll)

如图所示,这种IO模型是当今OS提供的最稳定的IO模型,大部分主流的应用都是基于此种IO模型构建的,比如NodeJS,但是这些平台往往在这种模型之上增加一层封装来直接支持AIO。

4. signal driven I/O (SIGIO)

如图所示,资料记载这种IO模型由于对比模型3没有性能优势,同时由于系统支持不稳定,很少为设计者采用。

5. asynchronous I/O (the POSIX aio_ functions)

如图所示,此种IO模型是最完美的AIO,编程模型也最简单,但是能够完美支持者个模型的OS很少,网上资料显示Linux正在做这方面的努力,一旦OS在这个方面上取得进展,编程框架,平台,编程模型可能还是需要有很大程度的简化。

虽然这种模型很少有OS的支持,但是并不是说现在就没有这种AIO模型,很多框架做了这方面的工作,在用户态模拟了AIO,使用户可以更多的关注业务逻辑代码。

6. 同步异步,阻塞和非阻塞

同步和异步是针对应用程序和内核的交互而言的。一直等到数据读完再返回的是同步,直接返回的是异步。阻塞和非阻塞是对进程、线程而言的,阻塞方式下读取或者写入线程一直等待,而非阻塞方式下,读取或者写入线程立即返回一个状态值。

原文发布于微信公众号 - java一日一条(mjx_java)

原文发表时间:2016-09-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器人网

工业机器人典型控制系统及结构

工业机器人由主体、驱动系统和控制系统三个基本部分组成。 主体即机座和执行机构,包括臂部、腕部和手部,有的机器人还有行走机构。大多数工业机器人有3~6个运动自由度...

3645
来自专栏MongoDB中文社区

为什么MongoDB适合深度学习?

当您正在考虑为新的深度学习项目选择何种数据库时,您可以访问这个链接所对应的帖子(https://www.mongodb.com/blog/post/deep-l...

2151
来自专栏向治洪

OtterTune来了,DBA怎么办

概述 最近几年,特别是随着云计算的发展,出现了行业向后重叠和推动的情况。数据库龙头企业Oracle最近几年重点转而向云的变革,它全力以赴在做的一件事情就是把所有...

2636
来自专栏每日一篇技术文章

教你如何制作APP 赚钱

1.识别图片中多张人脸的年龄 2.有分享功能 3.用评分功能 4.投放Google广告

9731
来自专栏逍遥剑客的游戏开发

Direct3D学习(二):模型显示

2419
来自专栏Spark学习技巧

HBase在滴滴出行的应用场景和最佳实践

本文主要介绍HBase在滴滴内部的一些典型使用场景,如何设计整个业务数据流,让平台开发者与用户建立清晰、明确、良好的合作关系 背景 对接业务类型 HBase是建...

4768
来自专栏恰童鞋骚年

Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍

  本次要实践的数据日志来源于国内某技术学习论坛,该论坛由某培训机构主办,汇聚了众多技术学习者,每天都有人发帖、回帖,如图1所示。

1682
来自专栏灯塔大数据

干货|在选择数据库的路上,我们遇到过哪些坑?

我是 FactGem 的首席技术官 Clark Richey。FactGem 是一家小公司。 在这里我想说一说我们是怎么开始接触数据库技术的,然后我们做出了哪...

2917
来自专栏斑斓

选择缓解风险的技术

三. 选择缓解风险的技术 一旦识别出迁移过程中可能存在的风险,我们就可以有的放矢地选择相关技术,制订降低风险的解决方案。 寻找丢失的知识 只有体验过去,才能谋...

3559
来自专栏情情说

我的常用工具集

今天年后第一天上班,去年会有公司高管在门口发红包,本来想早点去公司,但还是晚到20分钟,错失了我的大红包 :)。上午一直不在状态,可能是所谓的节后综合征,下午慢...

3129

扫码关注云+社区

领取腾讯云代金券