进程间通信都会涉及同步问题,所以在实际上是出现了用进程间通信来解决进程间通信的问题,出现了循环引用。不过不要紧,进程间通信还有一个粒度的问题,同步问题大多收拾采用系统能处理的最小单位的空间来实现,一般都是一个字节,或者一个机器字长的空间,以保证单条机器指令可以完成操作。换个说法就是用小内存来控制大内存。
进程间通信最主要的一个方式就是保证同一时间内,只有一个进程能访问公共变量。简称为互斥访问。
其中消息、邮箱、管道的运行机制是相同的,都属于生产者-消费者的问题,只是在处理的数据量方面有区别,消息一般处理微小数据量的通信,例如几个字节;而邮箱则用于处理数据量较大的通信,例如几十个字节,还可以附带格式,而管道则是处理大数据量的通信,所以管道是不限制数据量的。
下面以消息为例说明进程间通信运行机制,并给出Lenix的实现。
通常的概念中,消息是直接传递给目标的,比如写个便签,简单的几句话,或者画个符号。从结构上来说,接受着首先要有一个地方可以提供给发送者,用以存放消息,比如一个篮子、或者口袋,稍大一点就变成邮箱了。
然后就是,消息一般只能是接受着才能看,但是任何人都可以向他发送消息,只要知道方消息的地方。
还有一点就是,在篮子或者口袋空的时候,接受者是取不到数据的,必须等待。而篮子或者口袋满的时候,发送者也不能发送消息,要么等待到篮子有空位,要么就直接把消息给扔了。
在具体的实现过程中,IPC都是采用了一个全局缓冲区,发送者向缓冲区写数据,接受者从缓冲区读数据。
Lenix消息机制。
要使用消息机制,首先要创建消息对象,Lenix对消息的使用做了一定的限制,只有创建者能接受消息。
要向接受者发送数据,首先要获得消息对象,Lenix提供了按消息对象名称查找的机制。
Lenix提供了两种消息发送机制,一种是传递,特点是必须发送成功,也就是如果消息缓冲区满的时候,发送者要等待到缓冲区可用,然后将消息发送成功后才返回。一种是投递,这种方式不一定确保成功,因为在缓冲区满的时候,并不等待,直接将消息丢弃,立即返回。
本文介绍了进程间通信(IPC)的基本概念及其重要性。探讨了不同IPC机制如消息、邮箱、管道、共享内存和共享文件的特点及适用场景。重点分析了消息机制的工作原理,并通过Lenix系统的实现案例解释了如何创建和使用消息对象。
226

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



