当前位置: 首页 > news >正文

支撑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. 同步异步,阻塞和非阻塞

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

相关文章:

  • vue2+element 通用表格组件封装
  • Symbol Table
  • LeetCode所有大于等于节点的值之和
  • 基站天线交叉极化比测量的不确定度评定
  • RTL8367/N/RB/S/SC系列千兆交换机方案选型参考
  • GO 调用 python3 (基于ubuntu) 实现人脸识别
  • 澳利率攀升,加息步伐将在某个时候放缓
  • AOP实现系统告警
  • Spring Boot集成第三方登录之微博登录
  • 那么我们应该如何优化Youtube的视频呢?
  • 带你秒懂 SSR-服务端渲染
  • MindRecord-Windows下中文路径问题Unexpected error. Failed to open file
  • 基于随机森林实现特征选择降维及回归预测(Matlab代码实现)
  • 链表的奇偶重排
  • 华为ENSP网络设备配置实战2(较为复杂的ospf)
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Docker容器管理
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Promise面试题,控制异步流程
  • React的组件模式
  • 给初学者:JavaScript 中数组操作注意点
  • 观察者模式实现非直接耦合
  • 后端_ThinkPHP5
  • 基于webpack 的 vue 多页架构
  • 入门级的git使用指北
  • 删除表内多余的重复数据
  • 使用agvtool更改app version/build
  • 微信小程序填坑清单
  • 小程序button引导用户授权
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 用Visual Studio开发以太坊智能合约
  • 智能合约Solidity教程-事件和日志(一)
  • Nginx实现动静分离
  • Spring第一个helloWorld
  • ​Spring Boot 分片上传文件
  • ![CDATA[ ]] 是什么东东
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (WSI分类)WSI分类文献小综述 2024
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转载)OpenStack Hacker养成指南
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET 反射的使用
  • .NET命令行(CLI)常用命令
  • .NET微信公众号开发-2.0创建自定义菜单
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [20190113]四校联考
  • [C++] 默认构造函数、参数化构造函数、拷贝构造函数、移动构造函数及其使用案例
  • [CSS]中子元素在父元素中居中
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择
  • [flume$2]记录一个写自定义Flume拦截器遇到的错误
  • [Fri 26 Jun 2015 ~ Thu 2 Jul 2015] Deep Learning in arxiv