具体实施方式
为了使本技术领域的人员更好地理解本申请中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
图1是本申请的一个实施例共享资源的访问控制方法流程图。图1的方法可由共享资源访问控制装置执行。该方法可包括:
S102,根据用户对共享资源的访问请求,获取该共享资源对应的锁标识。
应理解,在本申请实施例中,共享资源对应的锁标识,可以唯一标识该共享对象资源。
应理解,在本申请实施例中,共享对象资源,可以是一种硬件资源,也可以是一种软件资源,例如存储空间资源、操作资源等等。
S104,在资源锁表中维护该锁标识对应的资源锁占用记录。
其中,该资源锁表用于存储共享资源的资源锁占用记录。
S104,根据该维护结果,确定该用户对该共享资源的访问权限。
本申请实施例中,通过根据用户的访问请求维护共享资源在资源锁表中的资源锁占用记录,然后根据维护结果确定用户的访问权限,从而能够以较为简单的方式实现资源锁,减少了实现资源锁的成本。
可选地,作为一个实施例,该资源锁占用记录包括该共享资源的锁使用者和锁过期时间,其中,步骤S104具体可实现为:
在资源锁表中维护该锁标识对应的资源锁占用记录中的锁使用者和锁过期时间。
在本申请实施例的一种具体实现方式中,步骤S104具体可实现为:
如果该资源锁表中不存在该锁标识对应的资源锁占用记录,则在该资源锁表中增加该锁标识对应的资源锁占用记录,将锁使用者记录为该用户,并记录锁过期时间;
其中,步骤S106具体可实现为:
如果该维护结果表示增加该资源锁占用记录成功,确定该用户对该共享资源具备访问权限。
本申请实施例中,当资源锁表中不存在锁标识对应的资源锁占用记录时,确定该用户对该共享资源具备访问权限,并增加锁标识对应的资源锁占用记录以持有对共享资源的锁,从而能够以较为简单的方式实现资源锁,减少了实现资源锁的成本。
在本申请实施例的另一种具体实现方式中,步骤S104具体可实现为:
如果该资源锁表中存在该锁标识对应的资源锁占用记录,且该资源锁占用记录的锁使用者为该用户,则更新锁过期时间;
其中,步骤S106具体可实现为:
如果该维护结果表示更新该资源锁占用记录成功,确定该用户对该共享资源具备访问权限。
本申请实施例中,当资源锁表中存在锁标识对应的资源锁占用记录时,确定该用户对该共享资源具备访问权限,并更新锁标识对应的资源锁占用记录的锁过期时间以保持持有对共享资源的锁,从而能够以较为简单的方式实现资源锁,减少了实现资源锁的成本。
在本申请实施例的再一种具体实现方式中,步骤S104具体可实现为:
如果该资源锁表中存在该锁标识对应的资源锁占用记录,且当前时间大于或等于锁过期时间,则更新该资源锁占用记录的锁使用者为该用户,并更新锁过期时间;
其中,步骤S106具体可实现为:
如果该维护结果表示更新该资源锁占用记录成功,则确定该用户对该共享资源不具备访问权限。
本申请实施例中,当资源锁表中存在锁标识对应的资源锁占用记录时,且当前时间已超出锁过期时间,确定该用户对该共享资源具备访问权限,并更新锁标识对应的资源锁占用记录锁使用者和锁过期时间以持有对共享资源的锁,从而能够以较为简单的方式实现资源锁,减少了实现资源锁的成本。
在本申请实施例的再一种具体实现方式中,步骤S104具体可实现为:
如果该资源锁表中存在该锁标识对应的资源锁占用记录,且该资源锁占用记录的锁使用者不是该用户,且当前时间小于锁过期时间,则不更新该资源锁占用记录;
其中,步骤S106具体可实现为:
如果该维护结果表示未对该资源锁占用记录进行更新,则确定该用户对该共享资源不具备访问权限。
本申请实施例中,当资源锁表中存在锁标识对应的资源锁占用记录时,且该资源锁占用记录的锁使用者不是该用户,且当前时间小于锁过期时间,确定该用户对该共享资源不具备访问权限,从而能够以较为简单的方式实现资源锁,减少了实现资源锁的成本。
可选地,该方法还包括:在对该共享对象的访问结束后,释放该共享资源对应的资源锁占用记录的锁资源。
进一步地,释放该资源锁占用记录的锁资源,包括:
重新获取该共享资源对应的资源锁占用记录;
如果重新获取的该资源锁占用记录中的锁使用者为该用户,则删除该资源锁占用记录。
本申请实施例中,在对该共享对象的访问结束后,重新获取该共享资源对应的资源锁占用记录,并在如果重新获取的该资源锁占用记录中的锁使用者为该用户时删除该资源锁占用记录以释放锁资源,从而能够以较为简单的方式实现资源锁,减少了实现资源锁的成本。
进一步地,释放该资源锁占用记录的锁资源,包括:
重新获取该共享资源对应的资源锁占用记录;
如果重新获取的该资源锁占用记录中的锁使用者不是该用户,则不执行删除操作直接返回。
本申请实施例中,在对该共享对象的访问结束后,重新获取该共享资源对应的资源锁占用记录,并在如果重新获取的该资源锁占用记录中的锁使用者不是该用户时直接返回,从而能够以较为简单的方式实现资源锁,减少了实现资源锁的成本。
可选地,该资源锁表为数据库中的资源锁表。
可选地,该共享资源的多个访问请求来自于同一个分布式***;或者,该共享资源的多个访问请求来自于不同的分布式***。
下面,将结合具体的实施例,对本申请实施例的方案做进一步的描述。
图2是本申请的一个实施例共享资源的锁控制方案示意图。在图2所示的示意图中,以数据库存储共享资源的资源锁表。当然,应理解,在本申请实施例中,也可采用其它方式存储资源锁表,例如,文件列表等等。显然,采用数据库存储的方式是使得资源锁表能够便于共享维护的一种较佳的方式。下面将以图2的锁控制方案为例介绍本申请图1所示实施例。
如图2所示,可在数据库(DB)中建一张资源锁表(RES_LOCK_TABLE)来保存资源锁占用记录。应用***所在的服务器可通过访问该资源锁表,实现共享资源的资源锁。应理解,访问资源锁表的应用***,可以属于一个分布式***,也可以分别属于多个不同的分布式***。
优选地,在图2所示的场景中,可封装访问资源锁表的组件接口,并提供给应用***,与应用***部署在同一个服务器上。例如,在图2所示的场景中,该组件接口可以是Lock_client.jar的组件包。
在资源锁表中,所有的共享资源都可以按规则抽象为一个key字符串来表示,一个key唯一的表示一个共享资源。组件接口可通过传递与key有关的参数对共享资源的锁资源占用记录进行操作。对锁资源占用记录的操作,可包括加锁(lock)、解锁(unlock)、续期锁(renewLock)等类型,相应地,组件接口可包括加锁(lock)、解锁(unlock)、续期锁(renewLock)等API。
当应用请求某个共享资源时,按规则抽象拼接出代表该共享资源的key,以key为参数调用Lock_client.jar提供的锁操作API。组件Lock_client.jar根据锁资源key,通过sql查询/更新/***对应资源锁记录,当sql更新/***成功,则说明锁操作请求成功,否则失败。
可选地,可将共享资源按规则抽象为树形结构的字符串作为资源key,可类似于文件目录结构,例如:/***/业务/场景/操作/任务ID。按这种方式抽象,能够比较形象清晰地表示资源之间的归属和层级关系,也能比较好的确保资源key不重复。根据资源的实际情况,抽象出的树形目录结构层级可长可短,灵活应用,只要能够方便标识出唯一资源即可。当然,还可将共享资源按规则抽象成其它类型的资源key,本申请实施例对此不作限制。
应理解,共享资源,可包括CPU资源、网络端口资源、外设资源、存储资源等。此外,共享资源还可包括操作资源。为便于理解,下面示出了批处理***中使用到的操作资源的资源key的一种抽象方式,如表1所示:
表1:
使用场景 |
资源key |
任务执行 |
/Fundmng/TSKHDL/EXECUTE/TSK_20170207_01102818 |
任务分片执行 |
/Fundmng/TSKHDL/EXECUTE/SLC_20130606_00002781 |
任务扫描 |
/Fundmng/TSKHDL/SCAN |
任务创建 |
/Fundmng/TSKHDL/CREATE |
此外,应理解,资源锁表中,可包括多个字段,锁标识、锁使用者和锁过期时间。其中,锁标识,即共享资源对应的锁标识,如图2所示的资源key;锁使用者,即共享资源在资源锁表记录的当前锁使用者;锁过期时间,即共享资源在资源锁表记录的锁过期时间。当然,还可能存在其它的字段,例如,资源锁表记录ID,等等。资源锁表的一种数据结构如表2所示:
表2:
字段名 |
说明 |
备注 |
Id |
锁id |
LCK_年月日_序列号 |
lockKey |
锁资源key |
锁唯一标识,唯一索引字段 |
lockClient |
锁使用者 |
服务器域名:线程号 |
expiredTime |
锁过期时间 |
超过此时间,锁不再生效 |
基于前面的资源锁表结构和组件接口,结合图3-图5,对图1所示实施例进行说明。在图3-图5所示实施例中,资源锁表名称如图2所示的res_lock_table,资源锁表字段如表2所示的字段结构。
图3是本申请的一个实施例共享资源的访问控制方法的详细流程图。本申请实施例的方案,可应用于对共享资源加锁以占用共享资源的场景中。图3的方法可包括:
302,构造锁资源关键字。
在本申请实施例中,共享资源访问控制装置可根据用户将要访问的共享资源,构造该共享资源的造锁资源关键字。构造锁资源关键字时,只需保证资源关键字能够唯一标识共享资源,与共享资源一一对应,其具体实现方式并不作限制。例如,可通过共享资源的名称、编号、所述设备标识等信息,确定资源关键字,等等。
304,根据关键字查询锁记录。
在得到关键字后,可根据关键字查询锁记录。不妨假设关键字为KEY。
此时,可执行SQL语句“select*from res_lock_table where lockey=KEY”。当然,应理解,此处的SQL语句仅仅是示例性的,在实际的应用中,具体执行的SQL语句可能不同。
306,判断记录是否存在。
如果执行SQL语句返回0条记录,说明记录不存在,则执行步骤308。
如果执行SQL语句返回1条记录,说明记录存在,执行步骤310。
308,***锁记录。
如果不存在KEY对应的锁记录,可在res_lock_table***一条记录,其中的锁资源key(lockKey)为KEY,锁使用者(lockclient)为将要访问该共享资源的用户,过期时间(expiredTime)为用户预计准备停止访问共享资源的时间,不妨假设为TIME。此外,还可在该记录中写入锁id(ID),例如,LCK_年月日_序列号,等等。
执行***操作后,执行步骤318。
310,判断是否同一个锁使用者。
如果存在KEY对应的锁记录,则可获取锁记录中的锁使用者,并判断锁记录的锁使用者与准备访问共享资源的用户是否同一个锁使用者。
如果是,则执行步骤312。
如果否,则执行步骤314.
312,更新过期时间。
如果锁记录的锁使用者与准备访问共享资源的用户是同一个锁使用者,则直接更新锁记录中的过期时间(expiredTime)为用户预计准备停止访问共享资源的时间。
314,判断锁是否超时。
如果锁记录的锁使用者与准备访问共享资源的用户不是同一个锁使用者,则获取锁记录的过期时间,以判断锁是否超时。
如果当前时间晚于过期时间,则说明锁未超时,执行步骤320。
如果当前时间早于或等于过期时间,则说明锁超时,执行步骤316。
316,更新锁使用者和过期时间。
如果当前时间早于或等于过期时间,则将锁使用者(lockclient)更新为将要访问该共享资源的用户,过期时间(expiredTime)更新为用户预计准备停止访问共享资源的时间。
更新完毕后,执行步骤318。
318,加锁成功。
加锁成功后,可返回表示加锁成功的信息,例如,返回锁记录的锁ID。
320,加锁失败。
加锁失败后,可返回表示加锁失败的信息,例如,返回空值或NULL。
当然,应理解,在本申请实施例中,也采用如图2所示的Lock_client.jar组件的调用接口。在本申请实施例中,需要关键字和过期时间两个参数。不妨假设Lock_client.jar中加锁函数为lock函数,则可通过调用lock(KEY,TIME),实现步骤304-320所示的功能。
共享资源访问控制装置可根据lock(KEY,TIME)返回的结果判断是否加锁成功。例如,当lock(KEY,TIME)返回一个锁ID时,表明加锁成功,可以对KEY对应的共享资源进行访问;当lock(KEY,TIME)返回空值或null时,表明加锁失败,不能对KEY对应的共享资源进行访问。
图4是本申请的一个实施例共享资源的访问控制方法的详细流程图。本申请实施例的方案,可应用于对共享资源的资源锁进行续期以持续占用共享资源的场景中。图4的方法可包括:
402,构造锁资源关键字。
步骤402的具体实现可参考图3对应的步骤302。
404,根据关键字查询锁记录。
步骤404的具体实现可参考图3对应的步骤304。
406,判断记录是否存在。
如果记录存在,执行步骤408。
如果记录不存在,执行步骤414。
408,判断是否同一个锁使用者。
如果存在KEY对应的锁记录,则可获取锁记录中的锁使用者,并判断锁记录的锁使用者与准备访问共享资源的用户是否同一个锁使用者。
如果是,执行步骤410。
如果否,执行步骤414。
410,更新过期时间。
步骤410的具体实现可参考图3的步骤312。
412,续期成功。
续期成功后,可返回表示加锁成功的信息,例如,返回锁记录的锁ID。
414,续期失败。
续期失败后,可返回表示续期失败的信息,例如,返回空值或NULL。
当然,应理解,在本申请实施例中,也可采用如图2所示的Lock_client.jar组件的调用接口。在本申请实施例中,需要关键字和过期时间两个参数。不妨假设Lock_client.jar中续期函数为reNewLock函数,则可通过调用reNewLock(KEY,TIME),实现步骤404-414所示的功能。
共享资源访问控制装置可根据lock(KEY,TIME)返回的结果判断是否续期成功。例如,当reNewLock(KEY,TIME)返回一个锁ID时,表明续期成功,可以继续对KEY对应的共享资源进行访问;当reNewLock(KEY,TIME)返回空值或null时,表明续期失败,不能继续对KEY对应的共享资源进行访问。
图5是本申请的一个实施例共享资源的访问控制方法的详细流程图。本申请实施例的方案,可应用于对共享资源的资源锁进行释放以取消占用共享资源的场景中。图5的方法可包括:
502,构造锁资源关键字。
步骤502的具体实现可参考图3对应的步骤302。
504,根据关键字查询锁记录。
步骤504的具体实现可参考图3对应的步骤304。
506,判断记录是否存在。
如果记录存在,执行步骤508。
如果记录不存在,执行步骤516。
508,判断是否同一个锁使用者。
如果存在KEY对应的锁记录,则可获取锁记录中的锁使用者,并判断锁记录的锁使用者与准备访问共享资源的用户是否同一个锁使用者。
如果是,执行步骤510。
如果否,执行步骤516。
510,删除锁记录。
512,判断删除是否成功。
如果删除成功,执行步骤514。
如果删除失败,执行步骤516。
514,解锁成功。
如果解锁成功,可返回解锁成功的信息。例如1表示成功,0表示失败,则返回1。
516,解锁失败。
如果解锁失败,可返回解锁失败的信息。例如1表示成功,0表示失败,则返回0。
当然,应理解,在本申请实施例中,也可采用如图2所示的Lock_client.jar组件的调用接口。在本申请实施例中,需要关键字参数。不妨假设Lock_client.jar中解锁函数为unLock函数,则可通过调用unLock(KEY),实现步骤504-516所示的功能。
共享资源访问控制装置可根据unLock(KEY)返回的结果判断是否续期成功。例如,当unLock(KEY)返回1时,表明解锁成功;当unLock(KEY)返回0时,表明解锁失败。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
图6是本申请的一个实施例电子设备的结构示意图。请参考图6,在硬件层面,该电子设备包括处理器,可选地还包括内部总线、网络接口、存储器。其中,存储器可能包含内存,例如高速随机存取存储器(Random-Access Memory,RAM),也可能还包括非易失性存储器(non-volatile memory),例如至少1个磁盘存储器等。当然,该电子设备还可能包括其他业务所需要的硬件。
处理器、网络接口和存储器可以通过内部总线相互连接,该内部总线可以是ISA(Industry Standard Architecture,工业标准体系结构)总线、PCI(PeripheralComponent Interconnect,外设部件互连标准)总线或EISA(Extended Industry StandardArchitecture,扩展工业标准结构)总线等。所述总线可以分为地址总线、数据总线、控制总线等。为便于表示,图6中仅用一个双向箭头表示,但并不表示仅有一根总线或一种类型的总线。
存储器,用于存放程序。具体地,程序可以包括程序代码,所述程序代码包括计算机操作指令。存储器可以包括内存和非易失性存储器,并向处理器提供指令和数据。
处理器从非易失性存储器中读取对应的计算机程序到内存中然后运行,在逻辑层面上形成共享资源访问控制装置。处理器,执行存储器所存放的程序,并具体用于执行以下操作:
根据用户对共享资源的访问请求,获取该共享资源对应的锁标识;
在资源锁表中维护该锁标识对应的资源锁占用记录,该资源锁表用于存储共享资源的资源锁占用记录;
根据该维护结果,确定该用户对该共享资源的访问权限。
上述如本申请图1、图3-图5所示实施例揭示的共享资源访问控制装置执行的方法可以应用于处理器中,或者由处理器实现。处理器可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器可以是通用处理器,包括中央处理器(CentralProcessing Unit,CPU)、网络处理器(Network Processor,NP)等;还可以是数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific IntegratedCircuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本申请实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本申请实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器,处理器读取存储器中的信息,结合其硬件完成上述方法的步骤。
该电子设备还可执行图1的方法,并实现共享资源访问控制装置在图1、图3-图5所示实施例的功能,本申请实施例在此不再赘述。
当然,除了软件实现方式之外,本申请的电子设备并不排除其他实现方式,比如逻辑器件抑或软硬件结合的方式等等,也就是说以下处理流程的执行主体并不限定于各个逻辑单元,也可以是硬件或逻辑器件。
本申请实施例还提出了一种计算机可读存储介质,该计算机可读存储介质存储一个或多个程序,该一个或多个程序包括指令,该指令当被包括多个应用程序的便携式电子设备执行时,能够使该便携式电子设备执行图1所示实施例的方法,并具体用于执行以下方法:
根据用户对共享资源的访问请求,获取该共享资源对应的锁标识;
在资源锁表中维护该锁标识对应的资源锁占用记录,该资源锁表用于存储共享资源的资源锁占用记录;
根据该维护结果,确定该用户对该共享资源的访问权限。
图7是本申请的一个实施例共享资源访问控制装置700的结构示意图。请参考图7,在一种软件实施方式中,共享资源访问控制装置700可包括:
获取单元710,根据用户对共享资源的访问请求,获取该共享资源对应的锁标识;
维护单元720,在资源锁表中维护该锁标识对应的资源锁占用记录,该资源锁表用于存储共享资源的资源锁占用记录;
确定单元730,根据该维护结果,确定该用户对该共享资源的访问权限。
本申请实施例中,通过根据用户的访问请求维护共享资源在资源锁表中的资源锁占用记录,然后根据维护结果确定用户的访问权限,从而能够以较为简单的方式实现资源锁,减少了实现资源锁的成本。
可选地,作为一个实施例,该资源锁占用记录包括该共享资源的锁使用者和锁过期时间,维护单元720具体用于:
在资源锁表中维护该锁标识对应的资源锁占用记录中的锁使用者和锁过期时间。
在本申请实施例的一种具体实现方式中,维护单元720具体用于:如果该资源锁表中不存在该锁标识对应的资源锁占用记录,则在该资源锁表中增加该锁标识对应的资源锁占用记录,将锁使用者记录为该用户,并记录锁过期时间;
其中,确定单元730具体用于:如果该维护结果表示增加该资源锁占用记录成功,确定该用户对该共享资源具备访问权限。
在本申请实施例的另一种具体实现方式中,维护单元720具体用于:如果该资源锁表中存在该锁标识对应的资源锁占用记录,且该资源锁占用记录的锁使用者为该用户,则更新锁过期时间;
其中,确定单元730具体用于:如果该维护结果表示更新该资源锁占用记录成功,确定该用户对该共享资源具备访问权限。
在本申请实施例的再一种具体实现方式中,维护单元720具体用于:如果该资源锁表中存在该锁标识对应的资源锁占用记录,且当前时间大于或等于锁过期时间,则更新该资源锁占用记录的锁使用者为该用户,并更新锁过期时间;
其中,确定单元730具体用于:如果该维护结果表示更新该资源锁占用记录成功,则确定该用户对该共享资源不具备访问权限。
在本申请实施例的再一种具体实现方式中,维护单元720具体用于:如果该资源锁表中存在该锁标识对应的资源锁占用记录,且该资源锁占用记录的锁使用者不是该用户,且当前时间小于锁过期时间,则不更新该资源锁占用记录;
其中,确定单元730具体用于:如果该维护结果表示未对该资源锁占用记录进行更新,则确定该用户对该共享资源不具备访问权限。
共享资源访问控制装置700还包括释放单元740,在对该共享对象的访问结束后,释放该共享资源对应的资源锁占用记录的锁资源。
可选地,作为一个实施例,获取单元710用于重新获取该共享资源对应的资源锁占用记录;释放单元740用于如果重新获取的该资源锁占用记录中的锁使用者为该用户,则删除该资源锁占用记录。
可选地,作为一个实施例,获取单元710用于重新获取该共享资源对应的资源锁占用记录;释放单元740用于如果重新获取的该资源锁占用记录中的锁使用者不是该用户,则不执行删除操作直接返回。
可选地,该资源锁表为数据库中的资源锁表。
可选地,该共享资源的多个访问请求来自于同一个分布式***;或者,该共享资源的多个访问请求来自于不同的分布式***。
总之,以上所述仅为本申请的较佳实施例而已,并非用于限定本申请的保护范围。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
上述实施例阐明的***、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于***实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。