一种实现通信过程零拷贝消息队列的方法技术

技术编号:2868039 阅读:299 留言:0更新日期:2012-04-11 18:40
本发明专利技术涉及一种在通信过程中,实现零拷贝消息队列的方法。零拷贝消息队列是一个由指向消息体数据的指针组成的循环缓冲区,其数据结构包括消息队列的头指针、尾指针、当前消息数目、消息队列的总的消息数目、以及互斥操作信号量、计数信号量等。本发明专利技术克服了现有操作系统消息队列中存在多次内存拷贝的缺点,以保证消息通信过程中没有内存拷贝。可广泛地应用于嵌入式操作系统。通过与VxWorks消息队列的对比测试,大大提高了通信速率,同时降低了通信过程中的内存占用,节省了宝贵的系统资源。同时由于支持多种操作系统,因此有利于构建在各种操作系统之上的应用程序的移植。(*该技术在2023年保护过期,可自由使用*)

【技术实现步骤摘要】

本专利技术涉及一种实现在操作系统任务或线程间进行通信的方法,具体是一种在通信过程中,实现零拷贝消息队列的方法,适用于在嵌入式实时操作系统任务间,通过消息队列进行通信。
技术介绍
随着世界经济进入数字新经济时代,电信技术和信息网络技术得到了前所未有的迅猛发展。通信领域从网络到业务的巨大变化推动着数据业务的持续发展,数据业务的流量在2~3年内可能超过话音业务流量。基于数据分组交换的业务将在5~10年内覆盖整个传统电信业务。从而在单一话音业务电路交换中的信令流通信方式,变为大量数据业务数据交换中的协议流和信令流通信方式,通信量大大增加,通信速率也在增大,这就对通过操作系统传递控制流数据提出了更高的要求。现代操作系统常常是通过消息的方式来进行任务间的通信,消息队列提供了一种高级的任务间通信机制,在嵌入式系统中有广泛的用途。但目前的操作系统提供的消息队列在进行消息通信的过程中,为了提供对任务上下文的保护,通常的做法是将发送任务私有空间的消息拷贝到系统缓冲区,再从系统缓冲区拷贝到接收任务的私有空间中,这样在消息收发过程中存在多次的消息内存拷贝,一方面大量消耗系统资源,另一方面通信效率也大大降低了。1.在嵌入式实时操作系统VxWorks中,系统通过msgQSend()函数发送消息,通过msgQReceive()函数接收消息。一个消息的发送在接收任务等待该消息队列的情况下,要经过一次内存拷贝发送任务的私有空间到接收任务的私有空间。而在接收任务没有等待该消息队列时,要经过二次内存拷贝从发送任务的私有空间到系统消息队列的缓冲区;再从消息队列缓冲区到接收任务的私有空间。如果发送的消息较大,则还必须加大发送任务和接收任务的堆栈空间,否则容易造成堆栈溢出。2.在通用操作系统如Windows NT中,系统通过PostMessage()函数发送异步消息,通过SendMessage()函数发送同步消息,通过GetMessage()或PeekMessage()接收消息。在windows程序中,当应用程序发送一个消息通知指定的窗口执行一个任务时,PostMessage()函数为该消息创建一个MSG消息结构并将该消息拷贝到消息队列中,而应用程序通过消息循环将该消息取出(从消息队列中拷贝到本地上下文),并派发到相应的窗口进行处理。可见,消息在派发过程中也存在多次内存拷贝问题。再者,通信领域的应用程序大多是基于消息驱动,对消息队列的操作非常频繁,而目前各种操作系统提供的消息队列调用接口不一致,造成应用程序代码的移植很不方便,可读性也很差。
技术实现思路
本专利技术的目的是为了克服了现有操作系统消息队列中存在多次内存拷贝的缺点,提出了一种在通信过程中,实现零拷贝消息队列的方法,以保证消息通信过程中没有内存拷贝。本专利技术支持紧迫和普通两级消息,并提供了多种查询接口,通过对信号量和互斥机制的适配,可广泛地应用于嵌入式操作系统如VxWorks,pSoS,以及通用操作系统Windows NT,Linux等多种操作系统,屏蔽各种操作系统的差异。本专利技术是这样实现的 ,包括如下步骤第一步 信号量适配创建、获取、释放、删除一个对各种操作系统通用的信号量,包括vxworks,pSos,Windows NT,Linux等操作系统。第二步 互斥量适配创建、获取、释放、删除一个对各种操作系统通用的互斥量,包括vxworks,pSos,Windows NT,Linux等操作系统。第三步 系统消息队列池初始化系统初始化时在系统缓冲区中分配一个消息队列池创建整个消息队列的索引信息。第四步 创建消息队列从消息队列池中查找一个尚未分配的消息队列,返回该消息的编号,用于消息的发送和接收。第五步 发送消息在指定的消息队列上,发送消息数据,如果是紧迫消息,将该消息添加到消息队列头,普通消息,将该消息添加到消息队列尾,最后返回成功或失败。第六步 接收消息在指定的消息队列上接收消息,并返回接收缓冲区的指针。如果消息队列为空当超时参数为0,立即返回空指针;当超时参数为-1,任务进入阻塞队列永久等待;当超时参数为其它值,任务延迟一段时间并继续运行。当消息队列非空时,从消息队列头取出一消息并返回到接收缓冲区。第七步删除消息队列对不用的消息队列需要删除,并释放其占用的内存。删除消息队列是创建消息队列的逆过程,通过对指定的消息队列ID号判断其是否正在使用,若没有使用,删除失败,若正在使用,则将该消息队列中的消息内存释放,清空消息个数,并设置为未用。第八步查询消息数通过输入索引号获得需要查询的消息队列,并返回其中的消息数。采用本专利技术所述的零拷贝消息通信的方法,通过与VxWorks消息队列的对比测试,与现有技术相比,大大提高了通信速率,同时降低了通信过程中的内存占用,节省了宝贵的系统资源。同时由于其支持多种操作系统,因此有利于构建在各种操作系统之上的应用程序的移植。附图说明图1给出的是VxWorks消息队列实现方式;图2给出的是零拷贝消息队列实现原理;图3给出的是零拷贝消息队列的实现流程;图4给出的是创建消息队列流程;图5给出的是发送消息流程;图6给出的是接收消息流程;图7给出的是删除消息队列流程。具体实施例方式图1介绍了VxWorks消息队列实现方式,消息队列在初始化时,在系统空间里分配并初始化一个消息队列。以它能够排队的最大的消息数目以及每个消息的最大字节长度作为参数,预先分配足够的缓冲空间。当任务和ISR调用msgQSend()函数向消息队列发送消息时,如果没有任务在等待该队列中的消息,那么该消息进入消息队列的缓冲。如果有任务等待该队列的消息,那么这个消息立即提交给第一个等待的任务。当消息队列已满时,即当队列没有可用缓冲时,发送任务等待一定的超时。当超时为NO_WAIT(0),发送任务立即返回错误。当超时为WAIT_FOREVER(-1),发送任务进入阻塞任务队列。当超时为其他时,发送任务延迟一段时间再继续运行。任务调用msgQReceive()函数从消息队列接收消息。如果队列缓冲中已有可用的消息,那么第一个消息立即出队列,并返回给调用者。如果没有消息可用,调用者将阻塞,进入等待该消息的任务队列中排队。由此可见,在VxWorks中,一个消息的发送在接收任务等待该消息队列的情况下,要经过一次内存拷贝发送任务的私有空间到接收任务的私有空间。而在接收任务没有在该消息队列等待时,要经过二次内存拷贝从发送任务的私有空间到系统消息队列的缓冲区;再从消息队列缓冲区到接收任务的私有空间。图2介绍了零拷贝消息队列实现原理。零拷贝消息队列是一个由指向消息体数据的指针组成的循环缓冲区,其数据结构包括消息队列的头指针、尾指针、当前消息数目、消息队列的总的消息数目、以及互斥操作信号量、计数信号量等。系统初始化时在系统缓冲区中分配一个消息队列池创建整个消息队列的索引信息。当任务创建一个用于任务间通信的消息队列时,从消息队列池中查找一个尚未分配的消息队列,返回该消息的编号,用于消息的发送和接收。消息发送时,如果是普通消息,发送任务数据的指针挂接到当前消息队列的尾部,如果是紧迫消息,则将该消息数据的指针添加到消息队列的头部。如果到达消息队列的边界,作边界指针调整。发送完毕后释放等待在该消息队列上的信号量,即计本文档来自技高网
...

【技术保护点】
一种实现通信过程零拷贝消息队列的方法,包括如下步骤:进行信号量适配:创建、获取、释放、删除一个对操作系统通用的信号量;进行互斥量适配:创建、获取、释放、删除一个对操作系统通用的互斥量;对系统消息队列池初始化:系统初始 化时,在系统缓冲区中分配一个消息队列池,以创建整个消息队列的索引信息;创建消息队列:从消息队列池中查找一个尚未分配的消息队列,返回该消息的编号,用于消息的发送和接收;发送消息:在指定的消息队列上,发送消息数据;接收消 息:在指定的消息队列上接收消息,并返回接收缓冲区的指针;删除消息队列:对不用的消息队列需要删除,并释放其占用的内存;查询消息数:通过输入索引号获得需要查询的消息队列,并返回其中的消息数。

【技术特征摘要】

【专利技术属性】
技术研发人员:谢鑫
申请(专利权)人:中兴通讯股份有限公司
类型:发明
国别省市:94[中国|深圳]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1
相关领域技术
  • 暂无相关专利