具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
下面对本发明实施例中出现一些概念进行解释:
“共享资源”是指,操作系统中可能会被多个不同的进程或线程访问的系统资源。
“同步变量”是指,用于对资源进行访问控制的一种同步机制。
与同步变量有关的应用程序接口(application programminginterface,API)通常包括同步变量创建(create)应用程序接口、同步变量持有(lock)应用程序接口、同步变量释放(unlock)应用程序接口以及同步变量删除(destroy)应用程序接口等。上述应用程序接口的功能如下:
同步变量创建应用程序接口:用于创建并初始化一个同步变量。
同步变量持有应用程序接口:根据同步变量算法,持有该同步变量。
同步变量释放应用程序接口:释放一个已经持有的同步变量。
同步变量删除应用程序接口:删除一个已经创建的同步变量。
另外,同步变量可以有多种类型(例如读写锁、互斥锁等),不同类型的同步变量可以有不同的算法以及不同的应用程序接口。
实施例一:
本发明实施例提供了一种同步变量映射方法,参见图3,图3是本发明实施例提供的同步变量映射方法示意图,具体论述如下:
嵌入式系统的虚拟地址空间可以分为用户态(user space)模式或者核心态(kernel space)模式。用户态模式下,使用用户态进程对应的虚拟地址空间,即用户态地址空间304。核心态模式下,使用核心态线程对应的虚拟地址空间,即核心态地址空间305。
在物理地址空间301中,分配第一物理地址空间303,该地址空间用于存储用户态进程或者核心态线程创建的同步变量。该同步变量用于关联用户态进程和核心态线程共享的共享资源。在虚拟地址空间302中,位于左边的304为用户态地址空间,位于右边的305为核心态地址空间。用户态地址空间304以及核心态地址空间305的位置以及大小可以由用户进行定义。例如,虚拟地址空间302的大小为4G,用户态地址空间304占据0至3G;核心态地址空间305占据3G至4G。在用户态地址空间304中分配第一虚拟地址空间306。在核心态地址空间305中,分配第二虚拟地址空间307。
将物理地址空间301中的第一物理地址空间303映射至第一虚拟地址空间306。这样用户态进程可以通过虚拟地址对存储在第一物理地址空间303中的同步变量进行访问。
将物理地址空间301中的第一物理地址空间303映射至第二虚拟地址空间307。这样核心态线程可以通过虚拟地址对存储在第一物理地址空间303中的同步变量进行访问。
核心态线程和用户态进程都可以根据各自的虚拟地址访问第一物理地址空间303中存放的内容。第一物理地址空间303用于存放用户态进程或者核心态线程创建的同步变量,因此,核心态线程和用户态进程都可以根据各自的虚拟地址访问用户态进程或者核心态线程创建的同步变量。也就是说,通过本发明,用户态进程不需要通过系统调用进入核心态,然后再访问用户态进程或者核心态线程创建的同步变量。用户态进程在用户态模式下即可访问存储在第一物理地址空间303中的同步变量。
例如,假设用户态进程A需要访问用户态进程A和核心态线程B共享的某一共享资源。物理地址空间308存储了与该共享资源关联的同步变量,物理地址空间308映射至用户态虚拟地址空间309,物理地址空间308映射至核心态虚拟地址空间310。在这种情况下,用户态进程A可以通过用户态虚拟地址空间309得到存储同步变量的物理地址空间308,从而实现对同步变量的访问。用户态进程A访问同步变量不需要通过系统调用进入核心态。不进行系统调用不仅可以节约嵌入式系统的开销,而且可以保障内核的安全性和稳定性。
参见图4,图4是核心态线程对应的虚拟地址空间的地址映射流程图,具体描述如下:
401、在核心态线程对应的虚拟地址空间中分配第二虚拟地址空间。第二虚拟地址空间用于403的映射。
402、在物理地址空间中分配用于存储同步变量的第一物理地址空间。第一物理地址空间也用于403的映射。
403、第一物理地址空间映射到第二虚拟地址空间。即存储同步变量的物理地址空间映射到401所述的核心态线程对应的虚拟地址空间中的第二虚拟地址空间。
404、返回。即返回到系统初始化主流程。
参见图5,图5是用户态进程对应的虚拟地址空间的地址映射流程图,具体论述如下:
501、用户态进程调用系统调用函数。该系统调用函数是一种特定的系统调用函数,用于完成存储同步变量的第一物理地址空间映射到在用户态进程对应的虚拟地址空间中的第一虚拟地址空间的操作。
502、判断用户态进程对应的虚拟地址空间中是否为同步变量分配了第一虚拟地址空间。如果判断结果为“是”,则执行503。如果判断结果为“否”,则执行504。
关于“用户态进程对应的虚拟地址空间为同步变量分配第一虚拟地址空间”,可以通过下述方式实现:调整用户态进程虚拟地址空间的分布,为用户态进程分配对应的虚拟地址空间,编译新的系统内核,使嵌入式系统使用新内核启动,这样此系统中的用户态进程对应的虚拟地址空间中便分配了对应的虚拟地址空间。
503、第一物理地址空间映射到第一虚拟地址空间。
504、返回。即系统调用返回到用户态进程。
参见图6,图6是用户态进程在核心态模式下创建同步变量的流程图,具体论述如下:
601、系统调用。系统调用使得嵌入式系统进入核心态。
602、调用同步变量创建应用程序接口。
603、在物理地址空间中分配所需的内存空间。在核心态模式下,在402分配的第一物理地址空间中,分配该同步变量所需大小的内存空间。
604、初始化同步变量。对同步变量进行初始化。关于初始化后的同步变量,请参见图9。
605、系统调用返回。即系统调用完毕,返回到用户态进程。
参见图7,图7是用户态进程在用户态模式下创建同步变量的流程图,具体论述如下:
701、调用同步变量创建应用程序接口。
702、在物理地址空间中分配所需的内存空间。在用户态模式下,在402分配的第一物理地址空间中,分配该同步变量所需大小的内存空间。
703、初始化同步变量。对同步变量进行初始化。关于初始化后的同步变量,请参见图9。
704、同步变量创建应用程序接口返回。即同步变量创建应用程序接口调用完毕,返回到用户态进程。
参见图8,图8是用户态进程访问共享资源的流程图。为防止用户态进程和核心态线程共享的共享资源同时被用户态进程和核心态线程访问,用户态进程访问共享资源前,先持有与该共享资源关联的同步变量。具体论述如下:
801、用户态进程需要访问共享资源。
802、调用同步变量持有应用程序接口,得到同步变量持有应用程序接口的返回值。用户态进程调用同步变量持有应用程序接口前,需要创建同步变量。关于如何如何创建同步变量,请参考图6、图7以及相关实施例。
803、根据返回值,判断是否成功持有同步变量。若成功持有该同步变量,则执行804;若未成功持有该同步变量,则执行802,即再次调用同步变量持有应用程序接口,得到同步变量持有应用程序接口的返回值。当然,也可以退出对共享资源的访问,并返回用户态进程。
804、用户态进程访问共享资源。
参见图9,图9是同步变量的格式示意图,具体论述如下:
字段901、同步变量ID。用于标识同步变量,用户态进程或核心态线程可以通过同步变量ID来调用同步变量应用程序接口。
字段902、同步变量状态值。用于标识同步变量是否被某一个用户态进程(或者核心态线程)持有。例如,用1表示被持有;用0表示没有被持有。根据不同的同步变量的算法(例如读写锁、互斥锁等),同步变量状态值可以取不同的数值,以代表该同步变量的各种状态。
字段903、使用计数。使用计数(reference count)用于标识该同步变量被多少个使用者(包括用户态进程以及核心态线程)使用。同步变量被第一个使用者创建时,使用计数为1;同步变量被第二个使用者创建,使用计数值增加1,依此类推。当某一使用者不再使用该同步变量(例如通过调用同步变量删除应用程序接口,解除使用者与共享资源的关联关系),该同步变量的字段903减1。另外,如果同步变量的字段903的值为1,则表明该同步变量仅被一个使用者使用。利用这一特点可用于执行1104。
在本发明实施例的具体实现时,嵌入式系统启动时分配第一物理地址空间。该方案的好处是,不需要另外付出时间和开销分配用于存储同步变量的物理地址空间。
进一步的,第一物理地址空间为连续的地址空间,第一虚拟地址空间为连续的地址空间。该方案的好处是,将物理地址空间向用户态进程对应的虚拟地址空间进行映射时,只需映射一次即可,不需进行多次映射。
进一步的,第一虚拟地址空间位于用户态进程对应的虚拟地址空间的栈顶。该方案的好处是,采用下调用户态进程调用栈顶的方式比较简单,并且对做出预留地址空间的的虚拟地址空间也无需特殊的管理。
进一步的,用户态进程在访问与核心态线程共享的共享资源前,先调用同步变量持有应用程序接口并根据同步变量持有应用程序接口的返回值判断用户态进程是否成功持有所述同步变量。如果用户态进程成功持有同步变量,则对共享资源进行访问;如果用户态进程没有成功持有同步变量,则不对共享资源进行访问。
进一步的,核心态线程在访问与用户态进程共享的共享资源前,先调用同步变量持有应用程序接口并根据同步变量持有应用程序接口的返回值判断核心态线程是否成功持有所述同步变量。如果所述核心态线程成功持有同步变量,则对共享资源进行访问;如果核心态线程没有成功持有同步变量,则不对共享资源进行访问。
进一步的,用户态进程退出时调用用户态进程退出同步变量处理函数,用户态进程退出同步变量处理函数为核心态函数,用户态进程退出同步变量处理函数执行如下操作:调用与同步变量对应的同步变量释放应用程序接口。解决了用户态进程正常退出或异常退出没有对其持有的同步变量做释放处理导致的“死锁”现象。“死锁”现象意味着同步变量所保护的共享资源无法被他人使用。
关于用户态进程退出同步变量处理函数,可通过本发明实施例三提供的用户态进程同步变量释放方法实现。具体可参考本发明实施例三以及图11和图12。
进一步的,用户态进程退出同步变量处理函数还执行如下操作:
调用与同步变量对应的同步变量删除应用程序接口。同步变量删除应用程序接口可以执行如下操作:对同步变量是否被其他使用者(包括其他用户态进程以及核心态线程)创建做出判断(判断同步变量字段903的值是否等于1,具体请参见上文对字段903的描述)。如果同步变量没有被其他使用者创建,则删除同步变量,并释放同步变量占用的内存空间;如果同步变量被其他使用者创建,则将同步变量字段903的值减1。
进一步的,用户态进程退出同步变量处理函数根据存储在核心态的同步变量的标识,确定用户态进程使用的同步变量。其中,同步变量的标识可以是同步变量的ID或者同步变量的地址。
进一步的,同步变量的标识存储在用户态进程的进程描述符(processdescriptor)中(具体请参考图14)。图14是本发明实施例提供的同步变量的标识存储在进程描述符的示意图。进程描述符为核心态为用户态进程创建的数据结构,以记录用户态进程的上下文等信息。本发明实施例利用用户态进程对应的进程描述符,记录用户态进程所使用的同步变量。进程描述符包括Process ID、链表头指针等字段。用户态进程使用的所有同步变量的记录(包括第一同步变量标识、第二同步变量标识等)构成一个链表,链表头指针指向该链表的链表头。该方案可以达到利用现有的进程描述符存储用户态进程使用的同步变量的标识,节约储存空间以及简化相关配置的技术效果。
进一步的,同步变量的标识存储在用户态进程的进程描述符之外的存储空间(具体请参考图13)。图13是本发明实施例提供的同步变量的标识存储在单独分配的存储空间的示意图。本发明实施例在嵌入式系统中单独分配一段存储空间,用于记录用户态进程所使用的同步变量。分配的存储空间存放用户态进程标识、链表头指针等字段。用户态进程使用的所有同步变量的标识(包括第一同步变量标识、第二同步变量标识等)构成一个链表,链表头指针指向该链表的链表头。该方案可以达到不依赖用户态进程在内核中对应的进程描述符,灵活性较高的技术效果。
进一步的,在本发明实施例的具体实现时,调用用户态进程创建的所有同步变量分别对应的同步变量释放应用程序接口。该方案可以达到将该用户态进程创建并持有的同步变量都释放掉。
进一步的,用户态进程退出时调用用户态进程退出同步变量处理函数,用户态进程退出同步变量处理函数为核心态函数,用户态进程退出同步变量处理函数执行如下操作:调用与同步变量对应的同步变量删除应用程序接口。解决了用户态进程正常退出或异常退出,可能出现的问题:
(1)没有删除同步变量(在该同步变量没有被核心态线程或者其他用户态进程创建的情况下)。没有删除同步变量意味着同步变量一直存在于系统中。
(2)没有将使用计数的值减1(在该同步变量被核心态线程或者其他用户态进程创建的情况下)。没有将使用计数的值减1意味着创建该同步变量的核心态线程或者其他用户态进程退出时无法删除该同步变量并释放同步变量占据的存储空间。
关于用户态进程退出同步变量处理函数,可通过本发明实施例四提供的用户态进程同步变量删除方法实现。具体请参考本发明实施例四以及图15。
进一步的,调用用户态进程创建的所有同步变量分别对应的同步变量释放应用程序接口。
实施例二:
本发明实施例还提供了一种同步变量映射装置,本实施例可以通过实施例一提供的同步变量映射方法实现。本发明实施例提供的同步变量映射装置可以实现用户态进程不需要进行系统调用即可以访问同步变量,以节约嵌入式系统的开销,同时保障内核的安全性和稳定性。参见图10,图10是本发明实施例提供的同步变量映射装置示意图,该同步变量映射装置包括:
1001:第一物理地址空间分配单元。用于在嵌入式系统的物理地址空间中分配用于存储同步变量的第一物理地址空间;
1002:第一虚拟地址空间分配单元。用于在嵌入式系统的用户态进程对应的虚拟地址空间中分配第一虚拟地址空间;
1003:第二虚拟地址空间分配单元。用于在嵌入式系统的核心态线程对应的虚拟地址空间中分配第二虚拟地址空间;
1004:第一映射单元。用于将第一物理地址空间映射至第一虚拟地址空间;
1005:第二映射单元。用于将第一物理地址空间映射至第二虚拟地址空间。
可见,通过本发明实施例提供的同步变量映射装置,可以实现用户态进程不需要进行系统调用即可以访问同步变量,以节约嵌入式系统的开销,同时保障内核的安全性和稳定性。
实施例三:
本发明实施例提供一种用户态进程同步变量释放方法,解决了用户态进程正常退出或异常退出没有对其持有的同步变量做释放处理导致的“死锁”现象。“死锁”现象意味着同步变量所保护的共享资源无法被他人使用。本发明实施例提供了两种同步变量释放方法,第一种是用户态进程退出后即调用的用户态进程退出同步变量处理函数,具体请参见图11;第二种是用户态进程退出核心态处理函数调用用户态进程退出同步变量处理函数,具体请参见图12。
参见图11,图11是本发明实施例提供的第一种同步变量释放方法流程图,具体包括:
1101:用户态进程退出。用户态进程退出可以是正常退出也可以是异常退出。用户态进程退出后,直接执行1102,即调用用户态进程退出同步变量处理函数。
1102:调用用户态进程退出同步变量处理函数。该函数将调用用户态进程对应的同步变量释放应用程序接口。
1103:调用同步变量释放应用程序接口。同步变量释放应用程序接口可以执行如下操作:对同步变量是否被本用户态进程持有做出判断(具体根据用户态进程同步变量的算法);如果用户态进程持有该同步变量,则对同步变量执行释放操作。
1104:返回。即返回到用户态进程退出核心态处理函数。
参见图12,图12是本发明实施例提供的第二种同步变量释放方法流程图,具体包括:
1201:用户态进程退出。用户态进程退出可以是正常退出也可以是异常退出。用户态进程退出后,执行1202,即调用用户态进程退出核心态处理函数。
1202:调用用户态进程退出核心态处理函数。该函数将执行1203,即调用用户态进程退出同步变量处理函数。
1203:调用用户态进程退出同步变量处理函数。类似于1102,这里不再赘述。
1204:调用同步变量释放应用程序接口。类似于1103,这里不再赘述。
1205:返回。即用户态进程退出同步变量处理函数返回到用户态进程退出核心态处理函数。
进一步的,用户态进程退出同步变量处理函数还执行如下操作:
调用与同步变量对应的同步变量删除应用程序接口。同步变量删除应用程序接口可以执行如下操作:对同步变量是否被其他使用者(包括其他用户态进程以及核心态线程)创建做出判断(判断同步变量字段903的值是否等于1,具体请参见上文对字段903的描述)。如果同步变量没有被其他使用者创建,则删除同步变量,并释放同步变量占用的内存空间;如果同步变量被其他使用者创建,则将同步变量字段903的值减1。
进一步的,用户态进程退出同步变量处理函数根据存储在核心态的同步变量的标识,确定用户态进程使用的同步变量。其中,同步变量的标识可以是同步变量的ID或者同步变量的地址。
进一步的,同步变量的标识存储在用户态进程的进程描述符(processdescriptor)中(具体请参考图14)。图14是本发明实施例提供的同步变量的标识存储在进程描述符的示意图。进程描述符为核心态为用户态进程创建的数据结构,以记录用户态进程的上下文等信息。本发明实施例利用用户态进程对应的进程描述符,记录用户态进程所使用的同步变量。进程描述符包括Process ID、链表头指针等字段。用户态进程使用的所有同步变量的记录(包括第一同步变量标识、第二同步变量标识等)构成一个链表,链表头指针指向该链表的链表头。该方案可以达到利用现有的进程描述符存储用户态进程使用的同步变量的标识,节约储存空间以及简化相关配置的技术效果。
进一步的,同步变量的标识存储在用户态进程的进程描述符之外的存储空间(具体请参考图13)。图13是本发明实施例提供的同步变量的标识存储在单独分配的存储空间的示意图。本发明实施例在嵌入式系统中单独分配一段存储空间,用于记录用户态进程所使用的同步变量。分配的存储空间存放用户态进程标识、链表头指针等字段。用户态进程使用的所有同步变量的标识(包括第一同步变量标识、第二同步变量标识等)构成一个链表,链表头指针指向该链表的链表头。该方案可以达到不依赖用户态进程在内核中对应的进程描述符,灵活性较高的技术效果。
进一步的,在本发明实施例的具体实现时,调用用户态进程创建的所有同步变量分别对应的同步变量释放应用程序接口。该方案可以达到将该用户态进程创建并持有的同步变量都释放掉。
可见,通过本发明实施例提供的同步变量释放方法,可以解决用户态进程正常退出或异常退出没有对其持有的同步变量做释放处理导致的“死锁”现象。“死锁”现象意味着同步变量所保护的共享资源无法被他人使用。
实施例四:
本发明实施例提供一种用户态进程同步变量删除方法,解决了用户态进程正常退出或异常退出有可能没有对其所创建的同步变量进行删除处理的问题。没有对其所创建的同步变量进行删除将使得该用户态进程使用的同步变量一直存在于系统中。
参见图15,图15是本发明实施例提供的一种同步变量删除方法流程图,具体包括:
1501:用户态进程退出。用户态进程退出可以是正常退出也可以是异常退出。用户态进程退出后,执行1502,即调用用户态进程退出同步变量处理函数。
1502:调用用户态进程退出同步变量处理函数。该函数将调用同步变量删除应用程序接口。
1503:调用同步变量删除应用程序接口。同步变量删除应用程序接口可以执行如下操作:对同步变量是否被其他使用者(包括其他用户态进程以及核心态线程)创建做出判断(判断同步变量字段903的值是否等于1,具体请参见上文对字段903的描述)。如果同步变量没有被其他使用者创建,则删除同步变量,并释放同步变量占用的内存空间;如果同步变量被其他使用者创建,则将同步变量字段903的值减1。
1504:返回。
进一步的,调用用户态进程创建的所有同步变量分别对应的同步变量释放应用程序接口。
可见,通过本发明实施例提供的同步变量删除方法,解决了用户态进程正常退出或异常退出,可能出现的问题:
(1)没有删除同步变量(在该同步变量没有被核心态线程或者其他用户态进程创建的情况下)。没有删除同步变量意味着同步变量一直存在于系统中。
(2)没有将使用计数的值减1(在该同步变量被核心态线程或者其他用户态进程创建的情况下)。没有将使用计数的值减1意味着创建该同步变量的核心态线程或者其他用户态进程退出时无法删除该同步变量并释放同步变量占据的存储空间。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。