| 共享内存在Java中的实现和应用 |
| 出自:ibm 郭洪锋 2002年10月15日 23:07 |
| 共享内存在Java中的实现和应用 内容: 1 共享内存对应应用开发的意义 2 共享内存在java中的实现 3 共享内存在java中的应用 作者介绍 郭洪锋 (ghf_emai@china.com) 2001 年 9 月 1 共享内存对应应用开发的意义 对熟知UNIX系统应用开发的程序员来说,IPC(InterProcess Communication)机制是 非常熟悉的,IPC基本包括共享内存、信号灯操作、消息队列、信号处理等部分,是开发应 用中非常重要的必不可少的工具。其中共享内存IPC机制的关键,对于数据共享、系统快 速查询、动态配置、减少资源耗费等均有独到的优点。 对应UNIX系统来说,共享内存分为一般共享内存和映像文件共享内存两种,而对应 Windows,实际上只有映像文件共享内存一种。所以java应用中也是只能创建映像文件共享 内存。 在java语言中,基本上没有提及共享内存这个概念,但是,在某一些应用中,共享内 存确实非常有用,例如采用java语言的分布式应用系统中,存在着大量的分布式共享对象, 很多时候需要查询这些对象的状态,以查看系统是否运行正常或者了解这些对象的目前的一 些统计数据和状态。如果采用网络通信的方式,显然会增加应用的额外负担,也增加了一些 不必要的应用编程。而如果采用共享内存的方式,则可以直接通过共享内存查看对象的状态 数据和统计数据,从而减少了一些不必要的麻烦。 共享内存的使用有如下几个特点: 可以被多个进程打开访问; 读写操作的进程在执行读写操作时其他进程不能进行写操作; 多个进程可以交替对某一共享内存执行写操作; 一个进程执行了内存的写操作后,不影响其他进程对该内存的访问。同时其他进程对更新后的内存具有可见性。 在进程执行写操作时如果异常退出,对其他进程写操作禁止应自动解除。 相对共享文件,数据访问的方便性和效率有 另外,共享内存的使用上有如下情况: 独占的写操作,相应有独占的写操作等待队列。独占的写操作本身不会发生数据的一致性问题。 共享的写操作,相应有共享的写操作等待队列。共享的写操作则要注意防止发生数据的一致性问题。 独占的读操作,相应有共享的读操作等待队列; 共享的读操作,相应有共享的读操作等待队列。 一般情况下,我们只是关心第一二种情况。 2 共享内存在java中的实现 在jdk1.4中提供的类MappedByteBuffer为我们实现共享内存提供了较好的方法。该缓 冲区实际上是一个磁盘文件的内存映像。二者的变化将保持同步,即内存数据发生变化会立 刻反映到磁盘文件中,这样会有效的保证共享内存的实现。 将共享内存和磁盘文件建立联系的是文件通道类:FileChannel。该类的加入是JDK为 了统一对外部设备(文件、网络接口等)的访问方法,并且加强了多线程对同一文件进行存 取的安全性。例如读写操作统一成read和write。这里只是用它来建立共享内存用,它建立 了共享内存和磁盘文件之间的一个通道。 打开一个文件建立一个文件通道可以用RandomAccessFile类中的方法getChannel。该 方法将直接返回一个文件通道。该文件通道由于对应的文件设为随机存取文件,一方面可以 进行读写两种操作,另一方面使用它不会破坏映像文件的内容(如果用FileOutputStream直 接打开一个映像文件会将该文件的大小置为0,当然数据会全部丢失)。这里,如果用 FileOutputStream和FileInputStream则不能理想的实现共享内存的要求,因为这两个类同时 实现自由的读写操作要困难得多。 下面的代码实现了如上功能,它的作用类似UNIX系统中的mmap函数。 // 获得一个只读的随机存取文件对象 RandomAccessFile RAFile = new RandomAccessFile(filename,"r"); // 获得相应的文件通道 FileChannel fc = RAFile.getChannel(); // 取得文件的实际大小,以便映像到共享内存 int size = (int)fc.size(); // 获得共享内存缓冲区,该共享内存只读 MappedByteBuffer mapBuf = fc.map(FileChannel.MAP_RO,0,size); // 获得一个可读写的随机存取文件对象 RAFile = new RandomAccessFile(filename,"rw"); // 获得相应的文件通道 fc = RAFile.getChannel(); // 取得文件的实际大小,以便映像到共享内存 size = (int)fc.size(); // 获得共享内存缓冲区,该共享内存可读写 mapBuf = fc.map(FileChannel.MAP_RW,0,size); // 获取头部消息:存取权限 mode = mapBuf.getInt(); 如果多个应用映像同一文件名的共享内存,则意味着这多个应用共享了同一内存数据。 这些应用对于文件可以具有同等存取权限,一个应用对数据的刷新会更新到多个应用中。 为了防止多个应用同时对共享内存进行写操作,可以在该共享内存的头部信息加入写操 作标志。该共享内存的头部基本信息至少有: int Length; // 共享内存的长度。 int mode; // 该共享内存目前的存取模式。 共享内存的头部信息是类的私有信息,在多个应用可以对同一共享内存执行写操作时, 开始执行写操作和结束写操作时,需调用如下方法: public boolean StartWrite() { if(mode == 0) { // 标志为0,则表示可写 mode = 1; // 置标志为1,意味着别的应用不可写该共享内存 mapBuf.flip(); mapBuf.putInt(mode); // 写如共享内存的头部信息 return true; } else { return false; // 指明已经有应用在写该共享内存,本应用不可写该共享内存 } } public boolean StopWrite() { mode = 0; // 释放写权限 mapBuf.flip(); mapBuf.putInt(mode); // 写入共享内存头部信息 return true; } 这里提供的类文件mmap.java封装了共享内存的基本接口,读者可以用该类扩展成自己 需要的功能全面的类。 如果执行写操作的应用异常中止,那么映像文件的共享内存将不再能执行写操作。为了 在应用异常中止后,写操作禁止标志自动消除,必须让运行的应用获知退出的应用。在多线 程应用中,可以用同步方法获得这样的效果,但是在多进程中,同步是不起作用的。方法可 以采用的多种技巧,这里只是描述一可能的实现:采用文件锁的方式。写共享内存应用在获 得对一个共享内存写权限的时候,除了判断头部信息的写权限标志外,还要判断一个临时的 锁文件是否可以得到,如果可以得到,则即使头部信息的写权限标志为1(上述),也可以 启动写权限,其实这已经表明写权限获得的应用已经异常退出,这段代码如下: // 打开一个临时的文件,注意同一共享内存,该文件名要相同,可以在共享文件名后加后缀“.lock”。 RandomAccessFile fis = new RandomAccessFile("shm.lock","rw"); // 获得文件通道 FileChannel lockfc = fis.getChannel(); // 获得文件的独占锁,该方法不产生堵塞,立刻返回 FileLock flock = lockfc.tryLock(); // 如果为空,则表明已经有应用占有该锁 if(flock == null) { ...// 不能执行写操作 } else { ...// 可以执行写操作 } 该锁会在应用异常退出后自动释放,这正是该处所需要的方法。 3 共享内存在java中的应用 共享内存在java应用中,经常有如下两种种应用: 永久对象配置。 在java服务器应用中,用户可能会在运行过程中配置一些参数,而这些参数需要永久 有效,当服务器应用重新启动后,这些配置参数仍然可以对应用起作用。这就可以用到该文 中的共享内存。该共享内存中保存了服务器的运行参数和一些对象运行特性。可以在应用启 动时读入以启用以前配置的参数。 查询共享数据。 一个应用(例 sys.java)是系统的服务进程,其系统的运行状态记录在共享内存中,其 中运行状态可能是不断变化的。为了随时了解系统的运行状态,启动另一个应用(例 mon.java),该应用查询该共享内存,汇报系统的运行状态。 可见,共享内存在java应用中还是很有用的,只要组织好共享内存的数据结构,共享内存就可以在应用开发中发挥很不错的作用。 关于作者 郭洪锋,从事UNIX系统上的分布式应用系统开发,已有四年分布式应用系统开发经验。E-mail:ghf_email@china.com。 |
相关推荐
IIS - 会话cookie中缺少HttpOnly属性
不啰嗦,我们直接开始! 先进行常规设置 打开配置编辑器 选中图中节点,将httpOnlyCookies设置为true 然后。。。不起作用。。。 换种方式 通过配置出站规则getcookie添加HttpOnly 在Web.config中添加如下出站规则 <rewrite> <outboundRules> <rule name="Add HttpOnly"> <match serverVa.
【Java】进程通信(共享内存)
`Java IO `操作的`BufferedReader` 、 `BufferedInputStream` 等相信大家都很熟悉,不过在 `Java NIO `中引入了一种基于` MappedByteBuffer `操作大文件的方式,其读写性能极高。 `MappedByteBuffer` 为共享内存缓冲区,实际上是一个磁盘文件的内存映射,实现内存与文件的同步变化,可有效地保证共享内存的实现。
如何用 Python 实现自动化测试?详细步骤和代码示例
Python自动化测试实战指南 本文系统介绍了使用Python构建自动化测试体系的完整方案。主要内容包括: 环境搭建:Python 3.8+虚拟环境配置,安装pytest、Selenium等核心测试库 分层测试实现: 单元测试:通过计算器示例演示pytest断言和异常测试 API测试:使用requests库进行RESTful接口验证 UI测试:Selenium WebDriver实现网页交互测试 高级特性: 使用fixture管理测试依赖 参数化实现数据驱动测试 生成HTML和Allure测试报告 GitH
Java的共享内存使用
java共享内存使用
C++ 程序稳定运行一段时间后异常中止?vc6 运行库的bug!!!
事件查看器提示:错误应用程序 xxxxxxx.exe,版本 0.0.0.0,错误模块 MSVCRTD.DLL,版本 6.0.9782.0,错误地址 0x00012b40。这是一个通信方面的软件,需要长期运行,在压力测试时,高负荷连续运行一定天数时必定崩溃,而且都是在msvcrtd.dll中崩溃。后来在dump文件中发现调用栈在是MSVCRTD.DLL模块,跟踪代码发现是在void * __cdecl _heap_alloc_dbg( size_t nSize, int nBloc
同态加密与SEAL库实战:CKKS参数调优避坑指南
本文深入探讨了同态加密技术中CKKS方案的参数调优实践,重点解析了SEAL库中`poly_modulus_degree`、`coeff_modulus`和`scale`三大核心参数的配置技巧与避坑指南。通过实战案例展示了如何平衡计算深度、精度与性能,为开发者提供了一套完整的参数优化方法论,帮助避免常见的'scale out of bounds'等错误,显著提升同态加密应用的可靠性和效率。
[Java并发基础] 共享内存
总的来说,共享内存是一种并发编程模型,用于实现线程之间的数据共享和通信,而Java并发是一种实现并发编程的方法,提供了一些工具和类来管理和控制多线程的执行。通过使用Java并发提供的工具和类,可以更方便地实现并发编程,并且避免一些共享内存的问题。通过使用Java并发提供的工具和类,可以更方便地实现并发编程,并且避免一些共享内存的问题。总的来说,共享内存是一种并发编程模型,用于实现线程之间的数据共享和通信,而Java并发是一种实现并发编程的方法,提供了一些工具和类来管理和控制多线程的执行。
2024届数字IC秋招-华为机试-数字芯片-笔试真题和答案(五)(含2022年和2023年)
此部分包含华为机试真题,方向是数字芯片,内容详细包括设计、验证、后端等,大部分题目给出参考答案。华为机试都是从题库里抽题目,所以这些题目还是很有参考性的,甚至是完全一样,可以搜到的。(题目内容较多,将分开编写几个文章)
java中共享内存的实现
JDK1.4里面的MappedByteBuffer为开发人员在java中实现共享内存提供了良好的方法,该 缓冲区实际上是一个磁盘文件的内存映像,二者的变化会保持同步,即内存数据发生变化过后会立即反 应到磁盘文件中,这样会有效的保证共享内存的实现,将共享文件和磁盘文件建立联系的是文件通道类 :FileChannel,该类的加入是JDK为了统一外围设备的访问方法,并且加强
手把手教你学simulink(13.2)--构建一个单相并网逆变器Simulink仿真模型
基于Simulink的单相并网逆变器项目的详细仿真实例。这个项目将重点放在逆变器的详细建模、最大功率点跟踪(MPPT)控制策略、并网控制和仿真分析上。我们将使用MATLAB/Simulink来构建整个系统,并通过具体的代码和模块来实现各个功能。
yandex 不定长旋转验证码PPOCR识别案例
可以看到,此种验证码非常变态,旋转角度不固定,干扰背景不固定,字符长度不固定,弯曲形变都是不固定的,在人眼都很难分辨验证码的情况下,其实都是对于模型来讲,也是比较困难的哈哈,传统验证码可能小几百张就能达到很好的效果了,是因为,验证码难度比较简单,通常都是4,6位定长,但是对于模型而言,无非就是增加数据量。由于该验证码的复杂度,自己写一个rcnn或者其他模型,来优化改数据集进行训练变的尤为困难复杂,所以这里强烈推荐百度飞桨的开源模型。在得到较好的loss后,导出模型。如有侵犯,请联系作者下架。
java共享内存_共享内存在Java中的实现和应用
一起学习郭洪锋 (ghf_emai@china.com)2001 年 9 月1 共享内存对应应用开发的意义对熟知UNIX系统应用开发的程序员来说,IPC(InterProcess Communication)机制是 非常熟悉的,IPC基本包括共享内存、信号灯操作、消息队列、信号处理等部分,是开发应用中非常重要的必不可少的工具。其中共享内存IPC机制的关键,对于数据共享、系统快 速查询、动态配置、减...
机器人轨迹规划——三次样条轨迹1(基于速度的求解方法)
三次样条轨迹是利用三次样条曲线来对给定的一系列点进行插值,从而得到一个光滑的轨迹。三次样条因为每段的多项式次数最高都是三阶的,所以可以得到2阶导数连续,也就是加速度连续的轨迹。假设给定了一系列的点q0q1q2qnq0q1q2...qn,以及每个点对应的参数t0t1t2tnt0t1t2...tn,计算一条三次样条曲线sts(t)st,该曲线通过给定的点q0q1q2qnq0q1。
JAVA基础:共享内存在Java中的实现和应用
(转自 http://www.builder.com.cn/2008/0424/831162.shtml) 1 共享内存对应应用开发的意义 对熟知UNIX系统应用开发的程序员来说,IPC(InterProcess Communication)机制是非常熟悉的,IPC基本包括共享内存、信号灯操作、消息队列、信号处理等部分,是开发应用中非常重要的必不可少的工具。...
最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版
Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。
假人有限元模型
假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用
java 共享内存 锁_[转]共享内存在java中的实现
共享内存在java中的实现1、共享内存对应应用开发的意义对熟知unix系统应用开发的程序员来说,ipc(interprocess communication)机制是非常熟悉的,ipc基本包括共享内存、信号灯操作、消息队列、信号处理等部分,是开发应用中非常重要的必不可少的工具。其中共享内存ipc机制的关键,对于数据共享、系统快速查询、动态配置、减少资源耗费等均有独到的优点。对应unix系统来说,共享...
WINCC7.3破解文件
WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!
java 读写 共享内存_共享内存在Java中的实现和应用
共享内存在Java中的实现和应用郭洪锋2001 年 9 月 03 日发布共享内存对应应用开发的意义对熟知UNIX系统应用开发的程序员来说,IPC(InterProcessCommunication)机制是非常熟悉的,IPC基本包括共享内存、信号灯操作、消息队列、信号处理等部分,是开发应用中非常重要的必不可少的工具。其中共享内存IPC机制的关键,对于数据共享、系统快速查询、动态配置、减少资源耗费等均...
SAP B1中文培訓教材_SDK
公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说
java共享内存_Java共享内存
1 共享内存对应应用开发的意义对熟知UNIX系统应用开发的程序员来说,IPC(InterProcessCommunication)机制是非常熟悉的,IPC基本包括共享内存、信号灯操作、消息队列、信号处理等部分,是开发应用中非常重要的必不可少的工具。其中共享内存IPC机制的关键,对于数据共享、系统快速查询、动态配置、减少资源耗费等均有独到的优点。对应UNIX系统来说,共享内存分为一般共享内存和映...
posix标准Java实现_共享内存中的条件变量 - 此代码是否符合POSIX标准?
POSIX标准是否允许 named 共享内存块包含互斥锁和条件变量?我们一直在尝试使用互斥和条件变量来同步对LynuxWorks LynxOS-SE system(POSIX-conformant)上的两个进程对命名共享内存的访问 .一个共享内存块称为 "/sync" ,包含互斥锁和条件变量,另一个是 "/data" ,包含我们同步访问的实际数据 .如果两个进程都没有在 exactly the s...
共享内存在Java中实现和应用
http://blog.youkuaiyun.com/kobejayandy/article/details/44633611 1、共享内存对应应用开发的意义 对熟知UNIX系统应用开发的程序员来说,IPC(InterProcess Communication)机制是非常熟悉的,IPC基本包括共享内存、信号灯操作、消息队列、信号处理等部分,是开发应用中非常重要的必不可少的工具。其中
c++和java 内存_Java和C++共享内存 - java
我有一段创建共享内存的C++代码。是否可以编写Java代码来读取C++代码创建的内存,除非使用JNI。顺便说一句,我正在使用Windows操作系统。参考方案请参见MappedByteBuffer。这是读写共享内存的标准Java类。我经常使用。是的,您可以使用它与使用共享内存以任何语言编写的任何程序进行通信,并且这都是非常标准的Java,没有JNI。在Java中,执行“ ++++++++”表达式,编...
Java 共享内存
共享内存可以说是最有用的进程间通信方式,也是最快的IPC(Inter-Process Communication)形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。 采用共享内存通信的一个显而易见的好处是效率高,因为...
Android匿名共享内存和MemoryFile
今天要讲的内容相对冷门,日常开发中的使用率较低。但是,在某些场景下,它也许可以带给我们一个新的思路,帮我们解决一些棘手的问题,因此我觉得有必要谈一谈Android中的匿名共享内存(Ashmem)。 首先来看一下什么是匿名共享内存(Ashmem)。Ashmem是一种共享内存的机制,它利用了Linux的mmap系统调用,将不同进程中的同一段物理内存映射到进程各自的虚拟地址...
共享内存的实现linux和Java
https://blog.youkuaiyun.com/kobejayandy/article/details/44633611https://blog.youkuaiyun.com/wan_exe/article/details/56484664共享内存IPC机制的关键,对于数据共享、系统快速查询、动态配置、减少资源耗费等均有独到的优点。对应UNIX系统来说,共享内存分为一般共享内存和映像文件共享内存两种,而对应Win...
21万+



被折叠的 条评论
为什么被折叠?



