支撑Java NIO与NodeJS的底层技术

 更新时间:2016年09月15日 17:12:30   作者:SolidMango  
这篇文章主要为大家详细介绍了支撑Java NIO与NodeJS的底层技术,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

支撑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 序列化和反序列化实例详解

    Java 序列化和反序列化实例详解

    这篇文章主要介绍了Java 序列化和反序列化实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • SpringCloud基于RestTemplate微服务项目案例解析

    SpringCloud基于RestTemplate微服务项目案例解析

    这篇文章主要介绍了SpringCloud基于RestTemplate微服务项目案例,在写SpringCloud搭建微服务之前,先搭建一个不通过springcloud只通过SpringBoot和Mybatis进行模块之间通讯,通过一个案例给大家详细说明,需要的朋友可以参考下
    2022-05-05
  • 细数java中Long与Integer比较容易犯的错误总结

    细数java中Long与Integer比较容易犯的错误总结

    下面小编就为大家带来一篇细数java中Long与Integer比较容易犯的错误总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • mybatis 实现多条update同时执行

    mybatis 实现多条update同时执行

    这篇文章主要介绍了mybatis 实现多条update同时执行,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • java自定义注解验证手机格式的实现示例

    java自定义注解验证手机格式的实现示例

    这篇文章主要介绍了java自定义注解验证手机格式的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • springboot实现通过路径从磁盘直接读取图片

    springboot实现通过路径从磁盘直接读取图片

    这篇文章主要介绍了springboot实现通过路径从磁盘直接读取图片,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • springboot集成kafka消费手动启动停止操作

    springboot集成kafka消费手动启动停止操作

    这篇文章主要介绍了springboot集成kafka消费手动启动停止操作,本文给大家介绍项目场景及解决分析,结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Java整合mybatis实现过滤数据

    Java整合mybatis实现过滤数据

    这篇文章主要介绍了Java整合mybatis实现过滤数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • Arthas在线java进程诊断工具在线调试神器详解

    Arthas在线java进程诊断工具在线调试神器详解

    Arthas是 Alibaba 开源的Java诊断工具,深受开发者喜爱。这篇文章主要介绍了Arthas在线java进程诊断工具 在线调试神器,需要的朋友可以参考下
    2021-11-11
  • 如何构建可重复读取inputStream的request

    如何构建可重复读取inputStream的request

    这篇文章主要介绍了如何构建可重复读取inputStream的request,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03

最新评论