具体实施方式
为更进一步阐述本发明为实现预定发明目的所采取的技术手段及功效,以下结合附图及较佳实施例,对依据本发明的具体实施方式、结构、特征及其功效,详细说明如后。
图1示出了一种计算机的结构框图。如图1所示,计算机100包括一个或多个(图中仅示出一个)存储器102、存储控制器104、一个或多个处理器106、外设接口108、以及外部设备110。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对计算机100的结构造成限定。例如,计算机100还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。
存储器102可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器102可进一步包括相对于处理器106远程设置的存储器,这些远程存储器可以通过网络连接至计算机100。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
外设接口108将计算机100的输入/输出外设耦合至处理器106以及存储器102。存储器102可用于存储软件程序以及数据,处理器106通过运行存储在存储器102内的软件程序以及模块,从而执行各种功能应用以及数据处理。
存储器102内存储的软件程序与模块例如可包括操作系统122、服务模块124、应用程序编程接口126以及存储管理模块128。操作系统122例如可为Unix、Linux、Windows等操作系统,其可包括各种用于管理系统任务(例如内存管理、存储设备控制、电源管理等)的软件组件和/或驱动,并可与各种硬件或软件组件相互通讯,从而提供其他软件组件的运行环境。服务模块124、应用程序编程接口126以及存储管理模块128运行在操作系统122的基础上,其中,服务模块124用于根据其他计算机发送的数据处理请求进行数据处理并返回处理结果,例如,进行数据查询或者更新存储器102内的数据,而进行数据查询或者更新数据是通过应用程序编程接口126实现的,存储管理模块128用于通过应用程序编程接口126进行存储空间的管理操作以及数据更新操作。
应用程序编程接口126具体可包括以下接口:用于进行初始化的接口、用于关联存储空间的接口、用于创建存储空间的接口、用于切换活动存储空间的接口、以及用于查询活动存储空间的接口。
以下接口,可分别采用C语言伪代码描述如下:
用于进行初始化的接口:int shm_init(struct ShmSwitch*api,intcreate_shm_manager,int shm_manager_key)
用于关联存储空间的接口:int set_data_mem_key(struct ShmSwitch*api,int data_key0,int data_key1)
用于创建存储空间的接口:void*create_data_mem(struct ShmSwitch*api,int data_size)
用于切换活动存储空间的接口:int switch_data_mem(structShmSwitch*api,int data_size)
用于查询活动存储空间的接口:void*get_inuse_data(structShmSwitch*api)。
其中,struct ShmSwitch为用于管理三块存储空间的结构体类型。参阅图2,其为上述的三块存储空间的示意图。第一存储空间201、第二存储空间202、以及管理器存储空间203分别是存储器102内的三个独立的存储空间。在一个实施方式中,第一存储空间201、第二存储空间202、以及管理器存储空间203为由操作系统管理的共享内存。struct ShmSwitch内可存储具体的存储空间(如第一存储空间201与第二存储空间202)与该存储空间的标识符之间的映射关系,由此,根据给定的标识符,可以获取对应的存储空间的索引信息(如内存地址以及大小信息),进而可以获取与标识符对应的存储空间。第一存储空间201的标识符例如可为Key0,而第二存储空间202的标识符例如可为Key1。
进一步地,如图2所示,管理器存储空间内存储有以下信息:第一标识符、第二标识符、以及活动存储空间索引。其中,第一标识符例如可为第一存储空间201的标识符,第二标识符例如可为第二存储空间202的标识符,活动存储空间索引内包括用于表示第一标识符与第二标识符中哪一个是当前处于使用状态的存储空间的标识符的信息(即活动存储空间标识符的索引A_Index)、以及当前处于使用状态的存储空间的大小(Data_Size)。在一个实施方式中,由于管理器存储空间内仅存储两个标识符,而处于使用状态的存储空间只会有一个,不是第一存储空间就201就是第二存储空间202。因此,最少使用一个比特(不是0就是1)的信息来区分哪一个存储空间是处于使用状态的存储空间(活动存储空间)。例如,使用0表示与第一标识符对应的存储空间为活动存储空间,使用1表示与第二标识符对应的存储空间为活动存储空间。当然,本实施例并不限于仅使用一个字节,例如,也可以使用两个字节来表示哪个存储空间是活动存储空间,此时可用00表示与第一标识符对应的存储空间为活动存储空间,01表示与第二标识符对应的存储空间为活动存储空间,10表示与第一标识符或第二标识会对应的存储空间都不是活动存储空间。
活动存储空间索引可占4个字节大小(一个整形数所占用的存储空间)。如上所述,当采用两比特存储活动存储空间标识符的索引(A_Index)时,活动存储空间索引还余下30位的存储空间,这30位的存储空间可用于存储活动存储空间的大小(Data_Size)。在一个实施方式中,活动存储空间的前2位用于存储活动存储空间标识符的索引(可取值00、01、10),后30位用于存储活动存储空间的大小。
用于进行初始化的接口具体进行以下操作:根据create_shm_manager的值判断是否建立管理器存储空间203。例如,当create_shm_manager的值为1时,在存储器102内新创建管理器存储空间203,并在结构体api(struct ShmSwitch类型)内存储管理器存储空间203的索引信息。当create_shm_manager的值为0时,将shm_manager_key指定的存储空间设置为管理器存储空间203。
用于关联存储空间的接口具体进行以下操作:将结构体api内管理器存储空间内的第一标识符与第二标识符分别设定为data_key0与data_key1,第一标识符与第二标识符在设置之后为只读,即设定之后不可再次修改。data_key0与data-key1的值可由用于创建存储空间的接口获取。
用于创建存储空间的接口具体进行以下操作:根据data_size指定的大小创建对应的存储空间,为创建的存储空间分配标识符,并在结构体api内存储标识符与存储空间索引信息。
用于切换活动存储空间的接口具体进行以下操作:修改结构体api所指向的管理器存储空间203内的活动存储空间索引,将活动存储空间标识符的索引修改为更新数据后的存储空间的标识符,并将活动存储空间的大小设定为data_size指定的值。
用于查询活动存储空间的接口具体进行以下操作:读取并返回结构体api指向的存储器管理空间203内活动存储空间的标识符。
通过上述接口,即可实现在不影响数据服务情形下对业务数据的更新操作,以下结合具体的实施例进行描述。此外,可以理解,实现上述功能并不限于通过应用程序编程接口实现,也就是说按照相似的逻辑处理流程,也可以采用专门的代码来实现。
参阅图3,其为第一实施例提供的数据存取方法的示意图。如图3所示,本实施例的方法包括以下步骤:
步骤S101、在存储器中创建第一存储空间、第二存储空间、以及管理器存储空间,并分别将数据文件加载至所述第一存储空间与第二存储空间中。
上述的存储器例如为图1所示的存储器102。参阅图2,步骤S101中,在存储器102中创建第一存储空间201、第二存储空间202以及管理器存储空间203。在一个实施方式中,存储器102为随机存储器(内存),第一存储空间201、第二存储空间202以及管理器存储空间203就是由操作系统管理的共享内存(Shared Memory)。在创建存储空间后,还可以将数据文件加载至第一存储空间201以及第二存储空间202内。上述的数据文件是指运行某种数据处理服务时所需要的数据,依据不同的业务需要,具体数据可以具有不同的结构,存储不同的信息,例如在一个用于查询用户地理位置的系统中,数据文件中应至少包括用户的标识符以及用户的位置信息。
可以理解,步骤S101中创建存储空间可以通过调用上述的用于创建存储空间的接口以及初始化的接口实现,当然本实施例并不限于调用接口实现。
第一存储空间201与第二存储空间202是用于存储具有同样结构的数据,但其大小可能不一致。具体地,在第一存储空间201与第二存储空间202中,可以包括头部区域和数据区域。所述头部区域可用于存储数据区域中数据的索引及摘要信息,例如,存储时间,数据大小,以及数据数目等。所述数据区域可用于存储具体数据的内容。
步骤S102、在所述管理器存储空间中存储用于标记活动存储空间的标识以及所述活动存储空间的大小,所述活动存储空间为所述第一存储空间与第二存储空间其中处于使用状态的存储空间。
如图2所示,管理器存储空间内存储有以下信息:第一标识符、第二标识符、以及活动存储空间索引。其中,第一标识符例如可为第一存储空间201的标识符,第二标识符例如可为第二存储空间202的标识符,活动存储空间索引内包括用于表示第一标识符与第二标识符中哪一个是当前处于使用状态的存储空间的标识符的信息(即活动存储空间标识符的索引)、以及当前处于使用状态的存储空间的大小。
在一个实施方式中,活动存储空间索引可占4个字节大小(一个整形数所占用的存储空间)。如上所述,当采用两个字节存储活动存储空间标识符的索引时,活动存储空间索引还余下30位的存储空间,这30位的存储空间可用于存储活动存储空间的大小。在一个实施方式中,活动存储空间的前2位用于存储活动存储空间标识符的索引(可取值00、01、10),后30位用于存储活动存储空间的大小。
存储活动存储空间索引的过程可包括:将所述标识以及所述活动存储空间的大小以一个整形数(int)进行存储。可以理解,整形数的写操作为原子操作。所谓原子操作,是指计算机运行过程中,不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何切换到另一个线程的操作。也就是说,通过原子操作实现活动存储空间的索引的修改,在修改过程中不可能有其他进程会访问到管理器存储空间内的值。因此,切换活动存储空间的过程不会被其他线程干扰。
步骤S103、在接收到数据更新请求后根据所述标识获取非活动存储空间,所述非活动存储空间为所述第一存储空间与第二存储空间中不同于所述活动存储空间的存储空间。
例如,在接收到数据更新请求后,可以首先查询(例如通过用于查询活动存储空间的接口)活动存储空间索引从而获取非活动存储空间的标识,根据非活动存储空间的标识获取非活动存储空间。
步骤S104、根据所述数据更新请求更新所述非活动存储空间,并将所述管理器存储空间内的活动存储空间的标识更新为所述非活动存储空间的标识。
在获取非活动存储空间后进行数据更新,即根据数据更新请求内包括的信息,进行数据的删除、修改、新增等操作,在完成数据更新后,将活动存储空间替换为进行数据更新后的存储空间,即修改管理器存储空间内的活动存储索引的值。从而,在后续过程中,访问的就是进行数据更新后存储空间内的数据。此时,原先的活动存储空间变为非活动存储空间。
可以理解,为了下一次数据更新时数据的一致性,在完成活动存储空间的切换后,还可将当前活动存储空间内的数据复制至非活动存储空间内。
根据本实施例的方法,通过在非活动存储空间内先完成数据更新,在更新完成后,将活动存储空间切换的方式,可以在数据服务不中断的情形下实现数据更新。进一步地,通过管理器存储空间,实现对两个存储空间的管理,从而可通过应用程序接口实现数据更新的过程,降低数据更新过程的耦合度以及复杂程度。
参阅图4,其为第二实施例提供的数据存取方法的示意图,本实施例的方法与图3所示的方法相似,其不同之处在于,在步骤S104之后还包括:
步骤S201、在接收到数据查询请求后根据所述标识获取所述活动存储空间。
例如,通过上述的用于查询活动存储空间的接口查询活动存储空间的标识符,并进一步根据活动存储空间的标识获取活动存储空间。
步骤S202、根据所述数据查询请求在所述活动存储空间中查询数据,并返回查询结果。
例如,在一个实施方式中,存储空间内存储的是设备的定位信息,每条记录包括设备的唯一标识符(Universal Identification Number,UIN)、、定位信息(例如,经纬度坐标)、以及时间。在步骤S202中,可以查询一个定位点附近(例如,预定距离,如500米范围内)最近一段时间(如半个小时、一个小时、半天、一天、一个星期等)内有哪些设备曾经到达过。
根据本实施例的方法,数据更新与数据查询服务可以同时进行而相互之间没有影响,可操作数据查询服务不被数据更新操作中断。
参阅图5,其为第三实施例提供的数据存取方法的示意图,本实施例的方法与图3所示的方法相似,其不同之处在于,在步骤S202之前还包括:
步骤S203、若所述活动存储空间未被绑定(attach)至当前进程,还将所述活动存储空间绑定至当前进程。
可以理解,在操作系统中,当共享内容未被绑定至当前进程时,当前进程是没有操作该共享内容的权限的。步骤S203是为了使当前进程可以访问活动存储空间内的数据。
根据本实施例的方法,数据更新与数据查询服务可以同时进行而相互之间没有影响,可操作数据查询服务不被数据更新操作中断。
参阅图6,其为第四实施例提供的数据存取装置的示意图,本实施的例数据存取装置包括:创建模块41、管理模块42、更新模块43、以及切换模块44。
创建模块41用于在存储器中创建第一存储空间、第二存储空间、以及管理器存储空间,并分别将数据文件加载至所述第一存储空间与第二存储空间中。
述的存储器例如为图1所示的存储器102。参阅图2,在存储器102中创建第一存储空间201、第二存储空间202以及管理器存储空间203。在一个实施方式中,存储器102为随机存储器(内存),第一存储空间201、第二存储空间202以及管理器存储空间203就是由操作系统管理的共享内存(Shared Memory)。在创建存储空间后,还可以将数据文件加载至第一存储空间201以及第二存储空间202内。上述的数据文件是指运行某种数据处理服务时所需要的数据,依据不同的业务需要,具体数据可以具有不同的结构,存储不同的信息,例如在一个用于查询用户地理位置的系统中,数据文件中应至少包括用户的标识符以及用户的位置信息。
创建存储空间可以通过调用上述的用于创建存储空间的接口以及初始化的接口实现,当然本实施例并不限于调用接口实现。
第一存储空间201与第二存储空间202是用于存储具有同样结构的数据,但其大小可能不一致。具体地,在第一存储空间201与第二存储空间202中,可以包括头部区域和数据区域。所述头部区域可用于存储数据区域中数据的索引及摘要信息,例如,存储时间,数据大小,以及数据数目等。所述数据区域可用于存储具体数据的内容。
管理模块42用于在所述管理器存储空间中存储用于标记活动存储空间的标识以及所述活动存储空间的大小,所述活动存储空间为所述第一存储空间与第二存储空间其中处于使用状态的存储空间。
如图2所示,管理器存储空间内存储有以下信息:第一标识符、第二标识符、以及活动存储空间索引。其中,第一标识符例如可为第一存储空间201的标识符,第二标识符例如可为第二存储空间202的标识符,活动存储空间索引内包括用于表示第一标识符与第二标识符中哪一个是当前处于使用状态的存储空间的标识符的信息(即活动存储空间标识符的索引)、以及当前处于使用状态的存储空间的大小。
在一个实施方式中,活动存储空间索引可占4个字节大小(一个整形数所占用的存储空间)。如上所述,当采用两个字节存储活动存储空间标识符的索引时,活动存储空间索引还余下30位的存储空间,这30位的存储空间可用于存储活动存储空间的大小。在一个实施方式中,活动存储空间的前2位用于存储活动存储空间标识符的索引(可取值00、01、10),后30位用于存储活动存储空间的大小。
存储活动存储空间索引的过程可包括:将所述标识以及所述活动存储空间的大小以一个整形数(int)进行存储。可以理解,整形数的写操作为原子操作。所谓原子操作,是指计算机运行过程中,不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何切换到另一个线程的操作。也就是说,通过原子操作实现活动存储空间的索引的修改,在修改过程中不可能有其他进程会访问到管理器存储空间内的值。因此,切换活动存储空间的过程不会被其他线程干扰。
更新模块43用于在接收到数据更新请求后根据所述标识获取非活动存储空间,所述非活动存储空间为所述第一存储空间与第二存储空间中不同于所述活动存储空间的存储空间。
例如,在接收到数据更新请求后,可以首先查询(例如通过用于查询活动存储空间的接口)活动存储空间索引从而获取非活动存储空间的标识,根据非活动存储空间的标识获取非活动存储空间。
切换模块44用于根据所述数据更新请求更新所述非活动存储空间,并将所述管理器存储空间内的活动存储空间的标识更新为所述非活动存储空间的标识。
在获取非活动存储空间后进行数据更新,即根据数据更新请求内包括的信息,进行数据的删除、修改、新增等操作,在完成数据更新后,将活动存储空间替换为进行数据更新后的存储空间,即修改管理器存储空间内的活动存储索引的值。从而,在后续过程中,访问的就是进行数据更新后存储空间内的数据。此时,原先的活动存储空间变为非活动存储空间。
为了下一次数据更新时数据的一致性,在完成活动存储空间的切换后,还可将当前活动存储空间内的数据复制至非活动存储空间内。
可以理解,创建模块41、管理模块42、更新模块43、以及切换模块44可以是图1所示的存储管理模块128的子功能模块。
根据本实施例的装置,通过在非活动存储空间内先完成数据更新,在更新完成后,将活动存储空间切换的方式,可以在数据服务不中断的情形下实现数据更新。进一步地,通过管理器存储空间,实现对两个存储空间的管理,从而可通过应用程序接口实现数据更新的过程,降低数据更新过程的耦合度以及复杂程度。
参阅图7,其为第五实施例提供的数据存取装置的结构框图。本实施例的装置与图6所示的装置相似,其不同之处在于,还包括:获取模块45以及数据查询模块46。
获取模块45用于在接收到数据查询请求后根据所述标识获取所述活动存储空间。
例如,通过上述的用于查询活动存储空间的接口查询活动存储空间的标识符,并进一步根据活动存储空间的标识获取活动存储空间。
数据查询模块46用于根据所述数据查询请求在所述活动存储空间中查询数据,并返回查询结果。
例如,在一个实施方式中,存储空间内存储的是设备的定位信息,每条记录包括设备的唯一标识符(Universal Identification Number,UIN)、、定位信息(例如,经纬度坐标)、以及时间。在步骤S202中,可以查询一个定位点附近(例如,预定距离,如500米范围内)最近一段时间(如半个小时、一个小时、半天、一天、一个星期等)内有哪些设备曾经到达过。
根据本实施例的装置,数据更新与数据查询服务可以同时进行而相互之间没有影响,可操作数据查询服务不被数据更新操作中断。
参阅图8,其为第六实施例提供的数据存取装置的结构框图。本实施例的装置与图7所示的装置相似,其不同之处在于,还包括:绑定模块47,用于若所述活动存储空间未被绑定(attach)至当前进程,还将所述活动存储空间绑定至当前进程。
可以理解,在操作系统中,当共享内容未被绑定至当前进程时,当前进程是没有操作该共享内容的权限的。绑定是为了使当前进程可以访问活动存储空间内的数据。
根据本实施例的装置,数据更新与数据查询服务可以同时进行而相互之间没有影响,可操作数据查询服务不被数据更新操作中断。
此外,本发明实施例还提供一种计算机可读存储介质,其内存储有计算机可执行指令,上述的计算机可读存储介质例如为非易失性存储器例如光盘、硬盘、或者闪存。上述的计算机可执行指令用于让计算机或者类似的运算装置完成上述的共享存储器数据存取方法中的各种操作。
以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭示如上,然而并非用以限定本发明,任何本领域技术人员,在不脱离本发明技术方案范围内,当可利用上述揭示的技术内容做出些许更动或修饰为等同变化的等效实施例,但凡是未脱离本发明技术方案内容,依据本发明的技术实质对以上实施例所作的任何简介修改、等同变化与修饰,均仍属于本发明技术方案的范围内。