Java--进程间通讯的四种方式

转载 2015年07月06日 22:57:31
所谓进程通信,就是不同进程之间进行一些"接触",这种接触有简单,也有复杂。机制不同,复杂度也不一样。通信是一个广义上的意义,不仅仅指传递一些massege。
 
  他们的使用方法是基本相同的,所以只要掌握了一种的使用方法,然后记住其他的使用方法就可以了。
 
  1. 信号
  在我学习的内容中,主要接触了信号来实现同步的机制,据说信号也可以用来做其它的事情,但是我还不知道做什么。
 
  信号和信号量是不同的,他们虽然都可用来实现同步和互斥,但前者是使用信号处理器来进行的,后者是使用P,V操作来实现的。
 
  使用信号要先知道有哪些信号,在Linux下有31个需要记住的通用信号,据说也是systemV中最常用的那些。这里略。
 
  1. 1信号相关函数:
  #include
  int sigaction(int signo, const struct sigaction *act, struct sigaction
  *oact);
  该函数用来为进程安装信号处理器,struct sigaction数据是用来保存信号处理器的相关信息。
 
  #include
  int sigemptyset(sigset_t *set);
  将信号集合清空。
  int sigfillset(sigset_t *set);
  将信号集合设置成包含所有的信号。在对信号进行操作以前一定要对信号集进行初始化。
 
  int sigaddset(sigset_t *set, int signo);
  向信号集中加入signo对应的新信号。
  int sigdelset(sigset_t *set, int signo);
  从信号集中删除signo对应的一个信号。
  int sigismember(const sigset_t *set, int signo);
  判断某个信号是否在信号集中。返回1则在,0则不在。
 
  #include
  int sigprocmask(int how,const sigset_t *set, sigset_t *oset);用来设置进程的信号屏蔽码。信号屏蔽码可以用来在某段时间内阻塞一些信号集中的信号,如果信号不在信号集中,就不必讨论它,因为肯定不响应,是否能生成也不肯定,我没有做过试验。
 
  1.2我所理解的使用信号机制的方法:
  使用信号,主要做的事情就是信号处理器的工作,这里面是你想做的事情。就像中断处理函数一样。
 
  在使用信号以前,首先要初始化信号集,只有在信号集里面的信号才会被考虑。
 
  有两种方法可以初始化信号集,一种是设置空信号集,一种是将所有的信号都加到信号集中。如果你自己想要的信号集不是这两种,可以在初始化了以后通过添加和删除信号进行定制。
 
  如果在进程执行的一段时间内不想对某些信号进行响应,则可以使用sigprocmask对当前的信号集中的一些信号进行阻塞,稍后再执行。
用于进程间通讯(IPC)的四种不同技术: 
1. 消息传递(管道,FIFO,posix和system v消息队列) 
2. 同步(互斥锁,条件变量,读写锁,文件和记录锁,Posix和System V信号灯) 
3. 共享内存区(匿名共享内存区,有名Posix共享内存区,有名System V共享内存区) 
4. 过程调用(Solaris门,Sun RPC) 
消息队列和过程调用往往单独使用,也就是说它们通常提供了自己的同步机制.相反,共享内存区通常需要由应用程序提供的某种同步形式才能 正常工作.解决某个特定问题应使用哪种IPC不存在简单的判定,应该逐渐熟悉各种IPC形式提供的机制,然后根据特定应用的要求比较它们的特性. 

必 须考虑的四个前提: 
1. 联网的还是非联网的.IPC适用于单台主机上的进程或线程间的.如果应用程序有可能分布到多台主机上,那就要考虑使用套接字代替IPC,从而简化以后向联 网的应用程序转移的工作. 
2. 可移植性. 
3. 性能,在具体的开发环境下运行测试程序,比较几种IPC的性能差异. 
4. 实时调度.如果需要这一特性,而且所用的系统也支持posix实时调度选项,那就考虑使用Posix的消息传递和同步函数. 

各种 IPC之间的一些主要差异: 
1. 管道和FIFO是字节流,没有消息边界.Posix消息和System V消息则有从发送者向接受者维护的记录边界(eg:TCP是没有记录边界的字节流,UDP则提供具有记录边界的消息). 
2. 当有一个消息放置到一个空队列中时,Posix消息队列可向一个进程发送一个信号,或者启动一个新的线程.System V则不提供类似的通知形式. 
3. 管道和FIFO的数据字节是先进先出的.Posix消息和System V消息具有由发送者赋予的优先级.从一个Posix消息队列读出时,首先返回的总是优先级最高的消息.从一个System V消息队列读出时,读出者可以要求想要的任意优先级的消息. 
4. 在众多的消息传递技术—管道,FIFO,Posix消息队列和System V消息队列—中,可从一个信号处理程序中调用的函数只有read和write(适用于管道和FIFO). 

比较不同形式的消息传递时,我 们感兴趣的有两种测量尺度: 
1. 带宽(bandwidth):数据通过IPC通道转移的速度.为测量该值,我们从一个进程向另一个进程发送大量数据(几百万字节).我们还给不同大小的 I/O操作(例如管道和FIFO的write和read操作)测量该值,期待发现带宽随每个I/O操作的数据量的增长而增长的规律. 
2. 延迟(latency):一个小的IPC消息从一个进程到令一个进程再返回来所花的时间.我们测量的是只有一个1个字节的消息从一个进程到令一个进程再回 来的时间(往返时间) 

在现实世界中,带宽告诉我们大块数据通过一个IPC通道发送出去需花多长时间,然而IPC也用于传递小的控制信 息,系统处理这些小消息所需的时间就由延迟提供.这两个数都很重要.

java 进程间通讯的有几种方法?

进程间通信的方法主要有以下几种:   (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。   (2)命名管道(named pipe):...
  • Truong
  • Truong
  • 2014年09月12日 12:44
  • 19197

Java--进程间通讯的四种方式

所谓进程通信,就是不同进程之间进行一些"接触",这种接触有简单,也有复杂。机制不同,复杂度也不一样。通信是一个广义上的意义,不仅仅指传递一些massege。     他们的使用方法是基本相同的,...
  • zlQQhs
  • zlQQhs
  • 2013年02月28日 23:15
  • 25582

JAVA线程与线程、进程与进程间通信

I.线程与线程间通信 一、多线程间通信方式: 1、共享变量 2、wait/notify机制 3、Lock/Condition机制 二、共享变量 线程间发送信号的一个简单方式是在共享对象的变量里设置信...
  • ls5718
  • ls5718
  • 2016年07月11日 10:54
  • 9372

Java—进程间通讯的有几种方法

进程间通信的方法主要有以下几种:   (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。   (2)命名管道(named pipe):...

Java NIO 进程间通信

传统的进程间通信的方式有大致如下几种: (1)   管道(PIPE)  (2)   命名管道(FIFO)  (3)   信号量(Semphore)  (4)   消息队列(MessageQue...
  • lingzhm
  • lingzhm
  • 2015年04月13日 15:14
  • 1022

java进程间通信方式

http://bbs.csdn.net/topics/40407223 看到楼主提到进程间通信,又想起了以前使用C编程的时光。 :) 先看看传统的进程间通信的手段有什么,上面的各位都说了不...

Java通过管道进行进程间通信

Java语言中提供了各种各样的输入输出流Stream,使我们能够很方便地对数据进行操作,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间之间传送数据。一个线程发送数据到输出管道,另一...

java如何实现进程间的通信?

先看看传统的进程间通信的手段: (1) 管道(PIPE) (2) 命名管道(FIFO) (3) 信号灯(Semphore) (4) 消息队列(MessageQueue) (5) 共享内存(S...

Java使用管道实现进程间通讯

Java使用管道Pipe实现进程间通讯。
  • jmppok
  • jmppok
  • 2013年12月23日 13:55
  • 13301

java中进程间几种通信方式

进程间通信IPC------Inter-Process Communication  由于内存管理的一些机制,导致两个进程间并不能直接的进行通信(在独立的用户空间),因此我们需要利用一些介质来完成两...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java--进程间通讯的四种方式
举报原因:
原因补充:

(最多只允许输入30个字)