Java--进程间通讯的四种⽅式
所谓进程通信,就是不同进程之间进⾏⼀些"接触",这种接触有简单,也有复杂。机制不同,复杂度也不⼀样。通信是⼀个⼴义上的意义,不仅仅指传递⼀些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也⽤于传递⼩的控制信息,系统处理这些⼩消息所需的时间就由延迟提供.这两个数都很重要.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。