AFAIK,Java中的内存基于堆,内存从中动态地分配给对象,并且没有共享内存的概念.
如果没有共享内存的概念,那么Java程序之间的通信应该是耗时的.在C中,与其他通信模式相比,通过共享存储器进行进程间通信更快.
如我错了请纠正我.另外,两个Java程序相互交流的最快方式是什么.
Aar*_*lla 14
由于没有用于创建共享内存段的官方API,因此需要使用帮助程序库/ DDL和JNI来使用共享内存来使两个Java进程相互通信.
实际上,由于Java支持线程,因此这很少成为问题,因此您可以在同一个Java VM中运行两个"程序".那些将共享相同的堆,因此通信将是即时的.另外,由于共享内存段的问题,您无法获得错误.
要注意的一件事是使用内存映射文件,使用Java NIO的FileChannel类或类似文件(请参阅map()方法).我们已经非常成功地使用它来在同一台机器上的Java进程和C本机进程之间进行通信(在我们的例子中是单向的).
我承认我不是文件系统专家(幸运的是我们确实有一个人员!)但我们的性能绝对超快 - 实际上你将页面缓存的一部分视为文件并阅读+写入直接没有系统调用的开销.我不确定保证和一致性 - 在Java中有一些方法可以强制将更改写入文件,这意味着它们(通常?通常?通常?不确定)写入实际的基础文件(有点?非常?非常?)懒洋洋地说,这意味着在某些时候它基本上只是一个共享的内存段.
从理论上讲,据我所知,内存映射文件CAN实际上可以由共享内存段支持(我认为它们只是文件句柄),但我不知道在没有JNI的Java中这样做的方法.
共享内存有时很快.有时它不 - 它会损害CPU缓存和同步通常是一种痛苦(并且它应该依赖于互斥体等,这可能是一个主要的性能损失).
Barrelfish是一个操作系统,它表明使用消息传递的IPC实际上比共享内存更快,因为核心数量增加(在传统的X86架构上以及你认为它所针对的更具异国情调的NUMA NUCA东西).
因此,您对共享内存快速的假设需要针对您的特定方案和目标硬件进行测试.这些天它不是一般的声音假设!
| 归档时间: |
|
| 查看次数: |
36650 次 |
| 最近记录: |