CN1273910C - 总线式进程间通信方法 - Google Patents
总线式进程间通信方法 Download PDFInfo
- Publication number
- CN1273910C CN1273910C CN 02145481 CN02145481A CN1273910C CN 1273910 C CN1273910 C CN 1273910C CN 02145481 CN02145481 CN 02145481 CN 02145481 A CN02145481 A CN 02145481A CN 1273910 C CN1273910 C CN 1273910C
- Authority
- CN
- China
- Prior art keywords
- text
- memory
- memory slot
- slot group
- signal lamp
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
一种总线式进程间通信方法,应用于具有Unix或Linux操作系统环境的平台中。其结合共享内存技术和信号灯集合技术,在内存中开辟一共享内存区域,该区域划分为若干内存槽,一内存槽作为状态标志字组存放区,其余作为进程通信的数据存放区;内存槽分为若干组,每组具有各自不同的访问索引号;创建一个信号灯集合,其内包含的信号灯数量与内存槽组数量相等;设置状态标志字初始值、信号灯初始值和内存槽初始值。采用本发明的总线式进程间通信方法,其使用结果表明该软件包使用非常简洁、性能十分稳定、数据交换速率极快,完全满足大型数据处理应用系统的快速数据交换要求。
Description
技术领域
本发明涉及一种总线式进程间通信方法,特别涉及Unix或Linux下总线式进程间快速通信方法。
背景技术
“进程通信”是大、中型计算机应用系统中必不可少的一个功能,通过进程通信可以实现两个相互独立的应用程序(或者说任务TASK)之间的数据交换。
在早期的过程控制级计算机中,进程间的数据交换普遍采用磁盘队列文件、甚至简单的磁盘数据文件(为叙述方便,以下将这两种文件统称为“磁盘文件”)的方式来实现进程间数据交换。应该说,磁盘文件是实现进程间通信的一种可取方式,但这种技术是特定时期的产物。随着计算机运行速度的不断加快,进程间对数据交换速率的要求不断提高,以磁盘文件为媒介的进程间数据交换方式的局限性已经凸显出来:
(1)磁盘文件数据交换方式只适用于数据交换速率不太高的场合,因为对磁盘的I/O无法跟上CPU的速率。
(2)因为系统资源有限,因此在采用磁盘文件、并且数据交换速率较快的情况下,无法避免文件锁管理的问题;但是对文件锁的管理比较复杂,结果往往是降低数据交换速率指标而绕过文件锁。
(3)因为磁盘文件处理速度无法太快,即使是计算机硬件设备的性能大幅度提高,但无法从根本上改变磁盘I/O速率远远落后于CPU速率的现实,因而磁盘文件方式的进程间数据交换往往成为整个应用系统数据交换速率整体提高的瓶颈。如果希望从根本上解决这一问题,应该应用新的计算机技术,寻求新的解决途径。
目前在国内外的许多应用软件中,已经普遍采用内存技术(包括共享内存ShareMemory、内存队列MemoryQueue、信号灯Semaphore等等)而不是磁盘文件技术来实现快速数据交换,但是还没有出现针对进程间快速数据交换而开发的具有广泛通用性且易于使用的Package(软件包),而事实上在冶金、能源、制造等等领域的大、中型应用系统中,都对进程间快速数据交换功能有广泛的需求。
发明内容
本发明的目的在于:提供一种总线式进程间通信方法,以克服以磁盘文件为媒介的进程间数据交换方式对整个应用系统数据交换速率整体提高所产生的瓶颈效应,满足大、中型应用系统对进程间快速数据交换的需求,为末端用户提供一个高性能、易使用的进程间快速数据交换平台。
本发明的技术方案如下:
一种总线式进程间通信方法,应用于具有Unix或Linux操作系统环境的平台中,结合共享内存技术和信号灯集合技术;包括如下通信步骤:A.进程通信初始化:A1.在内存中开辟一共享内存区域,该区域划分为若干内存槽,一内存槽作为状态标志字,其余作为进程通信的数据存放区;A2.内存槽分为若干组,每组具有各自不同的访问索引号;A3.创建一个信号灯集合,其内包含的信号灯数量与内存槽组数量相等;A4.设置状态标志字初始值、信号灯初始值和内存槽初始值;B.电文的发送与接收:B1.发送电文,即判断目的进程的内存槽组是否可以接收电文,如果禁止接收则以错误代码返回;如果可以接收,则将电文写入目的进程的内存槽组;B2.接收电文,即判断本进程的信号灯值是否表示需要接收电文,如果无需接收则立即返回或等待;如果需要接收,则读取电文;C.结束进程通信,即设定该进程对应的内存槽组的状态标志字值及其对应的信号灯值,禁止其它进程发送数据到此内存槽组中。
所述状态标志字表示四个信息:当前内存槽组状态、当前内存槽组内的可读电文数、当前读电文的相对槽号以及当前写电文的相对槽号。状态标志字为四维向量,每一向量为4个字节的整型数,各对应一个信息。
采用本发明的总线式进程间通信方法,其使用结果表明该软件包使用非常简洁、性能十分稳定、数据交换速率极快,完全满足大型数据处理应用系统的快速数据交换要求。
附图说明
图1是整个进程通信内存块的构成图;
图2是使用进程通信软件包的一般步骤;
图3是进程通信初始化流程图;
图4是进程通信接收电文流程图;
图5是进程通信发送电文流程图;
图6是关闭进程通信流程图。
图中符号说明
101内存槽组状态字首地址ptrStatus
102内存槽组首地址ptrSlot
103a#进程通信内存槽组
104b#进程通信内存槽组
105z#进程通信内存槽组
106a#状态标志字
107b#状态标志字
108z#状态标志字
109保留区域
步骤201程序开始
步骤202调用进程通信初始化(PSinit)
步骤203调用接收进程通信电文或/和向其他进程发送电文PSRecvMsg或/和PSSendMsg
步骤204调用进程通信结束(PSClose)
步骤205程序结束
步骤301PSinit开始
步骤302检查进程通信内存块是否已经存在
步骤303已经存在吗?
步骤304初始化本进程所对应的内存槽组所在的内存区域:状态字设定为{0,0,0,0},内存槽设定为空值
步骤305检查进程通信使用的信号灯集合是否已经存在
步骤306已经存在吗?
步骤307初始化本进程所对应的内存槽组所对应的信号灯值为0
步骤308进程通信初始化成功
步骤309创建1024×(26×8+1)即209K字节的内存区
步骤310创建成功吗?
步骤311初始化刚刚创建的内存区:26个状态字设定为{-1,0,0,0},208个内存槽设定为空值
步骤312创建包含26个信号灯的信号灯集合
步骤313创建成功吗?
步骤314初始化刚刚创建的信号灯集合:将26个信号灯都设定为0
步骤315进程通信初始化失败
步骤316PSinit结束
步骤401PSRecvMsg开始
步骤402检查本进程对应的内存槽组所对应的信号灯值是否大于0
步骤403大于0吗?
步骤404读取状态标志字,得到当前读电文的相对槽号
步骤405读取该内存槽内的电文
步骤406当前读电文的相对槽号加1并对8取模数
步骤407当前内存槽组内的电文数减1
步骤408当前内存槽组对应的信号灯值减1
步骤409接收其他进程发送来的电文成功
步骤410是否等待电文到来?
步骤411接收其他进程发送来的电文失败
步骤412PSRecvMsg结束
步骤501PSSendMsg开始
步骤502读取目标进程内存槽组的状态标志字,检查目标进程对应的内存槽组是否可用
步骤503可用吗?
步骤504根据读取的目标进程内存槽组的状态标志字,得到目标进程内存槽组内的电文数
步骤505电文数小于8吗?
步骤506将电文写入目标进程的内存槽组的当前写入槽号位置
步骤507目标进程的内存槽组写电文的相对槽号加1并对8取模数
步508目标进程的内存槽组内的电文数加1
步骤509目标进程的内存槽组对应的信号灯的信号灯值加1
步骤510发送电文到其他进程成功
步骤511发送电文到其他进程失败
步骤512PSSendMsg结束
步骤601PSClose开始
步骤602将本进程对应的内存槽组的状态字中nBlockAvailable设定为-1,禁止其他进程发送数据到此内存槽组内
步骤603将本进程对应的内存槽组的当前读电文相对槽号设定为0,写电文相对槽号也设定为0
步骤604将本进程对应的内存槽组内的电文数设定为0
步骤605将本进程对应的内存槽组所对应的信号灯值设定为0
步骤606PSClose结束
具体实施方式
现运用以下具体实施例并结合图1至图6,对本发明的总线式进程间通信方法进行详细说明,以了解其特点和功效。
为了实现进程间快速数据交换,综合采用共享内存技术和信号灯集合技术。共享内存提供了数据快速存取的“场所”,而信号灯集合充当数据到达的“信号灯”。如图1所示,为整个进程通信内存块的构成图,在内存中开辟一个大小为1024×(8×26+1)=209K字节的区域;此内存区域划分为8×26+1=209个大小为1K的内存槽;标号为0#-208#,其中0#内存槽作为状态字专用(101),而1#-208#内存槽则作为进程通信的数据存放区,每8个分为1组,第一个内存槽的地址为内存槽组首地址(102),共26个内存槽组,用‘a’-‘z’这26个字母来作为这26个内存槽组(103,104,105)的访问索引号;第0#槽共1024个字节,前16×26=416个字节又划分为26个小块,每块16个字节,这26个16字节的小内存块充当‘a’-‘z’号内存槽组的状态标志字(106,107,108),余下的608个字节作为保留区域(109);创建一个信号灯集合,此集合包含26个信号灯,每个信号灯的取值为0-8;这26个信号灯分别对应a#-z#内存槽组,用来描述该内存槽组内需要读出的电文个数;当任意需要进行进程通信的进程开始执行时,首先检测是否已经存在进程通信内存区。如果不存在,则执行创建通信内存区的操作,即申请(26×8+1)×1024=214016bytes=209Kbytes的共享内存,并将通信内存区全部置为空;将所有状态标志字设为{-1;0;0;0};创建信号灯集合,将26个信号灯全部设为0;如果进程通信内存区已经存在,则跳过创建进程通信内存区的操作,直接执行下一步操作:进程首先进行其自身的通信内存槽组初始化,即将自身内存区域全部初始化为空值;并将状态标志字初始化为:
{0;/*表示:“内存槽组”可用*/
0;/*表示:当前“内存槽组”内无电文*/
0;/*表示:当前读电文的相对槽号为0*/
0;/*表示:当前写电文的相对槽号为0*/}
将自身对应的信号灯设定为0;
内存槽组状态标志字(szMsgBlockSatus)的构成如下:
名称 | 类型 | 字节长度 | 含义 |
nBlockAvailable | 整型 | 4 | 当前内存槽组状态;取值:0(可用),-1(禁用) |
nMsgCount | 整型 | 4 | 当前内存槽组内的可读电文数,取值:0-8 |
nReadPtr | 整型 | 4 | 当前读电文的相对槽号,取值:0-7 |
nWritePrt | 整型 | 4 | 当前写电文的相对槽号,取值:0-7 |
如图2所示,为使用总线式进程间通信软件包的一般步骤,包括:程序开始(步骤201);调用进程通信初始化(PSinit)(步骤202);调用接收进程通信电文或/和向其他进程发送电文PSRecvMsg或/和PSSendMsg(步骤203);调用进程通信结束(PSClose)(步骤204);程序结束(步骤205)。
如图3所示,进程通信初始化流程包括如下步骤:PSinit开始(步骤301);检查进程通信内存块是否已经存在(步骤302);已经存在吗?(步骤303)如果存在则直接进入步骤304;如果不存在,则创建1024×(26×8+1)即209K字节的内存区(步骤309);创建成功吗?(步骤310)不成功则跳至步骤315;成功则初始化刚刚创建的内存区,26个状态字设定为{-1,0,0,0},208个内存槽设定为空值(步骤311),然后进入步骤304;初始化本进程所对应的内存槽组所在的内存区域,状态字设定为{0,0,0,0},内存槽设定为空值(步骤304);检查进程通信使用的信号灯集合是否已经存在(步骤305);已经存在吗?(步骤306)如果存在则初始化本进程所对应的内存槽组所对应的信号灯值为0(步骤307),进程通信初始化成功(步骤308),然后PSinit结束(步骤316);如果不存在则创建包含26个信号灯的信号灯集合(步骤312),创建成功吗?(步骤313)不成功则进入步骤315,成功则初始化刚刚创建的信号灯集合,将26个信号灯全部设定为0(步骤314),再进入步骤308。
如图4所示,是进程通信接收电文流程,包括如下步骤:PSRecvMsg开始(步骤401);检查本进程对应的内存槽组所对应的信号灯值是否大于0(步骤402);大于0吗?(步骤403),不是则判断是否等待电文到来(步骤410),等待则回到步骤402,不等待则接收其他进程发送来的电文失败(步骤411),然后进入步骤412;如果大于0,则读取状态标志字,得到当前读电文的相对槽号(步骤404),读取该内存槽内的电文(步骤405),出错则跳至步骤411,否则当前读电文的相对槽号加1并对8取模数(步骤406),当前内存槽组内的电文数减1(步骤407),当前内存槽组对应的信号灯值减1(步骤408),如果出错则跳至步骤411,否则接收其他进程发送来的电文成功(步骤409),然后PSRecvMsg结束(步骤412)。
如图5所示,是进程通信发送电文流程,包括如下步骤:PSSendMsg开始(步骤501);先读取目标进程内存槽组的状态标志字,检查目标进程对应的内存槽组是否可用(步骤502);可用吗?(步骤503),不可用则发送电文到其他进程失败(步骤511),然后进入步骤512;可用则根据读取的目标进程内存槽组的状态标志字,得到目标进程内存槽组内的电文数(步骤504),电文数小于8吗(步骤505),不是则进入步骤511,是则将电文写入目标进程的内存槽组的当前写入槽号位置(步骤506),如果出错则进入步骤511,否则目标进程的内存槽组写电文的相对槽号加1并对8取模数(步骤507),出错则进入步骤511,否则目标进程的内存槽组内的电文数加1(步骤508),目标进程的内存槽组对应的信号灯的信号灯值加1(步骤509),出错则进入步骤511,否则发送电文到其他进程成功(步骤510),然后PSSendMsg结束(步骤512)。
如图6所示,是关闭进程通信流程,包括如下步骤:PSClose开始(步骤601);将本进程对应的内存槽组的状态字中nBlockAvailable设定为-1,禁止其他进程发送数据到此内存槽组内(步骤602);将本进程对应的内存槽组的当前读电文相对槽号设定为0,写电文相对槽号也设定为0(步骤603);将本进程对应的内存槽组内的电文数设定为0(步骤604);将本进程对应的内存槽组所对应的信号灯值设定为0(步骤605);PSClose结束(步骤606)。
本软件包在用户的计算机上正常安装后,会在/usr/lib下形成一个静态函数库:libpsc.a。要有效地发挥本软件的性能,应该具备以下条件:
(1)用户的计算机使用Unix操作系统,但对Unix的种类没有要求;
(2)用户的计算机的内存应该在32M以上,并且内存越多效果越好;
(3)用户在调用本软件包时应该使用C/C++语言。
(4)编译用户程序时,在编译指令或makefile文件中指定调用本软件包的函数库libpsc.a。
其优异的性能体现在:
(1)适用于多种Unix操作系统,例如SCO OpenServer、UnixWare、UnixTru64。即使是其他种类的Unix,也只要简单修改源代码、重新生成软件包即可。
(2)实现了进程间在毫秒级(相当于1/1000秒)内快速交换数据信息的目标,支持极快速率的进程间数据交换,电文(每条电文长度<=1024bytes)传输速率可达到500条/秒;而同样条件下使用磁盘文件处理的传输速度约为20条/秒。
(3)支持最多26个任务(如果有必要,完全可以根据用户需求扩充到26个以上)同时交叉发送数据,即相当于在内存中存在325条进程间数据通道,可以满足当前绝大部分应用系统的数据交换要求。
(4)调用接口十分简洁,并且多种Unix下调用接口完全一致。
(5)用户使用接口的步骤非常简单,只要依次采用以下几个步骤:PSinit→PSRecvMsg和(或)PSSendMsg→PSClose。
(6)作为配套,提供了用户后备维护进程通信的工具,在通信出现异常时,用户可直接对内存关键数据进行恢复操作。
(7)在很多大型企业的服务器计算机中,普遍采用了“UNIX+ORACLE+HMI软件”的数据管理模式,本软件包可以与数据库系统构成“数据库+前端开发工具+进程通信软件包”的应用开发模式,有非常广阔的应用空间。
Claims (8)
1.一种总线式进程间通信方法,应用于具有Unix或Linux操作系统环境的平台中,结合共享内存技术和信号灯集合技术;包括如下通信步骤:
A.进程通信初始化:
A1.在内存中开辟一共享内存区域,该区域划分为若干内存槽,一内存槽作为状态标志字存放区,其余作为进程通信的数据存放区;
A2.将内存槽分为若干组,每组具有各自不同的访问索引号;
A3.创建一个信号灯集合,其内包含的信号灯数量与内存槽组数量相等;
A4.设置状态标志字初始值、信号灯初始值和内存槽初始值;
B.电文的发送与接收:
B1.发送电文,即判断目的进程的内存槽组是否可以接收电文,如果禁止接收则以错误代码返回;如果可以接收,则将电文写入目的进程的内存槽组;
B2.接收电文,即判断本进程的信号灯值是否表示需要接收电文,如果无需接收则立即返回或等待;如果需要接收,则读取电文;
C.结束进程通信,即设定该进程对应的内存槽组的状态标志字值及其对应的信号灯值,禁止其它进程发送数据到此内存槽中。
2.如权利要求1所述的总线式进程间通信方法,其特征在于,所述状态标志字表示四个信息:当前内存槽组状态、当前内存槽组内的可读电文数、当前读电文的相对槽号以及当前写电文的相对槽号。
3.如权利要求2所述的总线式进程间通信方法,其特征在于,所述状态标志字为四维向量,每一向量为4个字节的整型数,各对应一个信息。
4.如权利要求1所述的总线式进程间通信方法,其特征在于,步骤A4中所述状态标志字初始值表示内存槽组可用、当前内存槽组内无电文、当前读电文的相对槽号数以及当前写电文的相对槽号数。
5.如权利要求1所述的总线式进程间通信方法,其特征在于,步骤B1所述的发送电文和步骤B2所述的接收电文可以同时进行或者单一进行。
6.如权利要求5所述的总线式进程间通信方法,其特征在于,所述发送电文的具体步骤如下:
B1-1读出目标进程的状态标志字,判断目标进程的“内存槽组”是否可用,如果不可用,则以错误代码返回;如果可用,进入步骤B1-2;
B1-2判断目标进程内存槽组内的当前电文数是否满,如果满,则以错误代码返回;如果未满,则进入步骤B1-3;
B1-3将电文写到目标进程内存槽组中由当前写电文的相对槽号标志的槽号内,并且将当前写电文的相对槽号设定为下一个槽号,同时当前内存槽组内电文数加1,并且将目标进程内存槽组所对应的信号灯值加1。
7.如权利要求5所述的总线式进程间通信方法,其特征在于,所述接收电文的具体步骤如下:
B2-1检查本进程对应的信号灯值是否表明有电文需要接收,不需接收则返回或者等待信号灯值变化到表示有电文到达,然后进入步骤
B2-2;需要接收则直接进入步骤B2-2;
B2-2读出当前进程的状态标志字,判断当前进程的内存槽组内有多少条电文,当前内存槽组内读电文的相对槽号是多少;
B2-3根据上述数据读出第一条需要读取的电文,然后将读电文的相对槽号设定为下一个槽号,将当前内存槽组内电文数减1,将当前进程内存槽组所对应的信号灯值减1。
8.如权利要求1所述的总线式进程间通信方法,其特征在于,步骤A1中所述作为状态标志字的内存槽为第一内存槽。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 02145481 CN1273910C (zh) | 2002-11-19 | 2002-11-19 | 总线式进程间通信方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 02145481 CN1273910C (zh) | 2002-11-19 | 2002-11-19 | 总线式进程间通信方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1501277A CN1501277A (zh) | 2004-06-02 |
CN1273910C true CN1273910C (zh) | 2006-09-06 |
Family
ID=34232466
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 02145481 Expired - Fee Related CN1273910C (zh) | 2002-11-19 | 2002-11-19 | 总线式进程间通信方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN1273910C (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100471180C (zh) | 2006-02-09 | 2009-03-18 | 华为技术有限公司 | 一种消息传递的方法、装置和系统 |
CN100403739C (zh) * | 2006-02-14 | 2008-07-16 | 华为技术有限公司 | 基于链表的进程间消息传递方法 |
CN103731328B (zh) * | 2014-01-02 | 2016-09-07 | 烽火通信科技股份有限公司 | 基于Linux共享内存实现家庭网关数据通信的系统及方法 |
CN108304269A (zh) * | 2017-01-13 | 2018-07-20 | 阿里巴巴集团控股有限公司 | 一种数据的发送、接收方法、装置及通信框架 |
CN109298953B (zh) * | 2018-08-29 | 2021-12-10 | 北京机电工程研究所 | 一种共享内存数据读写的装置和方法 |
-
2002
- 2002-11-19 CN CN 02145481 patent/CN1273910C/zh not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
CN1501277A (zh) | 2004-06-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1270239C (zh) | 处理系统或计算机系统的任务控制方法 | |
CN1134730C (zh) | 用于减少预装类的脚印的系统和方法 | |
CN1099078C (zh) | 在多处理器系统中的处理器之间传送消息的方法与装置 | |
EP1730638B1 (en) | Facilitating allocation of resources in a heterogeneous computing environment | |
CN105453044B (zh) | 用于分布式处理任务部分指配的技术 | |
CN1096642C (zh) | 高效利用空间的对象加锁的系统和方法 | |
CN1154928C (zh) | 用于多任务设施信息处理系统的资源管理方法和设备 | |
CN100339830C (zh) | 一种更新软件的方法 | |
CN1232213A (zh) | 动态去最佳化编译启动的方法和装置 | |
CN1577287A (zh) | 与物理存储表示无关地同步逻辑视图 | |
WO2019090993A1 (zh) | 监控系统的部署方法、装置、计算机设备及存储介质 | |
CN1728688A (zh) | 交换节点堆叠中的交换节点的远程控制 | |
CN1818868A (zh) | 嵌入式操作系统多任务并行启动优化实现方法 | |
CN1975679A (zh) | 用于优化分段资源分配的方法和设备 | |
CN1573701A (zh) | 分布式构建环境中的软件映像创建 | |
CN1910554A (zh) | 多处理器系统中处理器任务迁移的方法与装置 | |
CN111639044B (zh) | 一种支持中断优先级轮询仲裁派发的方法和装置 | |
US9836516B2 (en) | Parallel scanners for log based replication | |
CN1960287A (zh) | 用于在网络上调度作业的方法和设备 | |
CN1653451A (zh) | 提供数据项的可用版本 | |
CN1848851A (zh) | 创建轻量目录访问协议数据交换格式片段的方法与计算机 | |
CN1904824A (zh) | 为全球应用创建文化敏感控件的方法和系统 | |
CN1968168A (zh) | 刀片服务器的定位方法及定位系统 | |
CN1975655A (zh) | 用于管理对存储装置的访问的方法和设备 | |
CN1273910C (zh) | 总线式进程间通信方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20060906 Termination date: 20161119 |