一种利用事件总线技术的微内核架构的设计方法与流程

文档序号:18331240发布日期:2019-08-03 12:15阅读:454来源:国知局
一种利用事件总线技术的微内核架构的设计方法与流程

本发明涉及微内核操作系统技术领域,具体涉及一种利用事件总线技术的微内核架构的设计方法。



背景技术:

嵌入式设备的普及对操作系统的可扩展性、可移植性、兼容性提出日益增长的要求,因此,仅提供操作系统核心功能的内核精简版本,即微内核操作系统变得越来越流行,如nova,zephyr等开源系统。微内核操作系统的主要特点是在核心中仅提供最基本的功能,而将传统宏内核操作系统核心中的大部分功能放到核心以外。微内核操作系统相比于宏内核操作系统虽然性能有一定下降,但是由于微内核的大部分系统功能置于内核以外,使得内核的复杂度大为降低,内核代码量大为缩小。所以微内核的优点是显而易见的,微内核支持模块化,扩展更加容易;微内核由于代码量小,更易于维护和更新;微内核中各模块的耦合性大为降低,一个模块出现问题不会导致整个系统的崩溃。

微内核操作系统把大量的系统服务置于微内核之外,不同于宏内核操作系统的直接函数调用,它的用户程序和系统服务、系统服务之间都是采取ipc(inter-processcommunication,进程间通信机制)进行通信。这样在微内核结构的操作系统中就存在着大量的ipc通信。因此,ipc通信性能是微内核操作系统的重要性能指标之一。

然而目前微内核操作系统中采用的传统ipc通信机制存在一些缺陷:传统ipc中消息(事件)需要进行复制,会给操作系统带来额外的系统开销;消息(事件)在发送完成前后需要进行编解码操作,与此同时会丧失类型安全性,而且还会带来额外的复杂性;事件句柄的调用只带有事件(消息)信息,需要额外分配堆对象来在句柄间共享数据,增加了内存管理的负担;事件驱动往往是一个单线程循环,不易充分利用多(核)cpu资源。

基于上述问题本发明采用事件总线的机制来发送事件,同时会采用基于事件驱动的服务接口形式,将服务以事件的方式进行传递,以零拷贝方式实现了新颖高效通用的ipc机制,并且增加了系统的安全性。



技术实现要素:

本发明为了克服现有技术中的不足,提出了一种利用事件总线技术的微内核架构的设计方法,采用事件总线的机制来发送事件,同时会采用基于事件驱动的服务接口形式,将服务以事件的方式进行传递,以零拷贝方式实现了新颖高效通用的ipc机制,并增加了系统的安全性。

本发明提出的利用事件总线技术的微内核架构的设计方法,包括以下步骤:

步骤一:将应用程序执行时需要访问的系统资源和硬件接口、输入输出接口、第三方或自定义功能接口等统一抽象为事件驱动的服务;应用程序、系统或第三方驱动和服务等功能模块运行在隔离的用户态地址空间中,通过事件总线进行收发事件或通信;

步骤二:系统服务调用和结果返回通过可完全定制化的事件(或消息)进行,系统提供事件的转发和生命周期等内核态功能。在应用程序调用到返回结果数据的过程中,事件数据不存在拷贝动作;

步骤三:在服务端,通过内核注册对应服务接口所需数据类型的事件的事件源,并通过同步原语等待属于此类事件源的事件的到来;

步骤四:客户端或应用程序通过调用服务提供的代理接口,或者内核提供的ipc接口,生成对应服务接口事件源的事件并发送,同时等待结果事件的到来;

步骤五:服务端一旦接收到事件总线发送过来的事件,则继续执行并处理等待事件接口返回的事件数据,执行完成后,通过ipc原语返回调用结果事件到事件总线,再由事件总线通知客户端此次服务完成,并将结果事件返回给应用程序。

本发明提出的利用事件总线技术的微内核架构的设计方法中,所述步骤二中,系统服务调用和结果返回通过可完全定制化的事件(或消息)进行包括以下步骤:

步骤a1:在微内核架构中定义了事件总线,事件总线作为应用程序和服务收发事件的代理运行在应用程序和ipc等内核功能接口之间;

步骤a2:在所述微内核初始化后直接开启事件总线;

步骤a3:当事件发生时,事件数据对象被发送到事件总线上并缓存起来,由系统或定制化的事件总线例程来进行分发;

步骤a4:所述事件总线存储事件数据和保存其他需要通知到进程的数据信息;

步骤a5:所述事件总线在运行时,通过顺序或其他定制化策略遍历总线上的事件和数据来分发这些事件或数据给相应的应用程序或服务进程。

本发明提出的利用事件总线技术的微内核架构的设计方法中,所述通知到进程的数据信息包括事件的超时信息。

本发明提出的利用事件总线技术的微内核架构的设计方法中,所述步骤a3中,事件由定制化的事件总线例程来进行分发包括以下步骤:

步骤b1:定制化的事件总线例程包括缺省方式和用户自定义方式;

步骤b2:缺省方式为顺序分发事件,即一条事件总线根据事件到来的顺序进行事件的分发;

步骤b3:用户自定义方式可以开启两条或两条以上的事件总线例程进行事件的分发。

本发明提出的利用事件总线技术的微内核架构的设计方法中,所述步骤a5中,通过遍历总线上的事件和数据来分发这些事件或数据给相应的应用程序或服务进程包括以下步骤:

步骤c1:对事件进行分发分为同步和异步,缺省为同步分发;

步骤c2:所有收发事件是逐一进行的,即这些操作是同步进行;

步骤c3:而异步分发是进行事件的分发后,不需要等待结果事件的返回就可以继续进行下一个事件发送。

本发明提出的利用事件总线技术的微内核架构的设计方法中,所述步骤三中,通过内核注册对应服务接口所需数据类型的事件的事件源包括以下步骤:

步骤d1:在服务端调用创建事件源的接口进行事件源的创建;

步骤d2:事件源中包含一个特定的事件类型,所述特定的事件类型为服务接口所需数据类型;

步骤d3:事件源中进一步包括事件的优先级、指定的接收者以及总线。

本发明提出的利用事件总线技术的微内核架构的设计方法中,所述步骤三中,通过同步原语等待属于此类事件源的事件的到来包括以下步骤:

步骤e1:通过同步原语阻塞服务端程序,跳转到事件总线上;

步骤e2:在事件总线上对相应的事件或数据进行转发,服务端此时正在等待属于此类事件源的事件的到来。

本发明提出的利用事件总线技术的微内核架构的设计方法中,所述步骤四中,生成对应服务接口事件源的事件并发送且等待结果事件的到来包括以下步骤:

步骤f1:在客户端通过创建事件的接口生成对应服务接口事件源的事件;

步骤f2:将生成的事件插入到事件总线的缓冲队列上,由事件总线进行事件的分发;

步骤f3:事件插入到总线后,客户端应用程序将被阻塞,等待结果事件的返回并恢复运行。

本发明提出的利用事件总线技术的微内核架构的设计方法中,所述步骤五中,服务端处理接收到的事件以及将结果事件返回给应用程序包括以下步骤:

步骤g1:接收到事件总线发送来的事件,会处理等待事件接口返回的事件数据;

步骤g2:处理完成后,通过ipc原语将结果事件传递给事件总线;

步骤g3:事件总线通知客户端此次服务完成并将结果事件返回给客户端。

本发明利用事件总线技术的微内核架构的设计方法,在客户端调用系统服务,从而直接陷入内核态,通过定义好的事件源产生系统服务对应的事件,再通过进程间通信原语的发送原语将事件插入到发送队列。此时事件总线通过分发操作遍历发送队列,查看是否有事件插入到队列中,若有事件插入,则将事件分发给服务端;若没有事件插入,则挂起线程,等待事件插入。而在服务端,需要注册该事件并通过同步原语进行等待,若事件从事件总线上分发过来,则立马进行该事件对应的一系列动作(内核服务),执行完成后通过发送原语通知客户端此次服务完成,继续其他服务的调用。

本发明通过将事件总线技术应用于微内核框架,获得了以下技术效果:

通过将通信数据抽象为事件并通过事件总线将事件分发给接收者,达到了增加数据交换的灵活性;

通过将通信数据和系统调用以及返回值抽象成事件,并且通过事件总线进行收发,来完成传统中的通讯或者调用过程,达到了增加便利性;

通过将数据和系统调用抽象成事件,在事件接收的过程中不需要对消息进行编解码,达到了增加类型安全性,

通过将任意类型的通信数据抽象为统一的事件的基础上,以零拷贝的方式实现了新颖高效通用的ipc机制,减少传统微内核框架中的ipc通信所带来的额外开销,大大增加了事件的通用性。

附图说明

图1表示本发明利用事件总线技术的微内核架构的设计方法的架构示意图。

图2表示本发明利用事件总线技术的微内核架构的设计方法的方法流程图。

图3表示本发明应用程序调用通信原语与事件总线的交互示意图。

具体实施方式

结合以下具体实施例和附图,对本发明作进一步的详细说明。实施本发明的过程、条件、实验方法等,除以下专门提及的内容之外,均为本领域的普遍知识和公知常识,本发明没有特别限制内容。

本发明利用事件总线技术的微内核架构的设计方法包括以下步骤:

步骤一:将应用程序执行时需要访问的系统资源和硬件接口、输入输出接口、第三方或自定义功能接口等统一抽象为事件驱动的服务;应用程序、系统或第三方驱动和服务等功能模块运行在隔离的用户态地址空间中,通过事件总线进行收发事件或通信;

步骤二:系统服务调用和结果返回通过可完全定制化的事件(或消息)进行,系统提供事件的转发和生命周期等内核态功能。在应用程序调用到返回结果数据的过程中,事件数据不存在拷贝动作;

步骤三:在服务端,通过内核注册对应服务接口所需数据类型的事件的事件源,并通过同步原语等待属于此类事件源的事件的到来;

步骤四:客户端或应用程序通过调用服务提供的代理接口,或者内核提供的ipc接口,生成对应服务接口事件源的事件并发送,同时等待结果事件的到来;

步骤五:服务端一旦接收到事件总线发送过来的事件,则继续执行并处理等待事件接口返回的事件数据,执行完成后,通过ipc原语返回调用结果事件到事件总线,再由事件总线通知客户端此次服务完成,并将结果事件返回给应用程序。

本发明提出的利用事件总线技术的微内核架构的设计方法中,所述步骤二中,系统服务调用和结果返回通过可完全定制化的事件(或消息)进行包括以下步骤:

步骤a1:在微内核架构中定义了事件总线,事件总线作为应用程序和服务收发事件的代理运行在应用程序和ipc等内核功能接口之间;

步骤a2:在所述微内核初始化后直接开启事件总线;

步骤a3:当事件发生时,事件数据对象被发送到事件总线上并缓存起来,由系统或定制化的事件总线例程来进行分发;

步骤a4:所述事件总线存储事件数据和保存其他需要通知到进程的数据信息;

步骤a5:所述事件总线在运行时,通过顺序或其他定制化策略遍历总线上的事件和数据来分发这些事件或数据给相应的应用程序或服务进程。

本发明提出的利用事件总线技术的微内核架构的设计方法中,所述通知到进程的数据信息包括事件的超时信息。

本发明提出的利用事件总线技术的微内核架构的设计方法中,所述步骤a3中,事件由定制化的事件总线例程来进行分发包括以下步骤:

步骤b1:定制化的事件总线例程包括缺省方式和用户自定义方式;

步骤b2:缺省方式为顺序分发事件,即一条事件总线根据事件到来的顺序进行事件的分发;

步骤b3:用户自定义方式可以开启两条或两条以上的事件总线例程进行事件的分发。

本发明提出的利用事件总线技术的微内核架构的设计方法中,所述步骤a5中,通过遍历总线上的事件和数据来分发这些事件或数据给相应的应用程序或服务进程包括以下步骤:

步骤c1:对事件进行分发分为同步和异步,缺省为同步分发;

步骤c2:所有收发事件是逐一进行的,即这些操作是同步进行;

步骤c3:而异步分发是进行事件的分发后,不需要等待结果事件的返回就可以继续进行下一个事件发送。

本发明提出的利用事件总线技术的微内核架构的设计方法中,所述步骤三中,通过内核注册对应服务接口所需数据类型的事件的事件源包括以下步骤:

步骤d1:在服务端调用创建事件源的接口进行事件源的创建;

步骤d2:事件源中包含一个特定的事件类型,所述特定的事件类型为服务接口所需数据类型;

步骤d3:事件源中进一步包括事件的优先级、指定的接收者以及总线。

本发明提出的利用事件总线技术的微内核架构的设计方法中,所述步骤三中,通过同步原语等待属于此类事件源的事件的到来包括以下步骤:

步骤e1:通过同步原语阻塞服务端程序,跳转到事件总线上;

步骤e2:在事件总线上对相应的事件或数据进行转发,服务端此时正在等待属于此类事件源的事件的到来。

本发明提出的利用事件总线技术的微内核架构的设计方法中,所述步骤四中,生成对应服务接口事件源的事件并发送且等待结果事件的到来包括以下步骤:

步骤f1:在客户端通过创建事件的接口生成对应服务接口事件源的事件;

步骤f2:将生成的事件插入到事件总线的缓冲队列上,由事件总线进行事件的分发;

步骤f3:事件插入到总线后,客户端应用程序将被阻塞,等待结果事件的返回并恢复运行。

本发明提出的利用事件总线技术的微内核架构的设计方法中,所述步骤五中,服务端处理接收到的事件以及将结果事件返回给应用程序包括以下步骤:

步骤g1:接收到事件总线发送来的事件,会处理等待事件接口返回的事件数据;

步骤g2:处理完成后,通过ipc原语将结果事件传递给事件总线;

步骤g3:事件总线通知客户端此次服务完成并将结果事件返回给客户端。

本发明中,基于事件驱动的微内核操作系统进程间通讯机制主要通过定义事件总线、事件队列以及发送和同步原语进行事件的发送和接收,并进行相应服务的操作,其中在事件总线分发事件和进行等待事件时还会进行上下文的跳转,用此来模仿协程的运行。首先通过微内核操作系统初始化系统时,将事件总线的线程进行创建并运行,同时还需要定义事件队列进行事件的存放,而事件队列的类型可以根据事件是否有优先级来划分,若事件本身具有优先级,则可以考虑最小堆的数据机构作为事件队列的选择;若事件没有优先级,则用普通的先进先出的队列即可。此时事件总线的线程可以通过分发操作监控事件队列上是否有事件的插入,若有,则分发到服务端的事件等待处,服务端则进行事件对应的系统服务,服务完成后返回信息通知客户端继续执行。

实施例

如图1所示,是本发明的利用事件总线的微内核设计的架构示意图,本发明包括以下步骤:

步骤一:查看微内核操作系统的初始化代码,弄清楚线程建立、标记为就绪状态以及加入就绪队列中等待运行,以此为参照创建事件总线的线程并启动线程,为步骤二的事件插入做准备。

步骤二:根据步骤一中创建好的事件总线的线程,再新定义事件队列以及其对应的插入、删除、遍历和获取头节点的操作来实现事件的插入,同时在定义队列节点时,节点结构体中应包含事件结构体指针。如图3所示,还应需要定义服务调用接口(servicecallstub)和事件驱动接口(signaldriveninterface);同时,每个事件对应的一系列动作应该就是以前的系统服务;系统服务调用被转换成事件,然后通过事件驱动接口调用服务。

如图2所示,是表示本发明利用事件总线技术的微内核架构的设计方法的方法流程图,流程图显示了客户端发送请求事件、事件总线接收请求事件和接收请求结果以及返回请求结果。

在完成定义事件队列的创建后,还需要对事件源进行定义,事件源的结构体中还应包括一个等待队列或者等待者。结构体中的等待队列是用存储即将到来的事件的上下文,若有多个事件到来可以按照到来顺序插入队列中,这样就可以将事件与当前的上下文进行绑定。

上述所定义的事件源和事件以及创建的事件队列一起构成了事件插入的基础,在发送原语中,首先获得事件队列的头节点,再根据头节点将事件插入到队列中,之后再通过消息队列的方式将事件插入成功的消息传送给事件总线,事件总线接收到后执行对应操作。

步骤三:根据步骤二中通过消息队列发送过来的插入成功的消息,事件总线会调用分发操作遍历事件队列,将事件分发给服务端,若没时间消息队列的信息则继续等待事件的插入。具体步骤为,事先设置一个消息标志,若消息队列发过来的数据与消息标志相等,则进行事件的分发。进行分发时,首先会进行事件队列的遍历,直到下一个节点为空为止;在循环中,先拿到时间的指针,接着进行当前上下文的跳转,跳至服务端的事件等待处;等同步原语执行完成后,会再次跳转到分发操作中,将分发给服务端的事件从事件队列中删除。

步骤四:通过步骤三的分发操作跳至服务端后,通过同步原语返回值,服务端会进行一些列对应的操作,如执行系统服务。在等待事件之前,应先将事件与上下文进行绑定,绑定后将其放入事件源的等待队列中。服务端进行同步原语操作时,应先在事件源中的存储上下文中的结构体中设置一个跳转标志,若标志的值相等,则跳转到事件总线等待事件到来并阻塞线程;若标志的值不相等,则说明是从事件总线出跳转回来的,此时已经拿到事件的指针并返回。

步骤五:通过步骤四返回的事件指针进行事件对应的动作,若是系统服务,则执行该系统服务,并将返回值添加到该事件指针中。进行事件对应的动作的步骤如下:从事件总线接收的事件与该事件所要做的动作(若是系统服务,就是该系统服务的功能),相对应,那么该实际事件的数据结构应该包括调用该系统服务的服务名,以及此服务相应的的参数类型,以及返回类型,这里通过一个结构体来定义。

本具体实例以某开源微内核操作系统为例,对其传统的服务调用进行替换,并设计服务调用接口和事件驱动接口,则系统服务调用被转换成事件,然后通过事件驱动接口调用服务。设计好事件驱动接口后,通过使用开源微内核操作系统自带的队列作为事件队列,增加了事件队列的可用性。该开源微内核操作系统具有一些基本的内核服务系统调用,为该微内核基本的系统调用进行服务接口和事件接口的设计,相对应,那么该实际事件的数据结构应该包括调用该系统服务的服务名,以及此服务相应的的参数类型,以及返回类型,这里通过一个事件结构体来定义,事件对应的服务完成后的返回值应添加到该事件指针中。

本具体事例中,运用本发明的基于事件驱动的微内核操作系统进程间通讯机制对某开源微内核操作系统的传统服务调用方法进行替换,变为通过事件总线的方式进行服务的调用,具体步骤如下:

步骤一:微内核系统初始化时,创建三个线程分别作为事件总线、客户端和服务端的线程,在开始时进行事件队列的初始化,并从事件总线的线程进入到客户端线程。

步骤二:在客户端线程中对事件源和事件分配内存,再对事件中的系统服务的服务名,以及此服务相应的的参数类型进行赋值,之后便通过ipc的发送原语将事件插入到步骤一中初始化好的队列中。

步骤三:在事件总线的线程中时刻对事件队列进行监测,检查到有事件插入,便对队列进行遍历以及进行分发,分发时对当前上下文进行保存且取得事件的指针,并进行上下文跳转至服务端的事件等待处。

步骤四:在服务端中首先会进行同步操作,阻塞线程进行等待事件的到来,根据步骤三,服务端线程从阻塞变为运行态,此时可以通过同步原语将分发到服务端的事件的指针进行返回。

步骤五:根据步骤四中得到发送来的事件的指针,可以得知该事件所对应的系统服务的服务名,以及此服务相应的的参数类型;在系统服务态进行系统服务的运行,再将其返回值添加到该事件的指针中,并将其发送给客户端,客户端的程序继续进行后续操作。

本发明公开的一种利用事件总线技术的微内核架构的设计方法,首先上层应用程序和其调用的系统服务作为受限用户态进程运行,通过事件总线进行通信或交换数据;在微内核架构中定义事件总线以及相应的ipc通信原语,用户态进程在调用ipc原语后系统陷入到内核态,实现用户态进程间的数据转发;在ipc层,事件被发送到相应的事件总线上,由事件总线调度分发给相应的用户态进程;根据调用者的选择使用服务调用接口还是事件驱动接口,选择由客户端程序或服务端程序来调用ipc通信原语生成事件并发送。本发明通过引入事件总线,在把任意类型的通信数据对象抽象为统一“事件”的基础上,以零拷贝方式实现了新颖高效通用的ipc机制,解决了微内核操作系统设计中面临的关键性能难题,简化了微内核系统的设计和实现。

本发明的保护内容不局限于以上实施例。在不背离发明构思的精神和范围下,本领域技术人员能够想到的变化和优点都被包括在本发明中,并且以所附的权利要求书为保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1