背景技术
在两个处理器或者两个设备之间通过共享内存进行通讯时,为避免同时读写,造成混乱,通常采用信号量控制等方法,使得双方对临界区的操作互斥,即任一时刻只能有一方可以读或写。
如图1所示,设备1向设备2传递数据时,通过一个共享临界区,称之为下行信息区,设备1下行信息区的写操作和设备2对下行信息区的读操作,要通过程序保证不能同时操作。
设备2向设备1传递数据时,将这个共享临界区称之为上行信息区,设备1对上行信息区的读操作和设备2对上行信息区的写操作,也是不能同时进行的。
通过共享临界区进行数据通信,如果整个临界区只作为一块来处理,任何一方进行读、写操作都需要获得许可证,冲突概率非常高,所以往往是按如图1所示,将临界区分成两块,一块用于下行数据,另一块用于另一方向的上行数据,每一块都是一方写信息,另一方读信息。作为每一块来说,采用现有技术的做法,仍不能完全避免读写冲突。
采取互斥的方法处理共享临界区间的数据传递,处理起来编程麻烦,而且效率较低。
发明内容
本发明要解决的技术问题是为提高在两个处理器或者两个设备之间通过共享内存进行通讯时的效率,降低编程的复杂度,提出一种共享临界区数据传递的方法,双方可以同时操作临界区,大大提高系统效率。
本发明的技术方案是这样的:
首先把整个共享临界区分成完全独立的两块,分别用于上行或下行的数据,其大小与上、下行数据流量成正比,若上下行数据流程差不多,可将临界区基本等分;每块临界区各拥有自己的控制结构,包括写指针和读指针,临界区为环形;
其次由通讯双方一起对这两块临界区的控制结构进行初始化;
然后双方就可以按上下行方向选择相应的临界区,重复以下过程进行通讯:
1.发送方检查临界区有无空间,若无,延迟后再发;
2.发送方将内容放入临界区;
3.发送方修改写指针,如果系统如果采取中断方式处理时,则通知对方;
4.接受方取读指针,获悉有新内容;
5.接受方取内容,修改读指针,如果系统如果采取中断方式处理时,则通知对方。
采用本发明所述方法,与现有技术相比,提高了通过共享临界区传递数据的效率,降低了编程的复杂度。
具体实施方式
下面将参照本发明的附图详细描述本发明。
图1为两个设备之间通过临界区进行通讯的示意图;如前面所述,采用现有技术的做法,仍不能完全避免读写冲突。但是,如果把每块都看成环形结构,采用本发明所述方法,就可以完全避免读写冲突,达到通信双方可同时操作的效果。本发明中,整个共享临界区分成两块,分割后的两块临界区完全独立,每块功能单一,双方的操作也得到简化,对于任何一块来说,一方只对它进行写操作,而另一方只对它进行读操作,操作可以同时进行。把两块结合到一起看,就可以达到临界区双方可以同时对临界区同时读写的效果,而不需要通过信号量控制。
图2中,(a)表示环形临界区通讯的正常情况;(b)表示环形临界区为空的情况,此时读指针=写指针;(c)表示环形临界区为满的情况,此时写指针=读指针-1;
整块临界区可以看成一个环型,缓冲区用到末尾后自动回到开头,设置一个写指针和一个读指针,写指针在前,读指针在后;
其中写指针指向当前缓冲环可写空间起始位置,读指针指向当前缓冲环中可读内容起始位置,只有当读写指针一样时,读指针指向的位置才无内容可读;
从读指针到写指针之间是已经放入到临界区的信息,接受方可以读出;从写指针环回到读指针位置之间的空间就是可以用来存放传输内容的空间;
在每块临界区内设置一个控制结构,用于记录临界区内信息的状况,以及信息的读写指针位置。
下面以从设备1到设备2下行信息的传输操作为例说明该方法的具体步骤:
第一步,由设备1或设备2初始化临界区控制结构,包括设置读指针BeginPtr和写指针EndPtr为共享临界区的首地址,双方同步后再进行通讯状态;
第二步,设备1要向临界区送内容;
1、当写指针EndPtr等于读指针BeginPtr时,缓冲区全空;
2、当写指针EndPtr小于读指针BeginPtr时,可写缓冲区长度为:(读指针BeginPtr-写指针EndPtr1-1),如图3(b);
3、当写指针EndPtr大于读指针BeginPtr时,可写缓冲区长度为:(尾地址-写指针EndPtr+1)+(读指针BeginPtr-首地址)-1,如图3(a);
第三步,设备1根据临界区大小向临界区写入内容,然后修改写指针,并通知设备2或由设备2定时扫描;
第四步设备2被激活,查询临界区;
1、当读指针BeginPtr等于写指针EndPtr时,没有可读的内容。
2、当读指针BeginPtr小于写指针EndPtr时,可读消息内容长度为:(写指针EndPtr-读指针BeginPtr),如图3(a)。
3、当读指针BeginPtr大于写指针EndPtr时,可读消息内容长度为:(尾地址-读指针BeginPtr+1)+(写指针EndPtr-首地址),如图3(b)。
第五步,读出消息内容,进行相应处理。同时将读指针BeginPtr移动至写指针EndPPtr处,并通知设备1或由设备1定时扫描以继续发送,重复步骤二~五。
本发明之所以能够实现通讯双方可以同时操作临界区,不仅仅是因为将共享临界区分成了互不相干的两块,而且对于每块来说,操作双方也是可以同时对它进行操作的;
这是因为写指针永远在读指针的前面,如果一方正在进行读取操作时,另一方向临界区添加内容,修改写指针,则可读的内容更多,不会影响原来的读操作,只是取过之后它还可以再取刚刚放入的内容;同样,如果一方正在进行写操作时,另一方读走内容,修改了读指针,只会使写空间变得更大,写操作结束后,如果还有内容,还可以立即再进行一次写操作。
图3为共享临界区数据传递方法中数据区的两种具体实例:其中,图3(a)为写指针大于读指针的情况;图3(b)为写指针小于读指针的情况,此时信息已从临界区尾部掉头。在前面图2中,我们形象说明了临界区的环形结构情况,并按信息量用(a)、(b)、(c)分别说明了一般情况、全空、全满的情况,在环形结构中,其信息是一个连续存储段,而实际情况临界区不可能首尾连在一起,对于临界区非空情形,即图2的(a)和(c),都有如图3所示的两种可能。
本发明在使用中需特别注意以下几点:
(1)读取内容后再移动读指针,否则可能导致内容尚未读走就被覆盖;
(2)写完内容后再移动写指针,否则可能导致内容尚未填好就被读走;
(3)由于临界区往往较大,以单字节表示读、写指针通常是不够的;而(这里有些不通顺)字节就可能会出现一方正在存取指针时,另一方读出的指针部分为新的,还有部分为旧的现象,所以必须保证获取的读、写指针正确;本发明采用的办法是获取指针后等待一个很短的延时,然后再获取一次,如此下去,直至连续两次获取的指针相同为止。
(4)当读指针与写指针相等时,可能有两种理解,临界区满或空,为避免二义性,本发明将临界区空出一个字节,即读指针与写指针相等时,表示缓冲区空;就是图2(b)中的情况;当写指针在读指针后面一个字节时,表示临界区满,就是图2(c)中的情况。