进程间的通讯无非就是读写文件,socket通讯或者使用共享内存。
你不想用读写文件的方式,那就用共享内存或者socket通讯的方式。我个人觉得用socket比较简单,也许是因为我对socket比较熟悉。
下面是一篇java实现共享内存的文章,java没法管理内存,其实他也是靠创建映像文件来实现的。
共享内存在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 {...// 可以执行写操作}该锁会在应用异常退出后自动释放,这正是该处所需要的方法。
本文转载自:http://hi.baidu.com/dongbeiman/blog/item/bf19efbf9984ae1819d81f3d.html
分享到:
相关推荐
java多进程并发 读文件 测试代码,适合初学并发控制 的同学
在IT领域,多进程并发是操作系统中的核心概念,它指的是在同一时间有多个程序或进程在运行。这种技术被广泛应用于各种...通过这个项目,开发者可以深入理解多线程、并发控制、GUI编程以及性能优化等多个关键IT技能。
TCP多进程并发是实现高性能服务器的一种常见技术,它利用操作系统的多进程特性来同时处理多个客户端连接请求,以提高系统的服务能力。 在传统的单进程模型中,一个进程只能处理一个连接,当有新的连接请求时,必须...
【Linux的多进程并发控制设计与实现】 在Linux操作系统中,多进程并发控制是系统设计中的关键要素,尤其是在处理大规模并发请求的场景下,如证券交易系统。本课题以证券交易系统为背景,探讨如何在Linux环境下设计...
仿真设计进程 PCB、PCB表的数据结构 :1.1仿真进程并发的调度环境,设计和实现 PCB 控制块、进程创建、进程切 换、进程并发、进程阻塞和进程调度的算法 1.2 掌握进程调度的优先权法、时间片轮转法和多级反馈队列...
(一)多进程并发执行是使用后台任务来实现任务的“多进程化”。在不加控制的模式下,不管有多少任务,全部都后台执行。也就是说,在这种情况下,有多少任务就有多少“进程”在同时执行。 (二)实验中要用到的函数 ...
Java多进程编程中的并发控制主要关注的是如何在多个独立的程序之间有效地共享资源,特别是内存。在Java中,虽然直接的内存管理不是语言的核心特性,但是通过特定的API,我们仍然可以实现进程间的内存共享。这里我们...
本示例将探讨如何在Linux环境下利用多进程并发技术实现一个聊天服务器。这个话题涵盖了Linux操作系统、多进程编程以及Socket套接字通信等多个核心知识点。 首先,我们要了解Linux操作系统。Linux是一种开源、免费的...
本项目聚焦于使用Java的Socket进行多线程并发控制,并结合Hibernate ORM框架与MySQL数据库进行数据存储。下面将详细阐述这些技术及其应用。 首先,Java Socket是Java提供的用于实现网络上不同计算机间进程通信的...
### Java多线程并发知识点详解 #### 一、Java多线程并发简介 在现代软件开发中,特别是在Java这样的主流编程语言中,多线程并发技术是提高程序执行效率、优化资源利用的关键手段之一。本篇文章将深入探讨Java中的...
Java实现进程并发模拟,属于操作系统实验类
3. **并发控制**:Java提供了多种并发控制工具,包括synchronized、wait()、notify()、notifyAll()、ReentrantLock(可重入锁)、Semaphore(信号量)和CountDownLatch(倒计时器)等。这些工具用于协调不同线程的...
本主题将深入探讨Python3中四种不同的并发模型:同步依序下载、多进程(multiprocessing)、多线程(multithreading)以及asyncio异步编程,并通过理论分析和实际案例对比它们之间的效率差异。 1. 同步依序下载: ...
linux网络编程-多进程并发
3. **并发控制**:讲解Java中的同步机制,如`synchronized`关键字、`volatile`变量、`java.util.concurrent`包中的`Lock`接口及其实现(如`ReentrantLock`),以及原子变量类(`AtomicInteger`, `AtomicLong`等)。...
操作系统实验一的主题是多进程并发执行,这涉及到操作系统的核心概念和功能。实验目的是为了让学生深入理解和实践以下几个关键知识点: 1. 进程控制:通过`fork()`函数,学生可以创建新的进程,理解进程的创建过程...
在Java中,多进程编程是实现并发执行任务的一种方式,不同于多线程,它涉及到创建独立的进程,每个进程都有自己独立的内存空间和系统资源。本文将深入探讨Java中如何实现多进程编程。 首先,Java提供了两种方法来...
本文将详细探讨标题所提及的“多进程写SQLite互斥解决方案代码”,以及它如何处理多线程环境下的类似问题。 SQLite是一个轻量级、嵌入式的关系型数据库,广泛应用于各种桌面应用、移动应用甚至服务器端。然而,当多...
在Linux操作系统中,进程是程序执行的实例,是操作系统资源分配的基本单位。...然而,过多的进程并发可能导致系统资源过度消耗,因此在设计程序时,需要合理控制进程的数量,并考虑使用线程等其他并发模型以优化性能。
《Java并发进程开发手册》是一本关于Java多线程编程的专业书籍,由Doug Lea编写,Addison Wesley出版社于1999年10月出版。本书针对Java 2平台进行了全面更新,并涵盖了新的并发编程技术和模式。作为一本面向中级到...