Java 7 SDP:一次编写,到处运行,有时还运行得超炫!

本文将简单介绍Java 7 SDK里引入的Java套接字直接协议(Sockets Direct Protocol,SDP),这项新技术是个非常激动人心的突破。如果要对InfiniBand的远程直接内存存取(Remote Direct Memory Access,RDMA)进行native访问,SDP就能让超高性能计算(Ultra High Performance Computing,UHPC)社区在这种不常见的场景下使用Java通用的特性和优势。RDMA为低延迟应用提供了一种协议,可以直接访问其他计算机的内存,而不需要操作系统的参与。UHPC社区对低延迟和高吞吐量的要求最为严格,而且不容妥协,UHPC自然就需要使用最好的RDMA。随着Java 7引入SDP,UHPC社区就可以利用Java平台编写能直接利用InfiniBand RDMA功能的应用代码了。

在深入了解新的Java SDP之前,让我们简要回顾一下Java网络编程和套接字API的历史。

Sun Microsystems于1995年推出Java,并宣扬Java能“一次编写,到处运行”,这句口号现在已然广为人知。我们都知道这背后的思想其实很简单:用C++代码编写的应用要在所有环境下构建/部署是极其困难的,追求接近“到处运行”的可移植性就更难了,但现在你可以用一种叫Java的语言编写应用代码,应用可以在虚拟机(并不是底层的操作系统执行环境)上构建/部署。这极大地减少了Java应用程序员对可移植性的关注,而是把可移植性完全交给Java虚拟机(JVM)去处理。JVM承诺:如果你的Java代码可以在针对某个特定底层操作系统的JVM上构建/部署,只要其他操作系统有可用、兼容的JVM,平台就能确保完全相同的代码可以在上面运行。而不需要额外的编译和预处理器宏指令。(有人记得C++里的#ifdef么?JVM可以让应用程序员摆脱这种痛苦。)

这种思想非常有用,得到了应用编程社区的广泛认可。正如我们所知,Java非常迅速地流行起来——以前所未有的速度被全面接受,计算机历史上的很多编程语言平台都没有这么迅速地普及过。

Sun一开始提供的JVM只能运行在三个操作系统上:1、Solaris,2、Linux,3、Windows。微软在1993年发布的Windows就带有WinSOCK协议栈,所以Windows可以做TCP/IP网络编程,而且完全支持API。各种*nix系统从二十世纪七十年代起就一直在支持TCP/IP。微软引入WinSOCK对Java的成形来说绝对必要。没有WinSOCK,就不能发布支持java.net.*和java.io.*这些APIs的Windows VM。没有WinSOCK,Java构建的VM在垄断世界桌面的操作系统上就不具备完整的网络功能了。随着Windows完全支持TCP/IP,运行Java的桌面数量可能增加了上千倍。

事情发生了变化

当然,Java仍然是“一次编写,到处运行”。可移植性仍然是首要任务。但现在用Java 7和SDP,JVM能做更多的事情。可移植性不再是唯一的重点;对JVM来说,满足超高性能用例的需求也是很重要的任务。借助SDP,JVM不需要修改网络、套接字API,就可以直接利用InfiniBand天生的能力。InfiniBand要比以太网快很多。UHPC社区往往会选择InfiniBand作为物理网络层的提供者。

a 7 VM怎么让应用利用InfiniBand原生的功能。

 

有件有趣的事情要注意(特别是从历史的角度来看):Java决定在两个操作系统上提供SDP支持,而微软Windows并不在其中。Java 7 SDP支持的两个操作系统是Solaris和Linux。Solaris从版本10开始就对SDP提供了规范的支持。只要你有物理InfiniBand网卡,Java 7 SDP就可以立即工作。Linux则通过Open Fabrics Enterprise Distribution(OFED)包支持SDP。要确认Linux版本有没有配置OFED设备驱动器,只需要在安装物理InfiniBand网卡适配器之后简单键入下面的命令:

egrep "^[ \t]+ib" /proc/net/dev

如果命令有输出,就表明你可以在这个操作系统上使用Java 7 SDP。

所有的java.net.*和java.io.*应用代码仍然能在微软Windows上用Java 7 VM运行……但它用不了SDP,运行时的物理层提供者仍然是以太网。即使你在通过WinSOCK Direct子系统提供InfiniBand支持的Windows Server版本上运行,也用不了SDP。所有的内容仍然能在Windows上运行,但速度会比在非Windows(即*nix)上运行得慢。

事情确实发生了变化

现在让我们谈谈Java里面连接操作系统网络协议栈的API。首先,下表显示了网络层标准的开放系统互连(OSI)模型。

从OSI网络层的视角看,Java 7 SDP能让Java应用代码“更接近金属”(物理层)。Java SDP提供了一种直接(SDP里的D)的方式,借助VM就可以连接应用代码和native、物理的InfiniBand。Java 7对SDP的支持不需要应用修改使用java.net.*和java.io.* APIs的代码。此外,只要配置好JVM到InfiniBand操作系统设备和库(即InfiniBand的VERBs层API)的特定连接点,使用java.net.*和java.io.*的应用代码就能绕过传统的网络协议栈“直接”访问InfiniBand(也就是使用Java针对OSI第四层传输层的API,就可以绕过OSI第三层网络层和第二层数据链路层,直接访问OSI第一层物理层)。对性能的影响和收到的回报都非常显著。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, java代码java
, windows
, c++套接字
, 操作系统
, 应用
, 运行
, java网络
, java网络编程
, sdp
, java 7
, java windows api
, ios移植
java 7
java7下载、java 7 32位、java、java7、java 7 64位,以便于您获取更多的相关知识。

时间: 2024-10-31 15:53:42

Java 7 SDP:一次编写,到处运行,有时还运行得超炫!的相关文章

JAVA 中 jar 文件的编写和应用

JAVA中jar文件的编写和应用     我想JAVA的爱好者,尤其是初学者大都有过这样的经历,就是喜欢JAVA编程语言(这个人的情况可能不一样),但是有时候总会觉得JAVA的优点便是她的"致命"的缺点.大家的信念依旧是"一次编译,到处运行"但是就是因为至一点JAVA失去了好多,我们也失去了好多.也许大家都知道,现在业界最推崇的还是微软的技术微软的产品..net/c#/.vb/vb.net还是最流行的语言,最受欢迎的软件开发语言.因为这些语言都太好学太好用了.不像J

Fork and Join: Java也可以轻松地编写并发程序

原文地址   作者:Julien Ponge 译者:iDestiny 资源下载: Java SE 7 Sample Code(Zip) 如今,多核处理器在服务器,台式机及笔记本电脑上已经很普遍了,同时也被应用在更小的设备上,比如智能手机和平板电脑.这就开启了并发编程新的潜力,因为多个线程可以在多个内核上并发执行.在应用中要实现最大性能的一个重要技术手段是将密集的任务分隔成多个可以并行执行的块,以便可以最大化利用计算能力. 处理并发(并行)程序,一向都是比较困难的,因为你必须处理线程同步和共享数据

hadoop mapreduce 在编写好的程序下 运行程序出现错误,求错误所在

问题描述 hadoop mapreduce 在编写好的程序下 运行程序出现错误,求错误所在 15/09/01 10:05:06 INFO mapred.JobClient: map 0% reduce 0% 15/09/01 10:05:22 INFO mapred.JobClient: Task Id : attempt_201509011003_0001_m_000002_0, Status : FAILED java.util.NoSuchElementException at java.

Mustang与Rhino:Java 6中的脚本编写

最新的Java主版本(Java SE 6,又称Mustang)现在正处于beta版本阶段.虽然该版本并不像Java 5的更新那么多,但是它确实有一些有趣的新特性.毋庸置疑,其中的一个就是对脚本编写语言的支持. 诸如PHP.Ruby.JavaScript.Python(或Jython)之类的脚本编写语言被广泛应用于许多领域,并由于其灵活性和简单性而大受欢迎.由于脚本是被解释而不是被编译的,所以可以轻松地从命令行运行和测试它们.这就压缩了编码/测试周期,并提高了开发人员的生产率.脚本通常是动态键入的

eclipse报错-JAVA程序编程成CLASS文件后能在CMD运行,但是无法运行ECLIPSE。

问题描述 JAVA程序编程成CLASS文件后能在CMD运行,但是无法运行ECLIPSE. JAVA程序编程成CLASS文件后能在CMD运行,但是无法运行ECLIPSE,报错 解决方案 具体是哪里错了,有截图吗 解决方案二: 直接将该程序的源代码复制到eclipse某项目的src下再运行该程序 解决方案三: http://jingyan.baidu.com/article/15622f247de105fdfcbea5c9.html 解决方案四: 是无法运行ECLIPSE还是代码在ECLIPSE上报

java网络编程-Java写了个简单的网络编程程序,运行没有结果,求解谢谢!

问题描述 Java写了个简单的网络编程程序,运行没有结果,求解谢谢! import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import ja

关于使用exe4j将java的jar文件转化为exe文件,在运行时出现的问题

问题描述 关于使用exe4j将java的jar文件转化为exe文件,在运行时出现的问题 关于使用exe4j将java的jar文件转化为exe文件,在运行时出现的问题 附上图片 解决方案 exe4j 将java jar文件转换为exe文件出错exe4j生成Java的exe文件 解决方案二: 我以前用的时候也出现过一样的报错,这是应为你打包的时候用的是64位的jdk,装一个32位的jre,在打包此项目的时候选择32位的jre就可以了. 解决方案三: 具体问题具体解决吧,是JRE版本的问题

把matlab打包成jar在java中运行,小波变换运行不了

问题描述 把matlab打包成jar在java中运行,小波变换运行不了 为了使整个过程一体化因此将.m文件打包成jar,不过报错了: ERROR ... wfilters ---> Invalid wavelet file : dmey.mat {??? Error using ==> wfilters at 66 Invalid wavelet file : dmey.mat Error in ==> wavedec at 33 Error in ==> tezheng at 2

java,怎么删除一个文件。例如一个正在运行的jar文件,需要什么流程

问题描述 java,怎么删除一个文件.例如一个正在运行的jar文件,需要什么流程 我希望更新程序,要用新文件替换旧文件.一定要先删除旧文件吗?另,这个文件如果 在运行怎么办. 解决方案 虽然不可以删除,但是可以改名.所以你可以先将自身改名,下载新程序,启动新程序,关闭自己,新程序删除改名后的老程序. 解决方案二: 运行的文件无法删除 jar包是可以在运行后删除硬盘上的文件的,但是需要用类加载器替换类,才能使要更新的class被应用 有什么其他问题可以到易学it问答问我 解决方案三: 正在用的文件