具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
如上文所述,可以将针对数据库的操作编写为源代码,并且可以利用编译程序将源代码编译为目标代码。目标代码是机器可识别的,可以由诸如计算机的设备执行,从而实现针对数据库的操作。
图1示出示例性的源代码所代表的操作的示意图。在图1中,块110中的源代码代表并发操作,块120中的源代码代表锁定操作,块130中的源代码代表串行操作,块140中的源代码代表解锁操作,块150中的源代码代表并发操作。
假设按照图1所示的顺序编写源代码,并相应地期望按照如下顺序执行操作:首先执行并发操作,然后执行锁定操作、串行操作和解锁操作,最后执行并发操作。这样,根据源代码所指示的执行顺序,在锁定操作之前及解锁操作之后,可以实施针对数据库的并发操作,而在锁定操作之后及解锁操作之前的时段内,应当实施串行操作。这段串行操作可以是如上文所述的更新库存数据的操作。锁定和解锁可以使得在同一时间仅有一个进程能够对库存数据进行更新。
并发操作可以是诸如数据查询操作,例如查询库存数据,这类操作可以是并行执行的,也就是可以由多个进程(可对应于多个用户)并行执行。串行操作可以是诸如数据更新操作,例如更新库存数据,这类操作可以串行执行,即可以在同一时间仅由一个进程执行。
如上文所述,虽然按照图1所示的顺序编写源代码,但是由于硬件和软件设计原因,在编译源代码和执行目标代码的过程中,设备有可能对代码的执行顺序进行优化和调整,例如,有可能在执行目标代码时实际上已经将块130中的源代码所代表的串行操作调整到了块120中的源代码所代表的锁定操作前面或者调整到了块140中的源代码所代表的解锁操作后面。这样,锁定操作和解锁操作将无法控制块130中的源代码所代表的串行操作的执行,导致可能出现多个进程同时对数据进行更新的并行处理情况,使得数据的读取和存储出现错误。也就是说,即使在编写源代码时加入了锁功能,其也有可能由于设备自身进行的代码优化而无法发挥作用。
为了解决上述问题,根据本发明的一个方面,提供一种代码控制方法。图2示出根据本发明一个实施例的代码控制方法200的流程示意图。
如图2所示,代码控制方法200包括以下步骤。
在步骤S210,获取设备的硬件信息。
设备可以是特定目标代码要在其上执行的硬件设备。硬件信息可以是与该设备相关的各种配置信息,包括但不限于以下项中的一项或多项:所述设备上的操作系统的内核版本、所述设备的处理器架构。
操作系统的内核版本可以包括但不限于:磁盘操作系统(DOS操作系统)、Windows系列操作系统(例如Windows 95、Windows XP、Windows Vista、Windows 7、Windows 8等)、Unix操作系统、Linux操作系统等。
处理器架构可以包括但不限于:x86架构、x86_64架构等。
本领域技术人员可以理解,以上硬件信息的类型仅是示例而非对本发明的限制,可以针对任何其他合适的现有或未来可能出现的硬件信息实现本发明实施例提供的代码控制方法。
获取设备的硬件信息可以是利用编译器程序读取设备的硬件信息。
在步骤S220,根据硬件信息调用设备上的操作系统的特定应用程序编程接口(API),所述特定应用程序编程接口用于控制通过编译特定源代码所获得的特定目标代码在设备上的执行以使得特定目标代码的执行顺序与特定源代码所指示的执行顺序一致。
对于不同的硬件和软件配置环境,用于控制目标代码的执行顺序不被调整的底层控制指令(例如本文所述的应用程序编程接口)可能是不同的。
例如,假设当设备的处理器架构是x86(32位)架构,操作系统的内核版本是windows 7时,可以调用应用程序编程接口X来控制特定目标代码的执行顺序与特定源代码所指示的执行顺序一致,而当设备的处理器架构是x86_64(64位)架构,操作系统的内核版本是windows 8时,可以调用应用程序编程接口Y来控制特定目标代码的执行顺序与特定源代码所指示的执行顺序一致。应用程序编程接口X与应用程序编程接口Y不同,因此可以首先判断设备的处理器架构是x86架构还是x86_64架构以及操作系统的内核版本是Windows 7还是Windows 8,然后根据判断结果确定对应的用于控制特定目标代码在设备上的执行顺序的应用程序编程接口。
特定源代码可以是任何合适的、期望其对应的目标代码的执行顺序不被调整的源代码,例如上文所述的用于代表对库存数据进行更新的操作的源代码。可以理解,针对库存数据的操作仅是示例而非限制,特定源代码可以是用于代表其他类型的操作的源代码。
在调用特定应用程序编程接口之后,可以利用该特定应用程序编程接口控制特定目标代码的执行。
根据本发明实施例的代码控制方法,通过调用设备上的特定应用程序编程接口来控制特定目标代码的执行顺序与特定源代码所指示的执行顺序一致,这有助于避免由于设备对目标代码的执行顺序的自动调整而导致的锁功能失效的问题。
根据本发明实施例,特定应用程序编程接口可以包括第一应用程序编程接口,步骤S220可以进一步包括:在编译特定源代码之前,根据硬件信息调用第一应用程序编程接口以控制特定目标代码的执行顺序不被向前调整。
图3示出根据本发明一个实施例的源代码所代表的操作的示意图。图3所示的块310、320、340、360和370中的源代码分别与图1所示的块110至150中的源代码相对应。如图3所示,在块340中的用于代表串行操作的源代码的前面,加入用于代表第一调用操作的源代码。用于代表第一调用操作的源代码可以用自定义原语accq表示。accq可以预先进行定义,以使得编译器程序能够对其进行识别和编译。accq的主要作用是根据硬件信息调用第一应用程序编程接口。例如,如果设备的处理器架构是x86(32位),操作系统的内核版本是windows 7,则可以调用应用程序编程接口X。该应用程序编程接口X可以控制块340中的源代码所对应的目标代码在安装windows 7操作系统的32位的设备上执行时不被向前调整,也就是使块340中的源代码所代表的串行操作不被调整到块320中的源代码所代表的锁定操作之前执行。
也就是说,通过第一应用程序编程接口的调用可以保证特定目标代码的执行顺序不被向前调整。
根据本发明实施例,在根据硬件信息调用第一应用程序编程接口以控制特定目标代码的执行顺序不被向前调整之前,代码控制方法200可以进一步包括:确定存在用于指示第一应用程序编程接口的第一标识。
在调用第一应用程序编程接口之前,可以确定第一标识是否存在。如果第一标识存在,则可以利用第一标识调用第一应用程序编程接口。如果第一标识不存在,则可以返回第一应用程序编程接口无法调用的指示信息。
例如,假设在确定设备的处理器架构和操作系统的内核版本之后,从预定义的accq原语中找不到与该处理器架构和操作系统的内核版本相对应的第一应用程序编程接口的第一标识,也就是说,在accq原语中未对该处理器架构和操作系统的内核版本所对应的第一应用程序编程接口进行预定义,在这种情况下,无法调用第一应用程序编程接口,因此可以返回第一应用程序编程接口无法调用的指示信息。
一般而言,可以利用第一标识可以快速准确地确定期望调用的第一应用程序编程接口。
根据本发明实施例,在根据硬件信息调用第一应用程序编程接口以控制特定目标代码的执行顺序不被向前调整之前,代码控制方法200可以进一步包括编译用于代表锁定操作的源代码,所述锁定操作包括:设置令牌;以及按照时间顺序向最早请求期望数据的进程分配令牌,其中,特定源代码所代表的操作由占有令牌的进程执行。
继续参考图3,示出在块330中的用于代表第一调用操作的源代码之前,存在块320中的用于代表锁定操作的源代码。也就是说,可以在调用第一应用程序编程接口之前,编译用于代表锁定操作的源代码。
利用代表锁定操作的源代码,可以控制块340中的源代码所代表的串行操作,使得串行操作中的动作在同一时间仅由一个进程执行。这样的锁定操作可以通过分配令牌来实现。令牌是唯一的,仅占有令牌的进程能够执行块340中的源代码所代表的串行操作。该串行操作可以例如数据更新等类似操作。
利用令牌控制特定源代码所代表的操作可以使得特定源代码所代表的操作在同一时间仅由一个进程执行,有助于避免数据的读取和存储出现错误。
根据本发明实施例,特定应用程序编程接口可以包括第二应用程序编程接口,上述步骤S220可以进一步包括:在编译特定源代码之后,根据硬件信息调用第二应用程序编程接口以控制特定目标代码的执行顺序不被向后调整。
继续参考图3,在块340中的用于代表串行操作的源代码的后面,加入用于代表第二调用操作的源代码。用于代表第二调用操作的源代码可以用自定义原语release表示。与accq类似地,release可以预先进行定义,以使得编译器程序能够对其进行识别和编译。release的主要作用是根据硬件信息调用第二应用程序编程接口,以控制块340中的源代码所对应的目标代码在设备上执行时不被向后调整,也就是使块340中的源代码所代表的串行操作不被调整到块360中的源代码所代表的解锁操作之后执行。第二应用程序编程接口的调用方式与第一应用程序编程接口类似,不再赘述。
也就是说,通过第二应用程序编程接口的调用可以保证特定目标代码的执行顺序不被向后调整。
示例性地,特定应用程序编程接口可以包括第一应用程序编程接口和第二应用程序编程接口,上述步骤S220可以进一步包括:在编译特定源代码之前,根据硬件信息调用第一应用程序编程接口以控制特定目标代码的执行顺序不被向前调整;以及在编译特定源代码之后,根据硬件信息调用第二应用程序编程接口以控制特定目标代码的执行顺序不被向后调整。也就是说,可以一起调用第一应用程序编程接口和第二应用程序编程接口,使得特定目标代码的执行顺序既不会被向前调整也不会被向后调整,以保证特定源代码所代表的操作能够按照期望顺序执行。
根据本发明实施例,在根据硬件信息调用第二应用程序编程接口以控制特定目标代码的执行顺序不被向后调整之前,代码控制方法200可以进一步包括:确定存在用于指示第二应用程序编程接口的第二标识。
与第一标识类似地,在调用第二应用程序编程接口之前,可以确定第二标识是否存在。如果第二标识存在,则可以利用第二标识调用第二应用程序编程接口。如果第二标识不存在,则可以返回第二应用程序编程接口无法调用的指示信息。
例如,假设在确定设备的处理器架构和操作系统的内核版本之后,从预定义的release原语中找不到与该处理器架构和操作系统的内核版本相对应的第二应用程序编程接口的第二标识,也就是说,在release原语中未对该处理器架构和操作系统的内核版本所对应的第二应用程序编程接口进行预定义,在这种情况下,无法调用第二应用程序编程接口,因此可以返回第二应用程序编程接口无法调用的指示信息。
类似地,利用第二标识可以快速准确地确定期望调用的第二应用程序编程接口。
根据本发明实施例,在根据硬件信息调用第二应用程序编程接口以控制特定目标代码的执行顺序不被向后调整之后,代码控制方法200可以进一步包括编译用于代表解锁操作的源代码,所述解锁操作包括:释放令牌。
继续参考图3,示出在块350中的用于代表第二调用操作的源代码之后,存在块360中的用于代表解锁操作的源代码。也就是说,可以在调用第二应用程序编程接口之后,编译用于代表解锁操作的源代码。
示例性地,当占有令牌的进程执行完块340中的源代码所代表的串行操作之后,可以释放令牌。在释放令牌之后,可以按照时间顺序向下一个请求期望数据的进程分配所述令牌,以由下一个进程继续执行块340中的源代码所代表的串行操作。
根据本发明实施例,特定源代码可以包括用于代表以下操作的源代码:从存储器中获取期望数据;修改期望数据;以及将经修改的期望数据存储到存储器。
示例性地,期望数据可以是上文所述的锁定操作所涉及的期望数据,例如库存数据等,块340中的源代码所代表的串行操作可以是数据更新(即修改)操作。假设某种商品的库存仅剩一件,则其库存数据为1。当同时存在两个用户请求购买该商品时,可以同时发起两个进程用于对该商品的库存数据进行查询和修改。如上文所述,可以根据时间顺序向最早请求期望数据的进程分配令牌。假设最早请求期望数据的进程是进程a,另一个进程是进程b,则进程a可以首先取到令牌。进程a查询到此时的库存数据为1,并且可以将库存数据减1,即修改为0。这样,与进程a对应的用户可以成功购买商品。随后,释放令牌并将令牌分配给进程b。进程b对库存数据进行查询,发现库存数据为0,无法进行交易。这种情况下,进程b可以向对应用户返回库存不足无法交易的指示信息。
根据本发明的另一方面,提供一种代码控制装置。图4示出根据本发明一个实施例的代码控制装置400的示意性框图。如图4所示,代码控制装置400包括获取模块410和调用模块420。
获取模块410用于获取设备的硬件信息。
调用模块420用于根据所述硬件信息调用所述设备上的操作系统的特定应用程序编程接口,所述特定应用程序编程接口用于控制通过编译特定源代码所获得的特定目标代码在设备上的执行以使得特定目标代码的执行顺序与特定源代码所指示的执行顺序一致。
获取模块410可以与调用模块420直接或间接地通信,获取模块410和调用模块420的任何一者可以采用任何合适的硬件、软件和/或固件实现。
根据本发明实施例的代码控制装置,通过调用设备上的特定应用程序编程接口来控制特定目标代码的执行顺序与特定源代码所指示的执行顺序一致,这有助于避免由于设备对目标代码的执行顺序的自动调整而导致的锁功能失效的问题。
示例性地,特定应用程序编程接口可以包括第一应用程序编程接口,调用模块420可以进一步包括第一调用子模块,用于在编译特定源代码之前,根据硬件信息调用第一应用程序编程接口以控制特定目标代码的执行顺序不被向前调整。
示例性地,代码控制装置400可以进一步包括第一标识确定模块(未示出),用于确定存在用于指示第一应用程序编程接口的第一标识。
示例性地,代码控制装置400可以进一步包括第一编译模块(未示出),用于编译用于代表锁定操作的源代码,所述锁定操作可以包括:设置令牌;以及按照时间顺序向最早请求期望数据的进程分配令牌,其中,特定源代码所代表的操作由占有令牌的进程执行。
示例性地,特定应用程序编程接口可以包括第二应用程序编程接口,调用模块420可以进一步包括第二调用子模块,用于在编译特定源代码之后,根据硬件信息调用第二应用程序编程接口以控制特定目标代码的执行顺序不被向后调整。
示例性地,代码控制装置400可以进一步包括第二标识确定模块(未示出),用于确定存在用于指示第二应用程序编程接口的第二标识。
示例性地,代码控制装置400可以进一步包括第二编译模块(未示出),用于编译用于代表解锁操作的源代码,所述解锁操作包括:释放令牌。
示例性地,特定源代码可以包括用于代表以下操作的源代码:从存储器中获取期望数据;修改期望数据;以及将经修改的期望数据存储到存储器。
示例性地,硬件信息可以包括以下项中的一项或多项:设备上的操作系统的内核版本、设备的处理器架构。
上文已经描述了代码控制方法的各步骤的实施方式和优点等,本领域技术人员结合图1至3以及上文关于代码控制方法的描述,可以理解代码控制装置400的具体结构、运行方式及其优点等,本文不对此进行赘述。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的代码控制装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
本发明实施例公开了A1、一种代码控制方法,包括:
获取设备的硬件信息;以及
根据所述硬件信息调用所述设备上的操作系统的特定应用程序编程接口,所述特定应用程序编程接口用于控制通过编译特定源代码所获得的特定目标代码在所述设备上的执行以使得所述特定目标代码的执行顺序与所述特定源代码所指示的执行顺序一致。
A2、如A1所述的代码控制方法,所述特定应用程序编程接口包括第一应用程序编程接口,
所述根据所述硬件信息调用所述设备上的操作系统的特定应用程序编程接口进一步包括:
在编译所述特定源代码之前,根据所述硬件信息调用所述第一应用程序编程接口以控制所述特定目标代码的执行顺序不被向前调整。
A3、如A2所述的代码控制方法,在所述根据所述硬件信息调用所述第一应用程序编程接口以控制所述特定目标代码的执行顺序不被向前调整之前,所述代码控制方法进一步包括:
确定存在用于指示所述第一应用程序编程接口的第一标识。
A4、如A2或A3所述的代码控制方法,在所述根据所述硬件信息调用所述第一应用程序编程接口以控制所述特定目标代码的执行顺序不被向前调整之前,所述代码控制方法进一步包括编译用于代表锁定操作的源代码,
所述锁定操作包括:
设置令牌;以及
按照时间顺序向最早请求期望数据的进程分配所述令牌,
其中,所述特定源代码所代表的操作由占有所述令牌的进程执行。
A5、如A1-A4中任一项所述的代码控制方法,所述特定应用程序编程接口包括第二应用程序编程接口,
所述根据所述硬件信息调用所述设备上的操作系统的特定应用程序编程接口进一步包括:
在编译所述特定源代码之后,根据所述硬件信息调用所述第二应用程序编程接口以控制所述特定目标代码的执行顺序不被向后调整。
A6、如A5所述的代码控制方法,在根据所述硬件信息调用所述第二应用程序编程接口以控制所述特定目标代码的执行顺序不被向后调整之前,所述代码控制方法进一步包括:
确定存在用于指示所述第二应用程序编程接口的第二标识。
A7、如A1-A6中任一项所述的代码控制方法,在所述根据所述硬件信息调用所述第二应用程序编程接口以控制所述特定目标代码的执行顺序不被向后调整之后,所述代码控制方法进一步包括编译用于代表解锁操作的源代码,
所述解锁操作包括:释放所述令牌。
A8、如A1-A7中任一项所述的代码控制方法,所述特定源代码包括用于代表以下操作的源代码:
从存储器中获取期望数据;
修改所述期望数据;以及
将经修改的期望数据存储到所述存储器。
A9、如A1-A8任一项所述的代码控制方法,所述硬件信息包括以下项中的一项或多项:所述设备上的操作系统的内核版本、所述设备的处理器架构。
本发明实施例还公开了B10、一种代码控制装置,包括:
获取模块,用于获取设备的硬件信息;以及
调用模块,用于根据所述硬件信息调用所述设备上的操作系统的特定应用程序编程接口,所述特定应用程序编程接口用于控制通过编译特定源代码所获得的特定目标代码在所述设备上的执行以使得所述特定目标代码的执行顺序与所述特定源代码所指示的执行顺序一致。
B11、如B10所述的代码控制装置,所述特定应用程序编程接口包括第一应用程序编程接口,
所述调用模块进一步包括第一调用子模块,用于在编译所述特定源代码之前,根据所述硬件信息调用所述第一应用程序编程接口以控制所述特定目标代码的执行顺序不被向前调整。
B12、如B11所述的代码控制装置,所述代码控制装置进一步包括第一标识确定模块,用于确定存在用于指示所述第一应用程序编程接口的第一标识。
B13、如B11或B12所述的代码控制装置,所述代码控制装置进一步包括第一编译模块,用于编译用于代表锁定操作的源代码,
所述锁定操作包括:
设置令牌;以及
按照时间顺序向最早请求期望数据的进程分配所述令牌,
其中,所述特定源代码所代表的操作由占有所述令牌的进程执行。
B14、如B10-B13中任一项所述的代码控制装置,所述特定应用程序编程接口包括第二应用程序编程接口,
所述调用模块进一步包括第二调用子模块,用于在编译所述特定源代码之后,根据所述硬件信息调用所述第二应用程序编程接口以控制所述特定目标代码的执行顺序不被向后调整。
B15、如B14所述的代码控制装置,所述代码控制装置进一步包括第二标识确定模块,用于确定存在用于指示所述第二应用程序编程接口的第二标识。
B16、如B10-B15中任一项所述的代码控制装置,所述代码控制装置进一步包括第二编译模块,用于编译用于代表解锁操作的源代码,
所述解锁操作包括:释放所述令牌。
B17、如B10-B16中任一项所述的代码控制装置,所述特定源代码包括用于代表以下操作的源代码:
从存储器中获取期望数据;
修改所述期望数据;以及
将经修改的期望数据存储到所述存储器。
B18、如B10-B17任一项所述的代码控制装置,所述硬件信息包括以下项中的一项或多项:所述设备上的操作系统的内核版本、所述设备的处理器架构。