基于客户机服务器模型的多进程通信方法
文献发布时间:2023-06-19 10:38:35
技术领域
本发明属于嵌入式终端操作系统进程通信领域,尤其涉及一种基于客户机服务器模型的多进程通信方法。
背景技术
进程是操作系统的概念,每当执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放,可以认为进程是一个程序的一次执行过程。
进程用户空间是相互独立的,一般而言是不能相互访问的。但很多情况下进程间需要互相通信,来完成系统的某项功能。进程通过与内核及其它进程之间的互相通信来协调它们的行为。一般进程间通信,有以下几种应用场景:(1)数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间;(2)共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到;(3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程);(4)资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制;(5)进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
基本进程通讯方法有共享存储、消息传递、管道通信。当前嵌入式终端已广泛使用Linux等操作系统,同时终端的软件开发设计广泛应用面向对象等模块化技术,使得终端内部的不同功能模块的进程间通信越来越频繁。所以对进程间的通信机制提出了更高的要求,实现高效可靠的进程通信对保证嵌入式终端长期稳定运行十分有必要。
消息队列是存放在内核中的消息链表,每个消息队列由消息队列标识符表示。只有在操作系统重启或者显示地删除一个消息队列时,该消息队列才会被真正的删除。消息队列在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。
消息队列特点:消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识;消息队列允许一个或多个进程向它写入与读取消息;管道和消息队列的通信数据都是先进先出的原则;消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。
消息队列的缺点:消息队列是操作系统内建的,可阻塞/非阻塞发送和接收,但是阻塞时无超时,影响程序逻辑设计;消息队列不能多路复用,当多个进程互相进行消息发送时,需要建立多个消息队列,使用起来比较麻烦。
发明内容
发明目的:针对以上问题,本发明提出一种基于客户机服务器模型的多进程通信方法,实现多个进程之间,支持一对一或一对多或多对多的双向通信,并且支持多进程间的同步或异步通信。
技术方案:为实现本发明的目的,本发明所采用的技术方案是:一种基于客户机服务器模型的多进程通信方法,包括步骤:
(1)确认需要进行通信的进程,给各进程预定义分配服务ID;
(2)各进程调用消息注册接口,创建一个消息管理器对象,并与服务ID绑定;
(3)各进程创建消息处理循环,定时接收消息,并应答回复;
(4)各进程可以在程序执行的任意时刻,调用消息发送接口,向目标服务ID发送消息,实现进程间通信。
进一步地,一个进程可以有多个消息处理循环,则分配多个服务ID,并进行多次注册。
进一步地,消息注册接口包括消息管理器对象、消息槽、消息管理类;消息槽包括消息缓冲区、服务ID、消息序号、socket侦听端口;消息管理类包括一个消息公告板,消息公告板具有锁保护。
进一步地,消息注册流程包括:
(2.1)调用消息管理类判断服务ID是否已经注册;
(2.2)如未注册,则获取消息公告板的锁;
(2.3)在消息公告板中添加服务ID的消息公告信息;
(2.4)释放消息公告板的锁;
(2.5)在消息管理类中添加服务ID的消息槽信息。
进一步地,消息处理循环流程包括:进行消息接收;若接收到消息,则根据消息类型进行处理;处理之后进行消息应答回复。
进一步地,消息接收流程包括:
(3.1)调用消息管理类查找接收者服务ID对应的消息槽;
(3.2)判断消息槽中的消息缓冲区是否存在消息数据;
(3.3)若存在消息数据则获取消息数据,通过数据消息帧格式识别匹配,然后返回消息数据,退出消息接口;
(3.4)若不存在消息数据,则在接收超时时间内,侦听消息槽的socket侦听端口数据,如侦听到数据,则读取消息槽的socket侦听端口数据,通过数据消息帧格式识别匹配,然后返回消息数据,退出消息接口;如没有侦听到数据,则返回超时。
进一步地,消息发送流程包括:
(4.1)调用消息管理类查找发送者服务ID对应的消息槽;
(4.2)通过消息管理类获取消息公告板锁;
(4.3)从消息公告板中获取目标服务ID的消息槽的socket侦听端口,查找目标服务ID的消息公告信息;
(4.4)判断发送消息内容是否具备消息头尾,若无则将发送消息内容添加消息头尾;
(4.5)向目标服务ID绑定的socket侦听端口发送消息。
有益效果:本发明发送/接收消息接口是基于客户机服务器模型,在socket通信基础上封装设计的,具备操作系统内建,可阻塞/非阻塞发送和接收,可多路复用,接收时可设置超时等优点。本发明实现的多进程通信方法,减少了直接使用socket通信的复杂度,在程序开发中更具便利性。
附图说明
图1是消息处理模型图;
图2是消息处理循环流程图;
图3是消息注册流程图;
图4是消息发送流程图;
图5是消息接收流程图。
具体实施方式
下面结合附图和实施例对本发明的技术方案作进一步的说明。
基于客户端服务器模型的多进程通信方法,能够实现多个进程之间,支持一对一或一对多或多对多的双向通信,并且支持多进程间的同步或异步通信,使用该方法应用在软件工程实践中能够有效的简易化进程通信相关功能的开发实现。
本发明所述的基于客户机服务器模型的多进程通信方法,包括以下步骤。
(1)确认需要进行通信的进程,然后给各进程预定义分配服务ID;一个进程可以有多个服务ID,但是每个服务ID不能重复;
(2)各进程调用消息注册接口,创建一个消息管理器对象,并与服务ID绑定;一个进程若有多个服务ID,需要注册多次;
进程运行时,调用消息注册接口,创建一个消息管理器对象,每个消息管理器对象有一个唯一的ID,称为服务ID,用于其他的消息管理器对象找到它。
(3)各进程创建消息处理循环,定时接收消息,并应答回复。
(4)各进程可以在程序执行的任意时刻,调用消息发送接口,向目标服务ID发送消息,实现进程间通信。
如图1所示,支持一个进程有一个或多个消息处理循环,按消息处理循环位置的不同,有如下三种不同的消息处理模型:
模型1:一个进程只有一个消息处理循环,消息由主线程分发到各个线程;
模型2:一个进程的每个线程都有自己的消息处理循环;
模型3:以上两种模型的混合体,消息由主线程分发到各个线程,并且有的线程有自己的消息处理循环。
目标服务ID所在的进程,通过消息处理循环,定时调用接收消息接口,获取到发给自身的消息,并应答回复。每个消息处理循环,对应一个消息管理器对象。
如图2所示,消息处理循环流程包括:
(1)进行消息接收;
(2)若接收到消息,则根据消息类型进行处理;
针对多种不同类型的业务消息,通过消息类型进行区分。消息类型处理包括数据传输类消息处理,事件通知类消息处理,进程控制类消息处理,共享数据类消息处理。
(3)处理之后进行消息应答回复。
消息注册时,将每个消息管理器对象与一个消息槽绑定。消息槽包括消息缓冲区、服务ID、消息序号、socket侦听端口。同时定义一个消息管理类,用于管理消息槽。消息管理类,包括一个消息公告板,消息公告板具有锁保护,用于记录注册的服务ID和消息槽的对应关系,用于检索查找;同时具有对消息槽的操作方法,包括添加、绑定、查找、接收等。
如图3所示,消息注册流程包括:
(1)调用消息管理类判断服务ID是否已经注册;
(2)如未注册,则获取消息公告板的锁,获取消息公告板的对象句柄;
(3)在消息公告板中添加服务ID的消息公告信息;
(4)释放消息公告板的锁;
(5)在消息管理类中添加服务ID的消息槽信息。
发送消息接口,包含发送者消息管理器对象、消息类型、目标服务ID、发送消息内容。
如图4所示,消息发送流程包括:
(1)根据发送者消息管理器对象,通过消息管理类查找发送者服务ID对应的消息槽;
(2)通过消息管理类获取消息公告板锁,获取消息公告板的对象句柄;
(3)从消息公告板中获取目标服务ID的消息槽的socket侦听端口;通过消息公告板的对象句柄查找目标服务ID的消息公告信息;
(4)判断发送消息内容是否具备消息头和尾,若无则将发送消息内容添加消息头和尾;
(5)向目标服务ID绑定的socket侦听端口发送消息。
接收消息接口,包含接收者消息管理器对象、接收超时时间、接收缓冲区。
如图5所示,消息接收流程包括:
(1)根据接收者消息管理器对象,使用消息管理类的查找方法,找到接收者的服务ID对应的消息槽;
(2)判断消息槽中的消息缓冲区是否存在消息数据;
(3)若存在消息数据则获取消息数据,通过数据消息帧格式识别匹配,然后返回消息数据,退出消息接口;
(4)若不存在消息数据,则根据接收者消息槽的socket侦听端口,调用socket接收接口,在接收超时时间内,尝试接收消息。
在超时时间内,侦听消息槽的socket侦听端口数据,如侦听到数据,则读取消息槽的socket侦听端口数据,通过数据消息帧格式识别匹配,然后返回消息数据,退出消息接口。在超时时间内,侦听消息槽的socket侦听端口数据,如没有侦听到数据,则返回超时。接收消息接口以阻塞模式工作,如果没有接收到任何消息,调用接收消息接口的线程会被操作系统阻塞让出CPU,直至有消息到达,或到达超时时间。
基于客户机服务器模型的多进程方法,包括三个进程通信接口:消息注册接口、发送消息接口、接收消息接口。
发送/接收消息接口,基于客户机服务器模型,在socket通信基础上封装设计的。具备以下优点:操作系统内建,可阻塞/非阻塞发送和接收,可多路复用,接收时可设置超时。本发明实现的多进程通信方法,减少了直接使用socket通信的复杂度,在程序开发中更具便利性。
具体接口如下:
消息注册接口:
消息发送接口:
消息接收接口:
相对应的socket接口:
得出以下比较结果:
本发明进程通信方法,函数数量和函数参数都比socket要少,并且参数也比较简单,使用比较方便。
- 基于客户机服务器模型的多进程通信方法
- 多进程间的通信方法和系统