本发明涉及计算机技术领域,尤其涉及一种执行临界区操作的方法及装置。
背景技术:
无内部互锁流水级的微处理器(microprocessorwithoutinterlockedpipedstages,mips)是一种精简指令集(reducedinstructionsetcomputer,risc)体系中央处理器(centralprocessingunit,cpu)。其中,mips逐渐发展为多核处理器。
多核mips的多个物理核之间通常通过使用共享内存的方式进行通信。其中,不同的物理核虽然可以同时读取同一块内存中的同一个数据,同一块内存中的同一个数据称为共享数据;但是,当不同的物理核同时对共享数据进行写操作时,会同时产生多个对该共享数据执行写操作的指令;此时,cpu无法保证这些指令的时序。如此,在执行上述多个指令后,共享数据则会被破坏,并影响临界区操作的安全性。临界区操作是指一个物理核对共享数据进行的写操作。
现有技术可以采用以下方式避免共享数据被破坏,保证临界区操作的安全性。具体的,当前物理核在对共享数据执行临界区操作前,尝试获取针对该共享数据的锁;若获取到锁,则直接对该共享数据执行临界区操作;若未获取到锁,则表示其他物理核已获得该锁并正在对该共享数据执行临界区操作,当前物理核则开始等待直至其他物理核释放该锁。其中,使用上述锁机制虽然可以保证临界区操作的安全性;但是,额外加入锁机制会增加数据处理的复杂性,增加系统性能开销,造成对内存资源的冗余占用。
技术实现要素:
本发明的实施例提供一种执行临界区操作的方法及装置,可以在保证临界区操作的安全性,保护共享数据不被破坏的同时,简化数据处理过程,减少系统性能开销,减少对内存资源的冗余占用。
为达到上述目的,本发明的实施例采用如下技术方案:
第一方面,本申请实施例提供一种执行临界区操作的方法,可以应用于无内部互锁流水级的微处理器mips平台,具体方法包括:读取第一内存中用于存储地址的至少一个指针结构体,该第一内存为存储共享数据的内存,该至少一个指针结构体在上述第一内存中的存储位置是预设的;如果该第一内存中的至少一个指针结构体中的每个指针结构体中预设比特位的值均为第一值,则采用链接加载指令和条件存储指令,尝试将第一内存中的至少一个指针结构体中的第一指针结构体中预设比特位的值修改为第二值;其中,第一值指示共享数据当前未被执行临界区操作,第二值指示共享数据当前正被执行临界区操作;在成功将该第一指针结构体中预设比特位的值修改为第二值后,对该共享数据执行临界区操作。
本申请实施例中,由于mips平台中内存中的指针结构体中预设比特位的值一般而言是固定的;因此,可以通过第一内存中的第一指针结构体中预设比特位的值的变化来指示共享数据当前是否被执行临界区操作。并且,通过mips平台上的通用链接加载指令和条件存储指令,可以实现对一些简单的操作的原子性,即可以保证只能有一个物理核对该第一内存中的第一指针结构体进行修改;如此,在将第一内存中的第一指针结构体中预设比特位的值修改为第二值后,该第一指针结构体便可以指示共享数据当前正被执行临界区操作,具体为第二值指示共享数据当前正被执行临界区操作,其他物理核便不能操作该共享数据,如此便可以保证临界区操作的安全性,以保护共享数据不被破坏。
综上所述,本申请实施例提供的执行临界区操作的方法,可以利用mips平台中的指针结构体,以及链接加载指令和条件存储指令的特性,实现对临界区操作的安全性的保护。相较于现有技术的方案,不需要增加额外的锁机制,如此便可以在保证临界区操作的安全性,保护共享数据不被破坏的同时,简化数据处理过程,减少系统性能开销,减少对内存资源的冗余占用。
示例性的,第一值指示共享数据当前未被执行临界区操作,具体可以为:第一指针结构体中预设比特位的值未被修改。第二值指示共享数据当前正被执行临界区操作,具体可以为:第一指针结构体中预设比特位的值已被修改。
其中,mips平台中内存中用于存储地址的指针结构体中预设比特位的值在正常情况下为固定值。
举例来说,mips平台中内存中用于存储地址的指针结构体转换成2进制后,其低2比特位的值为00。即上述指针结构体的第0比特(比特)位和第1比特位的值均为0。即正常情况下上述指针结构体的低2比特位的值是固定不变的,具体为00。
本申请实施例这里以指针结构体中预设比特位为该指针结构体的低2比特位为例,对第一值和第二值进行说明:
当指针结构体中预设比特位为该指针结构体的低2比特位时,第一值为00,第二值可以为01、10或11中任一个。
可选的,本申请实施例中可以采用汇编语言实现上述执行临界区操作的方法。
其中,“采用链接加载指令和条件存储指令,尝试将所述第一内存中的至少一个指针结构体中的第一指针结构体中预设比特位的值修改为第二值”具体可以包括:采用链接加载指令将该第一内存中的第一指针结构体加载至第一通用寄存器;将该第一通用寄存器中的第一指针结构体中预设比特位的值修改为第二值;采用条件存储指令,尝试将该第一通用寄存器中的第一指针结构体写入上述第一内存。
需要强调的是,对于此处写入第一内存的第一指针结构体来说,该第一指针结构体中预设比特位的值为第二值,该第二值指示该共享数据当前未被执行临界区操作。
其中,上述步骤“成功将第一指针结构体中预设比特位的值修改为第二值”,具体为:成功将第一通用寄存器中的第一指针结构体写入第一内存。
本申请实施例中,当第一内存中的至少一个指针结构体中的每个指针结构体中预设比特位的值均为第一值时,则表示当前没有其他物理核对第一内存中的第一指针结构体进行操作,也表示当前没有其他物理核对共享数据进行操作;此时,则可以采用链接加载指令和条件存储指令,通过第一通用寄存器,尝试将第一内存中的第一指针结构体中预设比特位的值修改为第二值。在成功将第一通用寄存器中的第一指针结构体写入第一内存,即成功将第一内存中的第一指针结构体中预设比特位的值修改为第二值后,第一内存中的第一指针结构体便可以向其他物理核指示:该共享数据当前正在被执行临界区操作;此时,其他物理核便不能再对第一内存中的第一指针结构体进行操作,如此便可以保证临界区操作的安全性,以保护共享数据不被破坏。
可以想到的是,在完成对共享数据的临界区操作后,由于第一内存中的第一指针结构体中预设比特位的值仍为第二值,即该第一指针结构体仍然指示该共享数据当前正在被执行临界区操作,因此其他物理核则不能对该共享数据进行操作。
可选的,为了在完成对共享数据的临界区操作后,使得其他物理核可以对该共享数据执行其临界区操作,本申请实施例的方法还可以包括:在完成对共享数据的临界区操作后,将该第一内存中的第一指针结构体中预设比特位的值修改为第一值。
可选的,与上述描述中“采用链接加载指令和条件存储指令,尝试将所述第一内存中的至少一个指针结构体中的第一指针结构体中预设比特位的值修改为第二值”的方法类似,本申请实施例这里也可以通过汇编语言的方式,在完成对该共享数据的临界区操作后,实现“将所述第一内存中的第一指针结构体中预设比特位的值修改为所述第一值”的操作。
具体的方法可以包括:采用链接加载指令将该第一内存中第一指针结构体加载至第二通用寄存器;将该第二通用寄存器中的第一指针结构体中预设比特位的值修改为第一值;采用条件存储指令,将该第二通用寄存器中的第一指针结构体写入第一内存。
需要强调的是,对于此处写入第一内存的第一指针结构体来说,该第一指针结构体中预设比特位的值为第一值,该第一值指示该共享数据当前未被执行临界区操作。
其中,这里的第二通用寄存器与上述第一通用寄存器可以为不同的通用寄存器,也可以为同一通用寄存器。
进一步的,第一内存中的至少一个指针结构体中的每个指针结构体中预设比特位的值可以均为第一值;当然,也可能会存在该至少一个指针结构体中的一个指针结构体中预设比特位的值被修改为第二值的情况。对此,本申请实施例的方法还可以包括:如果至少一个指针结构体中的任一指针结构体中预设比特位的值为第二值,则返回执行读取第一内存中用于存储地址的至少一个的指针结构体的步骤,直至读取到该至少一个指针结构体中的每个指针结构体中预设比特位的值均为第一值。
其中,当第一内存中的至少一个指针结构体中的每个指针结构体中预设比特位的值均为第一值时,则表示该至少一个指针结构体中的每个指针结构体中预设比特位的值均未被修改,共享数据当前未被执行临界区操作;而当至少一个指针结构体中的任一指针结构体中预设比特位的值为第二值时,则表示共享数据当前正被执行临界区操作,则表示多核mips中的一个物理核正在对该共享数据执行临界区操作。
此时,为了保证上述物理核执行其临界区操作的安全性,以保护共享数据不被破坏,则需要等到上述物理核执行完该物理核的临界区操作,才能够执行“采用链接加载指令和条件存储指令,尝试将第一内存中的至少一个指针结构体中的第一指针结构体中预设比特位的值修改为第二值”的步骤,进而在成功修改第一指针结构体中预设比特位的值后,再执行对应的临界区操作。由此,则可以返回执行“读取第一内存中用于存储地址的至少一个的指针结构体”的步骤,直至读取到该至少一个指针结构体中的每个指针结构体中预设比特位的值均为第一值,则表示上述物理核已经完该物理核的临界区操作,此时共享数据当前未被执行临界区操作。
进一步的,可能会存在至少两个物理核同时确定第一内存中的至少一个指针结构体中的每个指针结构体中预设比特位的值均为第一值,即至少两个物理核同时确定一共享数据当前未被执行临界区操作的情况。并且,该至少两个物理核可能会同时尝试将第一指针结构体中预设比特位的值修改为第二值,使得在修改成功后该第一指针结构体中预设比特位的值指示共享数据当前正被执行临界区操作。但是,由上述描述可知,只会有一个物理核成功修改上述第一指针结构体中预设比特位的值,并在成功修改该第一指针结构体中预设比特位的值后,其他物理核则不能再对该第一指针结构体进行操作。
基于此,本申请实施例的方法还可以包括:如果未成功将第一指针结构体中预设比特位的值修改为第二值,则返回执行读取所述第一内存中用于存储地址的至少一个的指针结构体的步骤,直至读取到至少一个指针结构体中的每个指针结构体中预设比特位的值均为第一值。
第二方面,本申请实施例提供一种执行临界区操作的装置,应用于无内部互锁流水级的微处理器mips平台,该装置包括:
读取模块,用于读取第一内存中用于存储地址的至少一个指针结构体,该第一内存为存储共享数据的内存,该至少一个指针结构体在该第一内存中的存储位置是预设的;
修改模块,用于如果上述读取模块读取的第一内存中的至少一个指针结构体中的每个指针结构体中预设比特位的值均为第一值,则采用链接加载指令和条件存储指令,尝试将该第一内存中的至少一个指针结构体中的第一指针结构体中预设比特位的值修改为第二值,本申请实施例中的第一值指示共享数据当前未被执行临界区操作,本申请实施例中的第二值指示共享数据当前正被执行临界区操作;
执行模块,用于在上述修改模块成功将上述第一指针结构体中预设比特位的值修改为第二值后,对该共享数据执行临界区操作。
可选的,上述修改模块,具体用于:
采用链接加载指令将该第一内存中的第一指针结构体加载至第一通用寄存器;
将该第一通用寄存器中的第一指针结构体中预设比特位的值修改为第二值;
采用条件存储指令,尝试将该第一通用寄存器中的第一指针结构体写入该第一内存。
其中,上述修改模块成功将该第一指针结构体中预设比特位的值修改为第二值,具体为:修改模块成功将该第一通用寄存器中的第一指针结构体写入第一内存。
可选的,所述修改模块,还用于:
在上述执行模块完成对所述共享数据的临界区操作后,将该第一内存中的第一指针结构体中预设比特位的值修改为第一值。
可选的,上述修改模块,具体用于:
采用链接加载指令将该第一内存中第一指针结构体加载至第二通用寄存器;
将该第二通用寄存器中的第一指针结构体中预设比特位的值修改为第一值;
采用条件存储指令,将该第二通用寄存器中的第一指针结构体写入该第一内存。
可选的,上述读取模块,还用于:
如果上述至少一个指针结构体中的任一指针结构体中预设比特位的值为第二值,则返回执行“读取第一内存中用于存储地址的至少一个的指针结构体”的步骤,直至读取到至少一个指针结构体中的每个指针结构体中预设比特位的值均为第一值。
可选的,上述读取模块,还用于:
如果上述修改模块未成功将该第一指针结构体中预设比特位的值修改为第二值,则返回执行“读取第一内存中用于存储地址的至少一个的指针结构体”的步骤,直至读取到至少一个指针结构体中的每个指针结构体中预设比特位的值均为第一值。
需要说明的是,上述各个方面中的指针结构体、链接加载指令以及条件存储指令的详细描述如下所示:
在一种可能的实现方式中,mips平台中每个指针结构体的长度均为4字节;此时,链接加载指令为整字加载的链接加载ll指令,条件存储指令为整字加载的条件存储sc指令。
示例性的,在32位mipscpu中,本申请实施例中的链接加载指令为ll指令,条件存储指令为sc指令。
在另一种可能的实现方式中,mips平台中每个指针结构体的长度均为8字节;链接加载指令为双字链接加载dll指令,条件存储指令为双字条件存储dsc指令。
示例性的,在64位mipscpu中,本申请实施例中的链接加载指令为dll指令,条件存储指令为dsc指令。
第三方面,本申请实施例提供一种非易失性存储介质,该非易失性存储介质中存储有一个或多个程序代码,当mips平台执行该程序代码时,该mips平台执行如上述第一方面及其任一种可能的实现方式中所述的执行临界区操作的方法。
需要说明的是,本申请实施例第二方面、第三方面及其各种可能的实现方式的有益效果可以参考第一方面及其各种可能的实现方式中的对应技术效果,此处不再赘述。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为现有技术中通过mips平台上的链接加载指令和条件存储指令,实现对临界区操作的安全性保护的方法流程图;
图2为本申请实施例提供的一种执行临界区操作的方法的流程图;
图3为本申请实施例提供的另一种执行临界区操作的方法的流程图;
图4为本申请实施例提供的另一种执行临界区操作的方法的流程图;
图5为本申请实施例提供的另一种执行临界区操作的方法的流程图;
图6为本申请实施例提供的另一种执行临界区操作的方法的流程图;
图7为本申请实施例提供的另一种执行临界区操作的方法的流程图;
图8为本申请实施例提供的一种执行临界区操作的装置的结构组成示意图。
具体实施方式
本发明的说明书以及附图中的术语“第一”和“第二”等是用于区别不同的对象,或者用于区别对同一对象的不同处理,而不是用于描述对象的特定顺序。例如,第一通用寄存器和第二通用寄存器可以为不同的通用寄存器。
在本发明的描述中,除非另有说明,“多个”的含义是指两个或两个以上。例如,多核处理器是指包含两个或两个以上物理核的处理器。
此外,本发明的描述中所提到的术语“包括”和“具有”以及它们的任何变形,意图在于覆盖不排他的包含。例如包含了一系列步骤或单元的过程、方法、系统、产品或设备没有限定于已列出的步骤或单元,而是可选地还包括其他没有列出的步骤或单元,或可选地还包括对于这些过程、方法、产品或设备固有的其它步骤或单元。
以下描述中,为了说明而不是为了限定,提出了诸如特定系统结构、接口、技术之类的具体细节,以便透切理解本发明。然而,本领域的技术人员应当清楚,在没有这些具体细节的其它实施例中也可以实现本发明。在其它情况中,省略对众所周知的装置、电路以及方法的详细说明,以免不必要的细节妨碍本发明的描述。
本申请实施例提供的一种执行临界区操作的方法及装置可以应用于无内部互锁流水级的微处理器(microprocessorwithoutinterlockedpipedstages,mips)平台的数据处理过程中。其中,mips为多核处理器。
其中,通过mips平台上的链接加载指令和条件存储指令,在执行链接加载指令和条件存储指令的间隙,可以实现对指定内存操作的原子性,如本申请中对共享内存数据的操作的原子性。其中,实现对共享数据的操作的原子性具体是指:一个物理核对共享数据的一次读或写操作是不可分割、不可中断、不被干扰的,保证该物理核对该共享数据的一次读或写操作的正确完成。即实现对共享数据的操作的原子性,便可以实现一些简单的临界区操作的安全性,保护共享数据不被破坏。其中,上述简单的临界区操作可以包括:修改通用寄存器中存储的数据,该数据可以为一个指针结构体。本申请实施例中的指针结构体存储于内存中,用于存储地址。
示例性的,以下以上述临界区操作修改通用寄存器中的指针结构体为例,对通过mips平台上的链接加载指令和条件存储指令,实现对临界区操作的安全性保护的方法进行说明:
如图1所示,通过mips平台上的链接加载指令和条件存储指令,实现对临界区操作的安全性保护的方法可以包括:sa、采用mips平台中的链接加载指令将一内存中的指针结构体加载到一通用寄存器;sb、修改该通用寄存器中的指针结构体;sc、尝试通过条件存储指令将通用寄存器中的指针结构体写回上述内存。
本申请实施例提供的执行临界区操作的方法及装置可以利用mips平台中的两个标准,包括mips标准1和mips标准2,保证临界区操作的安全性,保护共享数据不被破坏。
mips标准1参见上述描述:通过mips平台上的通用链接加载指令和条件存储指令,可以实现对一些简单的操作的原子性,即保证临界区操作的安全性,以保护共享数据不被破坏。
mips标准2为:mips平台中内存中用于存储地址的指针结构体转换成2进制后,其低2比特位的值为00,即该用于存储地址的指针结构体转换成2进制后,第0比特位和第1比特位的值均为0。
具体的,由于mips平台中在加载指针结构体时,必须是整字加载(即一次性从内存中读取4字节的内容),即4字节对齐;或者,双字加载(即一次性从内存中读取8字节的内容),即8字节对齐;因此,可以得出:mips平台中,每次读取的指针结构体则必须以16进制的0、4、8、c中的任一个结束。
并且,由于c语言中约定了32位系统下使用的指针长度均是4字节,64位系统下使用的指针长度均是8字节;因此,在将mips平台中每次读取的指针结构体转换成2进制后,其低2比特位的值为00。如16进制的0可以转换为2进制的0000,16进制的4可以转换为2进制的0100,16进制的8可以转换为2进制的1000,16进制的c可以转换为2进制的1100。
需要说明的是,本申请实施例中的链接加载指令为整字链接加载(loadlink,ll)指令,条件存储指令为整字条件存储(storeconditional,sc)指令;或者,链接加载指令为双字链接加载(loadlinkeddoubleword,dll)指令,条件存储指令为双字条件存储(storeconditionaldoubleword,dsc)指令。其中,链接加载指令和条件存储指令的具体描述可以参考本申请实施例后续的相关描述,此处不再赘述。
本申请实施例提供的执行临界区操作的方法的执行主体可以为mips平台,或者该mips平台中用于执行上述执行临界区操作的方法的装置,如执行临界区操作的装置。该执行临界区操作的装置可以为mips中的任一物理核。
下面将结合本申请实施例中的附图,通过具体的实施例及其应用场景对本申请实施例提供的一种执行临界区操作的方法及装置进行详细地说明。显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部实施例。
实施例一
本申请实施例提供一种执行临界区操作的方法,应用于mips平台,如图2所示,该执行临界区操作的方法包括:
s101、执行临界区操作的装置读取第一内存中用于存储地址的至少一个指针结构体。
其中,第一内存为存储共享数据的内存,上述至少一个指针结构体在该第一内存中的存储位置是预设的,并且上述至少一个指针结构体是指预设的在第一内存中为实现本实施例提供的执行临界区操作的方法而使用到的指针结构体。
示例性的,由上述mips标准2可知:mips平台中内存中用于存储地址的指针结构体转换成2进制后,其低2比特位的值为00;因此,执行临界区操作的装置可以采用链接加载指令和条件存储指令,修改指针结构体中第0比特位和第1比特位中至少一个比特位的值,以实现本申请实施例中的执行临界区操作的方法。具体的,本申请实施例的方法还包括s102:
s102、如果第一内存中的至少一个指针结构体中的每个指针结构体中预设比特位的值均为第一值,执行临界区操作的装置则采用链接加载指令和条件存储指令,尝试将第一内存中的至少一个指针结构体中的第一指针结构体中预设比特位的值修改为第二值。
其中,第一值指示共享数据当前未被执行临界区操作,第二值指示共享数据当前正被执行临界区操作。
示例性的,在本申请实施例中,对于任一指针结构体而言,该指针结构体的预设比特位可以为该指针结构体的第0比特位或者第1比特位;当然,该指针结构体的预设比特位也可以包括该指针结构体的第0比特位和第1比特位。
以指针结构体的预设比特位包括指针结构体的第0比特位和第1比特位为例,第一内存中的至少一个指针结构体中的每个指针结构体中预设比特位的值均为第一值,具体可以为:该至少一个指针结构体中的每个指针结构体中预设比特位的值均为00;该至少一个指针结构体中的第一指针结构体中预设比特位的值为第二值,具体可以为:该至少一个指针结构体中第一指针结构体中预设比特位的值均为01、10或11中的任一个。
在本申请实施例中,执行临界区操作的方法装置可以利用上述mips标准1中条件存储指令和条件存储指令,将第一指针结构体中预设比特位的值修改为第二值,如此便可以通过条件存储指令和条件存储指令的原子性,保证只能有一个物理核修改第一指针结构体中预设比特位的值。因此,若一物理核修改了第一指针结构体中预设比特位的值,其他物理核则不能再对第一指针结构体中预设比特位的值进行修改。
由此可见,如果第一内存中的至少一个指针结构体中的每个指针结构体中预设比特位的值均为第一值,即共享数据当前未被执行临界区操作;执行临界区操作的装置便可以采用链接加载指令和条件存储指令,尝试将至少一个指针结构体中的第一指针结构体中预设比特位的值修改为第二值,以使该第一指针结构体中预设比特位的值指示共享数据当前正被执行临界区操作。
s103、执行临界区操作的装置在成功将第一指针结构体中预设比特位的值修改为第二值后,对共享数据执行临界区操作。
可以想到的是,可能存在至少两个物理核同时确定第一内存中的至少一个指针结构体中的每个指针结构体中预设比特位的值均为第一值,即至少两个物理核同时确定一共享数据当前未被执行临界区操作;此时,这至少两个物理核均会去修改第一指针结构体中预设比特位的值,使得第一指针结构体中预设比特位的值指示共享数据当前正被执行临界区操作。但是,根据上述mips标准1中条件存储指令和条件存储指令的原子性的要求,只会有一个物理核成功修改第一指针结构体中预设比特位的值,并在该物理核成功修改第一指针结构体中预设比特位的值后,其他物理核则不能再对第一指针结构体中预设比特位的值进行操作。
由此可见,若执行临界区操作的装置成功修改第一指针结构体中预设比特位的值,则表示该第一指针结构体中预设比特位的值没有被其他物理核修改,且其他物理核不能再对第一指针结构体中预设比特位的值进行操作。并且,其他物理核再次读取至少一个指针结构体时,则该至少一个指针结构体中的第一指针结构体中预设比特位的值一定会指示共享数据当前正被执行临界区操作,其他物理核便不能对该共享数据进行操作,如此便可以保证临界区操作的安全性,以保护共享数据不被破坏。
本申请实施例提供的执行临界区操作的方法,可以利用上述mips标准2:mips平台中内存中的指针结构体中预设比特位的值一般而言是固定的;通过第一内存中的第一指针结构体中预设比特位的值的变化来指示共享数据当前是否被执行临界区操作。
并且,可以利用上述mips标准1保证只能有一个物理核对该第一内存中的第一指针结构体进行修改。并且,在将第一内存中的第一指针结构体中预设比特位的值修改为第二值后,该第一指针结构体便可以指示共享数据当前正被执行临界区操作,具体为第二值指示共享数据当前正被执行临界区操作,其他物理核便不能操作该共享数据,如此便可以保证临界区操作的安全性,以保护共享数据不被破坏。
综上所述,本申请实施例提供的执行临界区操作的方法,可以利用mips平台中的指针结构体,以及链接加载指令和条件存储指令的特性,实现对临界区操作的安全性的保护。相较于现有技术的方案,不需要增加额外的锁机制,如此便可以在保证临界区操作的安全性,保护共享数据不被破坏的同时,简化数据处理过程,减少系统性能开销,减少对内存资源的冗余占用。
示例性的,在本申请实施例的一种应用场景中,mips平台中每个指针结构体的长度可以均为4字节,且mips平台中使用的指针均4字节对齐。
在这种应用场景中,链接加载指令为整字加载的ll指令,条件存储指令为整字加载的sc指令。
在本申请实施例的另一种应用场景中,mips平台中每个指针结构体长度可以均为8字节,且mips平台中使用的指针均8字节对齐。
在这种应用场景中,链接加载指令为dll指令,条件存储指令为dsc指令。
其中,在32位mipscpu中,使用整字ll指令和整字sc指令实现对临界区操作安全性的保护;在64位mipscpu中,使用dll指令和dsc指令实现对临界区操作安全性的保护。
本申请实施例中不仅可以通过整字ll指令和整字sc指令实现对临界区操作安全性的保护;还可以通过dll指令和dsc指令实现对临界区操作安全性的保护。
其中,本申请实施例中可以采用c语言实现上述s101-s103的方法步骤,也可以采用汇编语言实现上述s101-s103的方法步骤,本申请实施例对此并不限定。
示例性的,以第一值为00,第二值为01为例,采用c语言实现上述s102的代码具体可以为:
if(addr&0x01==0x00)//判断第一内存中至少一个指针结构体中的任一指针结构体中低2比特位的值是否为00//
{
addr=addr|0x01//条件成立,则表示该至少一个指针结构体中的每个指针结构体中2比特位的值均没有被修改,则将任一指针结构体的第0比特位置1//
}
else
{
//条件成立,则表示该至少一个指针结构体中有一个指针结构体中2比特位的值被修改了;
}
示例性的,若采用汇编语言实现上述s102,如图3所示,图2所示的s102可以包括s102a-:
s102a、如果第一内存中的至少一个指针结构体中的每个指针结构体中预设比特位的值均为第一值,执行临界区操作的装置采用链接加载指令将该第一内存中的第一指针结构体加载至第一通用寄存器。
其中,本申请实施例中的第一通用寄存器可以为执行临界区操作的装置能够使用的任一通用寄存器。
s102b、执行临界区操作的装置将该第一通用寄存器中的第一指针结构体中预设比特位的值修改为第二值。
示例性的,执行临界区操作的装置可以将该第一通用寄存器中的第一指针结构体中预设比特位的值修改为01、10或者11中的任一个,如此其他物理核读取到第一指针结构体中预设比特位的值为01、10或者11中的任一个时,则可以确定共享数据当前正被执行临界区操作,其他物理核则不会操作该共享数据,如此便可以保证临界区操作的安全性,以保护共享数据不被破坏。
s102c、执行临界区操作的装置采用条件存储指令,尝试将该第一通用寄存器中的第一指针结构体写入第一内存。
其中,该执行临界区操作的装置能够成功将第一通用寄存器中的第一指针结构体写入第一内存,则表示该执行临界区操作的装置成功将第一指针结构体中预设比特位的值修改为第二值。
需要强调的是,对于此处写入第一内存的第一指针结构体来说,该第一指针结构体中预设比特位的值为第二值,该第二值指示该共享数据当前未被执行临界区操作。
相应的,如图3所示,图2所示的s103可以替换为s103′:
s103′、执行临界区操作的装置在成功将第一通用寄存器中的第一指针结构体写入第一内存后,对共享数据执行临界区操作。
进一步的,在该执行临界区操作的装置完成对共享数据的临界区操作后,由于第一内存中的第一指针结构体中预设比特位的值仍为第二值,即该第一指针结构体仍然指示该共享数据当前正在被执行临界区操作,因此其他物理核则不能对该共享数据进行操作。
为了在该执行临界区操作的装置在完成对共享数据的临界区操作后,其他物理核可以对该共享数据执行其临界区操作,该执行临界区操作的装置可以及时修改第一内存中的第一指针结构体中预设比特位的值,使得该第一内存中的第一指针结构体中预设比特位的值指示共享数据当前未被执行临界区操作。
具体的,如图4所示,在s103之后,本申请实施例的方法还可以包括s104:
s104、执行临界区操作的装置在完成对共享数据的临界区操作后,将该第一内存中的第一指针结构体中预设比特位的值修改为第一值。
同样的,本申请实施例中可以采用c语言实现上述s104中的方法,也可以采用汇编语言实现上述s104中的方法。
示例性的,以第一值为00,第二值为01为例,采用c语言实现上述s104的代码具体可以为:
addr=addr&0x00//将第一指针结构体的第0比特位置0//
示例性的,若采用汇编语言实现上述s104,如图5所示,图4所示的s104可以包括s104a-s104c:
s104a、执行临界区操作的装置在完成对共享数据的临界区操作后,采用链接加载指令将该第一内存中第一指针结构体加载至第二通用寄存器。
s104b、执行临界区操作的装置将该第二通用寄存器中的第一指针结构体中预设比特位的值修改为第一值。
s104c、执行临界区操作的装置采用条件存储指令,将该第二通用寄存器中的第一指针结构体写入第一内存。
需要强调的是,对于此处写入第一内存的第一指针结构体来说,该第一指针结构体中预设比特位的值为第一值,该第一值指示该共享数据当前未被执行临界区操作。
其中,本申请实施例中的第二通用寄存器与上述第一通用寄存器可以为不同的两个通用寄存器。
进一步的,执行临界区操作的装置在读取第一内存中的至少一个指针结构体时,其他物理核可能已将该至少一个指针结构体中的一个指针结构体中预设比特位的值修改为第二值了;此时,该执行临界区操作的装置则会读取到该至少一个指针结构体中的一个指针结构体中预设比特位的值为第二值,则表示上述其他物理核正在对该共享数据执行临界区操作。如此,为了保证上述物理核执行其临界区操作的安全性,以保护共享数据不被破坏;该执行临界区操作的装置此时不能执行临界区操作,需要等到上述物理核执行完该物理核的临界区操作后,才能够执行本申请实施例中的临界区操作。
具体的,如图6所示,本申请实施例的方法还包括s105:
s105、如果至少一个指针结构体中的任一指针结构体中预设比特位的值为第二值,执行临界区操作的装置则返回执行s101及s101后续相应流程。
可以想到的,如果至少一个指针结构体中的任一指针结构体中预设比特位的值为第二值,则表示共享数据当前正被执行临界区操作,则表示多核mips中的一个物理核正在对该共享数据执行临界区操作。如此,为了保证上述物理核执行其临界区操作的安全性,以保护共享数据不被破坏;执行临界区操作的装置此时不能执行临界区操作,而是继续读取第一内存中用于存储地址的至少一个的指针结构体,直至读取到该至少一个指针结构体中的每个指针结构体中预设比特位的值均为第一值,则表示上述物理核已经完该物理核的临界区操作,此时共享数据当前未被执行临界区操作。
进一步的,可能会存在至少两个物理核同时确定一共享数据当前未被执行临界区操作,并同时尝试将第一指针结构体中预设比特位的值修改为第二值,使得在修改成功后该第一指针结构体中预设比特位的值指示共享数据当前正被执行临界区操作。但是,由mips标准1可知,只会有一个物理核可以成功将上述第一指针结构体中预设比特位的值修改为第二值,并在成功修改该第一指针结构体中预设比特位的值后,其他物理核则不能再对该第一指针结构体进行操作。
由此可见,若该执行临界区操作的装置未能成功将第一指针结构体中预设比特位的值修改为第二值,则表示其他物理核已修改了该第一指针结构体中预设比特位的值,该共享数据当前正被执行临界区操作。此时,为了保证临界区操作的安全性,保护共享数据不被破坏,执行临界区操作的装置则不能对该对共享数据执行临界区操作。具体的,如图7所示,本申请实施例的方法还包括s106:
s106、如果执行临界区操作的装置未成功将第一指针结构体中预设比特位的值修改为第二值,则返回执行s101及s101后续相应流程。
本申请实施例提供的执行临界区操作的方法,可以利用mips平台中的指针结构体,以及链接加载指令和条件存储指令的特性,实现对临界区操作的安全性的保护。相较于现有技术的方案,不需要增加额外的锁机制,如此便可以在保证临界区操作的安全性,保护共享数据不被破坏的同时,简化数据处理过程,减少系统性能开销,减少对内存资源的冗余占用。
进一步的,本申请实施例可以在完成对共享数据的临界区操作后,及时将第一指针结构体中预设比特位的值修改为第一值,使得其他物理核可以对该共享数据执行其临界区操作。
实施例二
本申请实施例提供一种执行临界区操作的装置,应用于无内部互锁流水级的微处理器mips平台。
如图8所示,该执行临界区操作的装置包括:读取模块21、修改模块22和执行模块23。
读取模块21,用于读取第一内存中用于存储地址的至少一个指针结构体,该第一内存为存储共享数据的内存,该至少一个指针结构体在所述第一内存中的存储位置是预设的。
修改模块22,用于如果上述读取模块21读取的第一内存中的至少一个指针结构体中的每个指针结构体中预设比特位的值均为第一值,则采用链接加载指令和条件存储指令,尝试将该第一内存中的至少一个指针结构体中的第一指针结构体中预设比特位的值修改为第二值,该第一值指示该共享数据当前未被执行临界区操作,该第二值指示该共享数据当前正被执行临界区操作。
执行模块23,用于在上述修改模块22成功将该第一指针结构体中预设比特位的值修改为第二值后,对该共享数据执行临界区操作。
进一步的,上述修改模块22,具体用于:
采用链接加载指令将该第一内存中的第一指针结构体加载至第一通用寄存器;
将该第一通用寄存器中的第一指针结构体中预设比特位的值修改为第二值;
采用条件存储指令,尝试将该第一通用寄存器中的第一指针结构体写入第一内存。
可以想到的是,此处写入第一内存的第一指针结构体中预设比特位的值为第二值,该第二值指示该共享数据当前正被执行临界区操作。
其中,上述修改模块22成功将第一指针结构体中预设比特位的值修改为第二值,具体为:上述修改模块22成功将上述第一通用寄存器中的第一指针结构体写入第一内存。
进一步的,上述修改模块22,还可以用于在所述执行模块23完成对所述共享数据的临界区操作后,将所述第一内存中的第一指针结构体中预设比特位的值修改为所述第一值。
进一步的,所述修改模块22,具体可以用于:
采用所述链接加载指令将所述第一内存中第一指针结构体加载至第二通用寄存器;
将所述第二通用寄存器中的第一指针结构体中预设比特位的值修改为所述第一值;
采用所述条件存储指令,将所述第二通用寄存器中的第一指针结构体写入所述第一内存。
进一步的,上述读取模块21,还可以用于:
如果所述至少一个指针结构体中的任一指针结构体中预设比特位的值为所述第二值,则返回执行所述读取所述第一内存中用于存储地址的至少一个的指针结构体的步骤,直至读取到所述至少一个指针结构体中的每个指针结构体中预设比特位的值均为所述第一值。
进一步的,上述读取模块21,还可以用于:
如果所述修改模块22未成功将所述第一指针结构体中预设比特位的值修改为所述第二值,则返回执行所述读取所述第一内存中用于存储地址的至少一个的指针结构体的步骤,直至读取到所述至少一个指针结构体中的每个指针结构体中预设比特位的值均为所述第一值。
可选的,mips平台中每个指针结构体的长度均为4字节;链接加载指令为整字加载的链接加载ll指令,条件存储指令为整字加载的条件存储sc指令。
或者,mips平台中每个指针结构体的长度均为8字节;链接加载指令为双字链接加载dll指所述条件存储指令为双字条件存储dsc指令。
需要说明的是,本申请提供的执行临界区操作的装置中具体功能模块的详细描述可以参考上述方法实施例中对应方法步骤的详细描述,此处不再限定。
本申请实施例提供一种非易失性存储介质,该非易失性存储介质中存储有一个或多个程序代码,当mips平台执行该程序代码时,该mips平台执行如图2-图7中任一附图所示的执行临界区操作的方法。
需要说明的是,该程序代码可以作为运行于mips平台上的嵌入式操作系统的一个组件,也可以作为运行于mips平台上的各种应用程序中的一个组件,相对而言,当上述实施例中提供的执行临界区操作的方法作为嵌入式操作系统的一个组件时,可以无需对应用程序进行修改,实施难度和修改工作量较小。
其中,在具体实现过程中,上述如图2-7中任一附图所示的方法流程中的各步骤均可以通过硬件形式的mips平台执行上述非易失性存储介质中存储的软件形式的程序代码实现。上述实施例中的读取模块21、修改模块22和执行模块23的相关功能均可以通过mips平台中的cpu实现,为避免重复,此处不再赘述。
本申请实施例提供的执行临界区操作的装置,可以利用mips平台中的指针结构体,以及链接加载指令和条件存储指令的特性,实现对临界区操作的安全性的保护。相较于现有技术的方案,不需要增加额外的锁机制,如此便可以在保证临界区操作的安全性,保护共享数据不被破坏的同时,简化数据处理过程,减少系统性能开销,减少对内存资源的冗余占用。
进一步的,本申请实施例可以在完成对共享数据的临界区操作后,及时将第一指针结构体中预设比特位的值修改为第一值,使得其他物理核可以对该共享数据执行其临界区操作。
通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在可读取的存储介质中,如计算机的软盘,硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
本领域普通技术人员将会理解,本发明的各个方面、或各个方面的可能实现方式可以被具体实施为系统、方法或者计算机程序产品。因此,本发明的各方面、或各个方面的可能实现方式可以采用完全硬件实施例、完全软件实施例(包括固件、驻留软件等等),或者组合软件和硬件方面的实施例的形式,在这里都统称为“电路”、“模块”或者“系统”。此外,本发明的各方面、或各个方面的可能实现方式可以采用计算机程序产品的形式,计算机程序产品是指存储在计算机可读介质中的计算机可读程序代码。
计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质包含但不限于电子、磁性、光学、电磁、红外或半导体系统、设备或者装置,或者前述的任意适当组合,如随机存取存储器(ram)、只读存储器(rom)、可擦除可编程只读存储器(eprom或者快闪存储器)、光纤、便携式只读存储器(cd-rom)。
计算机中的处理器读取存储在计算机可读介质中的计算机可读程序代码,使得处理器能够执行在流程图中每个步骤、或各步骤的组合中规定的功能动作;生成实施在框图的每一块、或各块的组合中规定的功能动作的装置。
计算机可读程序代码可以完全在用户的计算机上执行、部分在用户的计算机上执行、作为单独的软件包、部分在用户的计算机上并且部分在远程计算机上,或者完全在远程计算机或者服务器上执行。也应该注意,在某些替代实施方案中,在流程图中各步骤、或框图中各块所注明的功能可能不按图中注明的顺序发生。例如,依赖于所涉及的功能,接连示出的两个步骤、或两个块实际上可能被大致同时执行,或者这些块有时候可能被以相反顺序执行。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。