关闭

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

标签: java进程通信
820人阅读 评论(0) 收藏 举报
分类:
所谓进程通信,就是不同进程之间进行一些"接触",这种接触有简单,也有复杂。机制不同,复杂度也不一样。通信是一个广义上的意义,不仅仅指传递一些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也用于传递小的控制信 息,系统处理这些小消息所需的时间就由延迟提供.这两个数都很重要.
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:13682次
    • 积分:240
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:29篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档