首页 / 专利库 / 电脑零配件 / 计算机系统 / 软件 / 系统软件 / 操作系统 / 一种基于Linux内核的多点到多点数据发布和订阅方法

一种基于Linux内核的多点到多点数据发布和订阅方法

阅读:636发布:2024-01-12

专利汇可以提供一种基于Linux内核的多点到多点数据发布和订阅方法专利检索,专利查询,专利分析的服务。并且本 发明 公开了一种基于Linux 内核 的多点到多点数据发布和订阅方法,该方法基于Linux 操作系统 平台,属于数据通信领域。所述的方法是在Linux内核中编写两个内核模 块 ,分别为数据发布(Publisher)模块和数据订阅(Subscriber)模块,将这两个模块安装在Linux内核中,可在操作系统设备目录中生成两个文件,应用程序可通过 访问 文件的方式实现任务间通信。该方法通过大量的双向链表维护各个任务发布数据和订阅数据信息,通过双向链表临时保存任务间通信数据,通过POLL机制实现应用程序对内核文件的访问,通过PROC文件系统向用户公布运行状态。本发明为上层任务提供了一种资源占用少、实时性强、应用方便、稳定可靠的任务间通信方法。,下面是一种基于Linux内核的多点到多点数据发布和订阅方法专利的具体信息内容。

1.一种基于Linux内核的多点到多点数据发布和订阅方法,其特征在于包括以下步骤:
S1:Linux系统加载内核模,在其文件系统中生成发布文件和订阅文件,在内核中生成邮箱池;
S2:一个或多个发布任务分别进行发布数据准备,一个或多个接收任务分别进行订阅数据准备;
S3:一个或多个发布任务分别发送数据并将数据写入Linux内核,Linux内核通知每个接收任务分别接收数据,每个接收任务分别接收并读取数据,所有的接收任务均读取数据之后,Linux内核将数据删除;
所述步骤S2中的发布任务进行发布数据准备具体为:
S201:发布任务打开发布文件,发布文件在邮箱池中查找与要创建的邮箱名称相同的邮箱,若找到,则将该邮箱的地址返回给发布任务;若未找到,则执行步骤S202;
S202:在内核中创建以该名称命名的邮箱,将邮箱插入邮箱池,然后为邮箱创建若干报头和若干报文,在邮箱的预留空间中登记发布任务的个数和接收任务的个数,将创建的邮箱的地址返回给发布任务;
所述步骤S2中的接收任务进行订阅数据准备具体为:
S211:接收任务打开订阅文件并生成订单,订单中包含内核等待队列;
S212:根据订阅文件在邮箱池中查找与要订阅的邮箱名称相同的邮箱,若找到,则将生成的订单保存到该邮箱中;若未找到,则执行步骤S213;
S213:在内核中创建以该名称命名的邮箱,将邮箱插入邮箱池,然后为邮箱创建若干报头和若干报文,在邮箱的预留空间中登记发布任务的个数和接收任务的个数,将生成的订单保存到创建的邮箱中;
S214:将订单地址返回给接收任务;
S215:接收任务通过poll函数等待在订单的内核等待队列上。
2.根据权利要求1所述的一种基于Linux内核的多点到多点数据发布和订阅方法,其特征在于:所述的在内核中创建以该名称命名的邮箱,将邮箱插入邮箱池,然后为邮箱创建若干报头和若干报文,具体为:
S221:根据邮箱的数据结构在内核中为邮箱申请内存,给邮箱命名,在邮箱中预留多个空间分别保存发布任务数量、接收任务数量、空闲报文列表、空闲报头列表和订单;
S222:将邮箱插入邮箱池;
S223:根据报文的数据结构在内核中为报文申请内存,在报文中预留多个空间分别保存报文的承载能、承载数据后报文的大小、订单的数量和发布任务的数据;
S224:将报文插入邮箱的空闲报文列表;
S225:根据报头的数据结构在内核中为报头申请内存,在报头中预留空间保存报文;
S226:将报头插入邮箱的空闲报头列表。
3.根据权利要求1所述的一种基于Linux内核的多点到多点数据发布和订阅方法,其特征在于:所述步骤S3中发布任务将数据写入Linux内核具体为:
S31:发布任务查找要写入数据的邮箱,根据邮箱中的订单判断是否有接收任务订阅该数据,若没有,则发送终止;若有,执行步骤S32;
S32:根据空闲报文列表从邮箱中获取空闲的报文,判断该报文的承载能力是否满足需求,若满足,将数据保存到该报文中;若不满足,释放该报文并获取新的报文,将数据保存到新的报文中,更新邮箱中接收任务的数量;
S33:根据邮箱中的订单数量获取空闲的报头,将添加数据后的报文分别保存到每个报头中,在每个订单中插入一个添加该报文的报头;
S34:唤醒所有订单中的内核等待队列。
4.根据权利要求1所述的一种基于Linux内核的多点到多点数据发布和订阅方法,其特征在于:所述步骤S3中接收任务读取数据具体为:接收任务从订单中获取数据,每次获取数据后将报文中的接收任务数量减1,并将订单中的报头插回邮箱的空闲报头列表,当接收任务数量为0时清除报文中的数据并将报文插回邮箱的空闲报文列表。

说明书全文

一种基于Linux内核的多点到多点数据发布和订阅方法

技术领域

[0001] 本发明属于数据通信领域,尤其涉及在多任务操作系统环境下,任务间通信的方法。

背景技术

[0002] Linux操作系统是多用户、多任务操作系统,广泛应用在各种通信和电子设备上。在多任务操作系统上,多个任务并发协同工作,可有效提高硬件平台的使用效率和业务的处理能。但是同时,多任务并发协同工作,为设计人员带来了任务间同步和任务间通信的要求。
[0003] Linux操作系统下,常用的任务间通信(IPC)方法包括信号量、管道、共享内存、消息队列和套接字(Socket),每种通信方式的特点如下:
[0004] 信号量:信号量是一种异步通信机制,任务不需要执行任何操作来等待信号的到达。信号异步通知接收信号的任务发生了某个事件,然后操作系统将会中断接收到信号的任务的执行,转而去执行相应的信号处理程序。信号通知任务发生某种事件,无法传输大量数据。
[0005] 管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的任务间使用。
[0006] 共享内存(shared memory):共享内存就是映射一段能被其他任务所访问的内存,这段共享内存由一个任务创建,但多个任务都可以访问。共享内存是最快的IPC方式,它是针对其他任务间通信方式运行效率低而专设计的。它往往与其他通信机制,如信号量,配合使用,来实现任务间的同步和通信。
[0007] 套接字:套接字通过TCP/IP协议进行数据通信,可用于不同CPU间任务和同一个CPU上多任务之间的通信;
[0008] 消息队列:消息队列是一个消息的链表,具有特定的格式及特定的优先级,写任务可以向消息队列中写入数据,读任务可以从消息队列冲读取消息;
[0009] 各种通信方式都有其特点,因此,适合在各种不同通信需要情况下使用。例如:管道只能在具有亲缘关系的任务间使用,只支持单项数据流,管道所传送的是无格式字节流,不区分消息的边界;共享内存适合任务间大数据量的交互,但是由于多个任务可以同时访问同一内存,数据的安全性和一致性需要严密的任务间同步来保证;套接字适合不同主机任务间通信,但是对于同一主机上的任务,套接字的网络特征却成了累赘,数据的传输要经过复杂的TCP/IP协议封装,各层报头封装,CRC校验和确认等等特征都降低了通信的传输效率;消息队列效率较高,但是,同一任务无法通过异步通知模型同时访问多个消息队列,而且消息队列只支持点对点数据通信,无法实现一点对多点或者多点对多点的数据通信。

发明内容

[0010] 本专利的目的是提出一种轻量级的、高效率的、支持异步通知模型的、多点对多点的任务间通信方法,称为多点到多点数据发布和订阅方法。
[0011] 本发明通过以下技术方案来实现上述目的:一种基于Linux内核的多点到多点数据发布和订阅方法,包括以下步骤:
[0012] S1:Linux系统加载内核模块,在其文件系统中生成发布文件和订阅文件,在内核中生成邮箱池;
[0013] S2:一个或多个发布任务分别进行发布数据准备,一个或多个接收任务分别进行订阅数据准备;
[0014] S3:一个或多个发布任务分别发送数据并将数据写入Linux内核,Linux内核通知每个接收任务分别接收数据,每个接收任务分别接收并读取数据,所有的接收任务均读取数据之后,Linux内核将数据删除。
[0015] 其中,步骤S2中的发布任务进行发布数据准备具体为:
[0016] S201:发布任务打开发布文件,根据发布文件在邮箱池中查找与要创建的邮箱名称相同的邮箱,若找到,则将该邮箱的地址返回给发布任务;若未找到,则执行步骤S202;
[0017] S202:在内核中创建以该名称命名的邮箱,将邮箱插入邮箱池,然后为邮箱创建若干报头和若干报文,在邮箱的预留空间中登记发布任务的个数和接收任务的个数,将创建的邮箱的地址返回给发布任务。
[0018] 其中,步骤S2中的接收任务进行订阅数据准备具体为:
[0019] S211:接收任务打开订阅文件并生成订单,订单中包含内核等待队列;
[0020] S212:根据订阅文件在邮箱池中查找与要订阅的邮箱名称相同的邮箱,若找到,则将生成的订单保存到该邮箱中;若未找到,则执行步骤S213;
[0021] S213:在内核中创建以该名称命名的邮箱,将邮箱插入邮箱池,然后为邮箱创建若干报头和若干报文,在邮箱的预留空间中登记发布任务的个数和接收任务的个数,将生成的订单保存到创建的邮箱中;
[0022] S214:将订单地址返回给接收任务;
[0023] S215:接收任务通过poll函数等待在订单的内核等待队列上。
[0024] 其中,在内核中创建以该名称命名的邮箱,将邮箱插入邮箱池,然后为邮箱创建若干报头和若干报文,具体为:
[0025] S221:根据邮箱的数据结构在内核中为邮箱申请内存,给邮箱命名,在邮箱中预留多个空间分别保存发布任务数量、接收任务数量、空闲报文列表、空闲报头列表和订单;
[0026] S222:将邮箱插入邮箱池;
[0027] S223:根据报文的数据结构在内核中为报文申请内存,在报文中预留多个空间分别保存报文的承载能力、承载数据后报文的大小、订单的数量和发布任务的数据;
[0028] S224:将报文插入邮箱的空闲报文列表;
[0029] S225:根据报头的数据结构在内核中为报头申请内存,在报头中预留空间保存报文;
[0030] S226:将报头插入邮箱的空闲报头列表。
[0031] 其中,步骤S3中发布任务将数据写入Linux内核具体为:
[0032] S31:发布任务查找要写入数据的邮箱,根据邮箱中的订单判断是否有接收任务订阅该数据,若没有,则发送终止;若有,执行步骤S32;
[0033] S32:根据空闲报文列表从邮箱中获取空闲的报文,判断该报文的承载能力是否满足需求,若满足,将数据保存到该报文中;若不满足,释放该报文并获取新的报文,将数据保存到新的报文中,更新邮箱中接收任务的数量;
[0034] S33:根据邮箱中的订单数量获取空闲的报头,将添加数据后的报文分别保存到每个报头中,在每个订单中插入一个添加该报文的报头;
[0035] S34:唤醒所有订单中的内核等待队列。
[0036] 其中,所述步骤S3中接收任务读取数据具体为:接收任务从订单中获取数据,每次获取数据后将报文中的接收任务数量减1,并将订单中的报头插回邮箱的空闲报头列表,当接收任务数量为0时清除报文中的数据并将报文插回邮箱的空闲报文列表。
[0037] 本发明方法相对于背景技术的优点:
[0038] (1)本方法在Linux内核中实现,以内核模块的形式存在,大量使用了双向内核消息队列,方便了数据的检索,提高了数据存储和访问的效率。
[0039] (2)本发明的内核模块为用户态的任务提供了文件访问接口,任务通过打开,关闭,ioctl,读,写和Poll操作使用内核模块,实现多任务间通信。附图说明
[0040] 图1为本发明的所有任务初始化之后内核中的数据结构;
[0041] 图2为本发明实施例发布任务A或者发布任务B发布数据报,接收任务D和接收任务E获取数据报过程中内核中的数据结构;
[0042] 图3为本发明邮箱的数据结构;
[0043] 图4为本发明报头的数据结构;
[0044] 图5为本发明订单的数据结构;
[0045] 图6为本发明报文的数据结构。

具体实施方式

[0046] 下面结合附图和实施例对本发明做进一步详细的说明。
[0047] 本文通过举例的方式描述本发明的内容和实施方式。假设应用层的发布任务为三个,接收任务为两个,分别为发布任务A、发布任务B、发布任务C、接受任务D和接受任务E。发布任务A和发布任务B同时发布的邮箱名称为“MSGQ_TEST1”,发布任务C发布的邮箱名称为“MSGQ_TEST2”,接收任务D和接收E同时订阅的邮箱名称为“MSGQ_TEST1”。
[0048] 一种基于Linux内核的多点到多点数据发布和订阅方法,具体过程如下:
[0049] 1.内核启动,系统自动加载内核模块:
[0050] a)在文件系统内生成“发布文件”;
[0051] b)在文件系统中生成“订阅文件”;
[0052] c)在内核中生成双向链表表头数据邮箱池,并且对邮箱池进行初始化;
[0053] 2.发布任务进行发布数据准备,为发布任务A、发布任务B和发布任务C写数据创建内核资源;接收任务进行订阅数据准备,为接收任务D和接收任务E读数据的任务创建资源;
[0054] (1)发布任务进行发布数据准备具体为:
[0055] a)发布任务A打开“发布文件”;
[0056] b)发布任务A调用ioctl,并进行数据发布初始化工作;
[0057] c)内核获取名称为“MSGQ_TEST1”,该数据报对应的邮箱名称为“MSGQ_TEST1”;
[0058] d)发布任务A扫描邮箱池,如果存在名称为“MSGQ_TEST1”的邮箱,则返回该节点指针;如果不存在名称为“MSGQ_TEST1”的邮箱,则在内核中生成一个新的邮箱;
[0059] e)初始化邮箱的数据结构(邮箱的数据结构如图3所示),具体包括:
[0060] 1)在邮箱的邮箱名称域保存新生成的邮箱的名称“MSGQ_TEST1”,在邮箱的发布任务数量域保存发布该数据的任务数量(初始为0),在邮箱的订单数量域保存订阅该数据的任务数量(初始为0),在邮箱消息统计域统计数据报发送次数(初始为0);
[0061] 2)在邮箱中初始化三个双向链表头,分别为订单链表头、空闲报头链表头和空闲报文链表头;订单链表头用于串联所有订单的信息,空闲报文链表头用于串联空闲的报文,空闲报头链表头用于串联空闲的报头;
[0062] f)通过邮箱中的链表节点域将新生成的邮箱插入邮箱池链表;
[0063] g)将订单链表和空闲报文链表初始化为空链表,初始化若干报头并将其添加到空闲报头链表上,初始化报头数据结构;报头数据结构如图4所示;
[0064] 初始化报头数据结构具体为:将报头的报文指针域初始化为空;
[0065] h)通过报头的链表节点域将新生成的报头插入到邮箱的空闲报头链表;
[0066] i)将邮箱的发布任务数量加1;
[0067] j)发布任务A准备工作完成;
[0068] k)发布任务B打开“发布文件”;
[0069] l)发布任务B调用ioctl,并进行数据发布初始化工作,由于发布任务B也发布名称为“MSGQ_TEST1”的数据报,而在内核中已经生成名字为“MSGQ_TEST1”的邮箱,内核找到该邮箱后返回给发布任务B;
[0070] m)邮箱的发布任务数量加1;
[0071] n)发布任务C发布名称为“MSGQ_TEST2”的数据报,流程同发布任务A发布“MSGQ_TEST1”数据报即步骤2的(1)中的步骤e)至步骤f),生成的所有邮箱都需要挂在邮箱池链表上。
[0072] (2)接收任务进行订阅数据准备具体为:
[0073] a)接收任务D打开“订阅文件”;
[0074] b)接收任务D用ioctl,进行数据订阅初始化工作;
[0075] c)内核获取名称为“MSGQ_TEST1”,该数据报对应的邮箱名称为“MSGQ_TEST1”;
[0076] d)初始化订单的数据结构;订单的数据结构如图5所示;
[0077] e)接收任务D遍历邮箱池,查找名字为“MSGQ_TEST1”的邮箱,如果查找到,则将查找到的邮箱地址保存在订单的邮箱指针域;如果没有找到,则生成新的邮箱,具体生成的方法参照步骤2的(1)中的步骤a)至步骤i),将新生成的邮箱地址保存在订单的邮箱指针域;
[0078] f)邮箱的订单数量域加1;
[0079] g)初始化订单的内核等待队列域;
[0080] h)初始化订单的数据链表域为空;
[0081] i)通过订单的链表节点域将该订单添加到邮箱的订单链表中,实现有发布任务A、发布任务B向邮箱写数据的时候,内核能直接找到接收任务D的订单;
[0082] j)接收任务D调用poll函数,通过poll_wait等待在订单内核等待队列上,等待发布任务A、发布任务B向邮箱写数据后唤醒;
[0083] 接收任务D等待接收数据报时,挂起在内核等待队列上,当有发布任务写数据报时唤醒该内核等待队列,从而唤醒任务D。
[0084] k)接收任务E订阅名称为“MSGQ_TEST1”的数据报,流程同接收任务D即步骤2中(2)的步骤a)至步骤j),接收任务D和接收任务E的订单都要挂在邮箱的订单链表中。
[0085] 发布任务A、发布任务B、发布任务C、接收任务D和接收任务E均初始化完成后,内核中的数据结构如图1所示。
[0086] 3.发布任务和接收任务分别发送和接收数据,数据通过内核在任务间传递:
[0087] a)发布任务A和发布任务B均打开“发布文件”,通过ioctl通知内核要向“MSGQ_TEST1”邮箱写数据;
[0088] b)发布任务A和发布任务B分别向“发布文件”写数据,内核获取对应的邮箱;
[0089] c)通过邮箱的订单数量域判断,如果没有订阅任务则发送终止;如果有订阅任务,执行步骤d);
[0090] d)通过邮箱的空闲报文链表获取一个空闲报文,如果获取成功,则将该空闲报文从空闲报文链表中删除,然后从用户空间获取数据,将数据保存在该空闲报文的报文数据域中,将当前报文尺寸域设置为数据大小,累计邮箱的写次数;如果没有获取成功,则生成新的报文,然后从用户空间获取数据,将数据保存在该新生成报文的报文数据域中,将当前报文尺寸域设置为数据大小,累计邮箱的写次数;如果获取的报文最大容量不满足存储数据的要求,则释放该报文,并按照需求的大小生成新的报文,然后从用户空间获取数据,将数据保存在该新生成报文的报文数据域中,将当前报文尺寸域设置为数据大小,累计邮箱的写次数;
[0091] 报文的数据结构如图6所示,最大报文容量域保存该报文的容量,当前报文尺寸域保存当前存在于该区域的数据实际大小。
[0092] e)根据邮箱的订单数量域获取该数据的接收任务数量,如果接收任务数量为0,直接将获取的报文插回空闲报文链表中,操作结束;如果接收任务数量不为0,将报文的报文读取计数域设置为接收任务数量,通过邮箱的订单链表获取每一个订单,为每一个订单从邮箱的空闲报头链表获取一个空的数据头,将报头的报文指针域指向保存数据的报文,将数据头对应插入订单的数据链表中;
[0093] f)内核通过接收任务D和接收任务E的订单内核等待队列分别唤醒接收任务D和接收任务E;
[0094] 接收任务D和接收任务E读数据之前内核中数据结构如图2所示;
[0095] g)接收任务D和接收任务E分别调用ioctl,从订单的数据链表获取对应的报头,通过报头的报文指针分别获取报文,通过报文的实际报文尺寸分别获取报文数据的实际大小;
[0096] h)接收任务D和接收任务E根据消息大小在应用层对应分配内存;
[0097] i)接收任务D和接收任务E分别调用read函数,从订单的数据链表获取对应的报头,通过报头的报文指针分别获取报文,通过报文的实际报文数据域分别获取数据;
[0098] j)将报头从订单的数据链表中删除,将报头插回入到邮箱的空闲报头链表中;
[0099] k)将报文的报文读取计数减1,当报文读取计数为零时将报文插回到邮箱的空闲报文链表中。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈