一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种进程间内存共享方法和装置与流程

2022-03-23 04:08:56 来源:中国专利 TAG:


1.本说明书实施例属于计算机技术领域,尤其涉及一种进程间内存共享方法和装置。


背景技术:

2.在计算设备中经常包括多个进程,例如计算设备为服务平台或区块链平台,平台中提供的不同的服务对应不同的进程。进程之间可通过进程间通信(inter-process communication,ipc)的方式进行通信。单机上的ipc方式包括通过共享内存进行进程间通信的方式。在相关技术中,不同进程与相同共享内存区域映射的虚地址通常不同。


技术实现要素:

3.本说明书的目的在于提供一种更有效的进程间内存共享方案。
4.本说明书第一方面提供一种进程间内存共享方法,包括:
5.将第一内存地址发送给第二进程,所述第一内存地址为第一进程中与第一文件的第一部分映射的内存地址;
6.在获知第二进程不能访问第一内存地址之后,在所述第二进程中建立所述第一内存地址与所述第一文件的第一部分的映射。
7.本说明书第二方面提供一种进程间内存共享装置,包括:
8.发送单元,用于将第一内存地址发送给第二进程,所述第一内存地址为第一进程中与第一文件的第一部分映射的内存地址;
9.映射单元,用于在获知第二进程不能访问第一内存地址之后,在所述第二进程中建立所述第一内存地址与所述第一文件的第一部分的映射。
10.本说明书第三方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行第一方面所述的方法。
11.本说明书第四方面提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现第一方面所述的方法。
12.通过本说明书实施例提供的方案,不同进程与相同共享内存映射的虚地址相同,从而应用可以在此共享内存区域中存放与本应用获取的共享内存对应的虚地址相关的地址指针,并且共享内存区域容量不固定,可以动态分配释放内存。
附图说明
13.为了更清楚地说明本说明书实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
14.图1为本说明书一实施例中的主机100的结构示意图;
15.图2为本说明书一实施例中的进程间内存共享方法流程图;
16.图3为本说明书一实施例中的共享区1中的记录内容的示意图;
17.图4为本说明书一实施例中的进程间内存共享装置的架构图。
具体实施方式
18.为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本说明书一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本说明书保护的范围。
19.图1为本说明书一实施例中的主机100的结构示意图。如图1所示,主机100中包括处理器11、内存12和硬盘13。主机100中还运行了进程p1和进程p2。进程是具有一定独立功能的程序关于一个数据集合的一次运行活动。也就是说,进程是计算机中通过由处理器(cpu)执行代码而进行的一个过程或者一个任务。例如,当主机100作为服务器接收到用户的服务请求之后,主机100创建一个进程来提供用户所请求的服务(例如计算服务等)。一个进程可包含若干线程(thread),一个进程中的多个线程可以允许进程同时做多个操作,例如一个线程向磁盘写入文件,另一个线程接收用户的信息等。每个进程在创建时分配有自己的地址空间,该地址空间例如为4g的虚地址空间。各个进程在创建时分配的虚地址空间是相互不同的。
20.如图1所示,内存12中可包括进程共享的物理内存空间,图1中示意示出共享区1、共享区2、共享区3等。在相关技术中,以linux提供共享内存为例,linux提供了3个函数shmget、shmat和shmdt,假设进程p1向进程p2共享内存,进程p1可使用shmget函数获取/创建某个共享内存区域,进程p2可使用shmat函数将由shmget获取的共享内存区域映射到自己的虚地址空间中,shmdt函数用于取消对于共享内存区域的映射。这种方式存在以下问题:1、不同进程通过shmat函数对同一个共享内存区域进行映射时,由于各个进程使用自身的虚地址空间进行对该共享内存区域的映射,因此,这些进程与该共享内存区域映射的虚地址通常不同,从而应用不能在此共享内存区域中存放与本应用获取的共享内存对应的虚地址相关的地址指针;2、共享内存区域容量固定,不能扩缩;3、不适用于动态分配释放内存。
21.本说明书实施例提供一种在进程间共享内存的方案,参考图1,进程p1首先通过mmap函数将预设的虚地址范围中的地址a1与磁盘13中预先存入的文件f1的部分s1映射,从而创建与地址a1对应的共享区(例如共享区3),并在另一个共享区(例如共享区1)中记录地址a1与部分s1的映射关系。其中,该文件f1只有部分s0中有数据,其他部分为不包含数据的空部分(例如部分s1),因此,文件f1实际存入磁盘的部分只有部分s0,该文件f1又可以称为空洞文件。通过使用空洞文件进行共享内存的映射,节省了磁盘存储空间。当进程p1向进程p2共享内存时,进程p1将虚地址a1发送给进程p2。进程p2可从共享区1中读取地址a1与部分s1的映射关系,并通过mmap函数在进程p2中建立地址a1与部分s1的映射,从而在进程p2的地址空间中分配地址a1,即,可通过地址a1对共享区3进行访问。同时,进程p1可以通过调用mremap函数扩充或缩小共享区的大小。
22.通过本说明书实施例提供的方案,进程p1和进程p2各自与共享区3映射的虚地址相同,从而应用可以在此共享内存区域中存放与本应用获取的共享内存对应的虚地址相关的地址指针,并且共享内存区域容量不固定,可以动态分配释放内存。
23.下文将详细描述本说明书实施例提供的进程间共享内存的方案。
24.图2为本说明书一实施例中的进程间内存共享方法流程图,该方法例如由图1所示的主机100执行,包括:
25.步骤s201,在获取进程p1的对堆上内存的分配指令之后,在预设的共享内存地址段中为进程p1分配共享内存地址a1,在进程p1中建立共享内存地址a1与预先生成的文件f1的部分s1的映射,所述部分s1当前不包含内容;
26.步骤s203,将共享内存地址a1发送给进程p2;
27.步骤s205,在获知进程p2不能访问共享内存地址a1之后,在进程p2中建立共享内存地址a1与部分s1的映射。
28.下文将详细描述图2所示方法中的各个步骤。
29.首先,在步骤s201,在获取进程p1的对堆上内存的分配指令之后,在预设的共享内存地址段中为进程p1分配共享内存地址a1,在进程p1中建立共享内存地址a1与预先生成的文件f1的部分s1的映射,所述部分s1当前不包含内容。
30.步骤s201用于在一个进程中创建用于共享给其他进程的共享内存区。
31.为了执行该步骤,主机100中可以预先存储共享内存使用库,每个需要进行内存共享的进程都需要链入共享内存使用库。该共享内存使用库中包括用于替换c库中的内存分配/释放函数的新的函数,其中,c库中的内存分配函数例如包括malloc函数、free函数等函数。以malloc函数为例,假设共享内存使用库中包括用于替换malloc函数的newshm函数。主机100中在开始执行进程p1之后,由属于进程p1的线程(例如线程th1)运行进程p1中的代码。假设线程th1在执行到到进程p1中的malloc函数之后,拦截该malloc函数,将其替换为运行共享内存使用库中的newshm函数。
32.在开始运行newshm函数之后,线程th1首先读取预设的共享区(例如图1中的共享区1),确定是否有用于映射共享内存的磁盘文件。如果没有,则创建用于存入磁盘的空洞文件,并将该空洞文件存入磁盘。如果有,例如,参考图1,线程th1在共享区1中读取了与其他进程的地址空间映射的文件f1,并且文件f1还有未与进程地址空间映射的部分,并且该部分的大小大于等于malloc函数要求分配的地址空间的大小,从而线程th1可通过文件f1创建共享内存。同时线程th1在预设的共享内存地址段(虚地址段)中为线程p1分配需要的地址空间(虚地址),例如地址a1,其中,地址a1的长度需要大于或者等于malloc函数请求分配的地址长度。在主机100中例如可在各个进程启动时通过进程的环境变量通知进程可以用于分配共享内存的共享内存地址段,例如,可将100g-200g的地址段预设为共享内存地址段。线程th1通过读取该环境变量,可获知该共享内存地址段,通过读取共享区1可获知该共享内存地址段中尚未分配的地址,从而可在该尚未分配的地址中为进程p1分配地址a1。
33.之后,线程th1执行在newshm函数中调用的mmap函数,mmap(void*start,size_tlength,intprot,intflags,intfd,off_t offset)。其中,参数start用于指示将映射的共享内存的起始地址,即共享内存地址段中分配给进程p1的地址的起始地址,即地址a1的起始地址;参数length用于指示将映射的共享内存的长度,即将要分配给进程p1的地址a1的
长度;参数prot用于指示将要映射的共享内存的保护方式,该保护方式例如包括:可被执行、可被读取、可被写入、不能存取等方式,这里例如设置为可写入的映射方式;参数flag用于指示将要映射的共享内存的特性,在本实施例中,将flag设置为共享映射(map_shared)对映射区域的写入数据复制回文件;参数fd用于指示将要映射到内存的文件描述符,该文件描述符例如用于指示文件f1;参数offset用于指示将要映射的文件的偏移量,该偏移量用于指示将要映射的文件的部分(例如文件f1中的部分s1)的起始位置。
34.线程th1执行上述mmap函数之后,即在进程p1的地址空间中增加了地址a1,并且地址a1与磁盘中存储的文件f1的s1部分相映射,该地址a1例如对应于图1中的共享区3。其中,为了节省磁盘空间,部分s1初始是空部分,即没有数据。进程p1在未对地址a1写入数据之前,主机100中也未对地址a1分配物理内存空间,只有在进程p1开始对地址a1写入数据之后,主机100才对地址a1分配物理内存空间,使得进程p1可以在分配的物理内存空间中写入数据,所述分配的物理内存空间构成了共享区3。
35.线程th1在建立地址a1与部分s1的映射之后,在共享区1中记录该地址a1与部分s1的映射关系。图3为本说明书一实施例中的共享区1中的记录内容的示意图。如图3所示,线程th1在共享区1中记录的映射关系例如包括:地址a1(起始地址、长度)、文件f1的标识(例如文件名等)、部分s1在文件f1中的偏移(例如offset1)等。线程th1还可以在共享区1中记录进程p1允许的其他进程对地址a1(即共享区3)的访问权限,例如只读权限。共享区1例如可通过已有共享内存技术创建。线程th1在共享区1中记录上述内容以用于提供给其他进程,从而使得其他进程可以共享访问共享区3。可以理解,线程th1不限于通过在共享区中记录的方式将上述信息提供给其他进程,而是可以通过已有的其他线程间通信的方式将上述信息提供给其他进程。
36.在步骤s203,将共享内存地址a1发送给进程p2。
37.进程p2例如由线程th2运行。线程th1在进程p1的过程中在需要将共享区3中存储的信息共享给进程p2时,可向线程th2发送函数(例如函数share()),该share函数的传入参数中包括地址a1,从而将地址a1发送给线程th2。线程th1可通过任意进程间通信的方式将share函数发送给线程th2。
38.在步骤s205,在获知进程p2不能访问共享内存地址a1之后,在进程p2中建立共享内存地址a1与部分s1的映射。
39.进程p2的线程th2在接收到share函数之后,执行share函数。线程th2在执行share函数之后,根据函数的指令访问地址a1。由于地址a1还未分配到进程p2的地址空间中,因此,此时线程th2在访问地址a1时,会发现地址a1不存在,从而接收到异常信号(例如linux下为segment fault信号)。线程th2在接收到异常信号之后,根据异常现场获得出错地址(即地址a1),读取共享区1,以确定地址a1的映射情况。线程th2可从共享区1中读取到,进程p1将地址a1与文件f1的部分s1映射,并且允许其他进程对地址a1的访问权限为只读权限。
40.之后,根据share函数中对mmap函数的调用,线程th2可开始执行mmap(void*start,size_tlength,intprot,intflags,intfd,off_t offset)。与上文类似地,参数start用于指示地址a1的起始地址;参数length用于指示地址a1的长度;参数prot用于指示将要映射的共享内存的保护方式,这里根据共享区1中的记录例如设置为可读取的映射方式;参数flag被设置为共享映射;参数fd用于指示文件f1;参数offset用于指示文件f1中的
部分s1的起始位置。线程th2通过执行mmap函数,将地址a1映射到进程p2的地址空间中,并且使得进程p2对地址a1为只读映射。线程th2在进程p2的地址空间中映射地址a1之后,参考图3,线程th2可以在共享区1中记录进程p2对地址a1与部分s1之间的映射。异常处理结束后,进程p2的线程th2返回到引起异常的指令处(即前述访问地址a1的指令),从而线程th2可从地址a1读取进程p1分享给进程p2的数据,同时不会更改该数据。
41.线程th2在进程p2的地址空间中映射地址a1之后,如果需要将共享区3分享给其他进程(例如进程3,图1和图3中未示出),也可以类似地对进程3的线程发送share函数,从而使得在进程3的地址空间中映射地址a1。
42.进程3在与进程2类似地在自身的地址空间中映射地址a1之后,进程3中的线程在确定不会有其他进程对文件f1进行映射之后,可删除硬盘中的文件f1,以节省磁盘的存储空间。例如,当前只有三个进程,并且文件f1已经全部与三个进程都进行了映射,此时可确定不会有其他进程对文件f1进行映射。
43.在一种实施方式中,进程p1可能希望接收进程p2的针对共享区3中的数据的返回数据,从而,线程th1可预先与创建共享区3类似地在内存12中创建一个共享区2,该共享区2的虚地址例如为共享内存地址段中的地址a2,该共享区2例如与文件f2(图1中未示出)中的一部分映射,并且参考图3,线程th1在共享区1中记录地址a2与文件f2中的部分(offset2)的映射关系,并记录其它进程对地址a2的访问权限为可写权限。从而,线程th1在向线程th2发送上述share函数时,可还在share函数的传入参数中包括地址a2。线程th2从而可根据share函数的指令还在进程p2的地址空间中映射地址a2,以将返回数据写入到地址a2中,参考图3,线程th2还在共享区1中记录进程p2对地址a2的映射。在线程th2在地址a2中写入返回数据之后,线程th1可从地址a2中读取进程p2的返回数据。线程th1在读取该返回数据之后,在确定共享区2不会再使用的情况中,可通过mremap函数取消对地址a2的映射,并在取消映射之后,在共享区1中删除进程p1的地址a2与文件f2中的部分的映射关系。线程th2可在自己使用的共享内存达到预设阈值之后触发回收机制。线程th2在确定进程p2已经不再需要使用共享区2之后,根据共享区1中的记录确定其他进程是否还存在对地址a2的映射,在确定其他进程都已经取消对地址a2的映射之后,可取消对地址a2的映射。
44.在另一种实施方式中,假设线程th2在执行进程p2的过程中需要创建共享区4(图1中未示出),并且通过读取共享区1确定文件f1中还存在未映射的部分。线程th2在确定与共享区4对应的文件f1的部分s2时,参考图1,可将部分s2的偏移地址offset3设置为与部分s1的偏移地址offset1之间的长度为预设长度,从而使得部分s1与部分s2中存在一定长度的未映射部分,以允许进程p1对共享区3的大小进行扩充。例如,主机100可在各个进程的环境变量中设置所述预设长度,从而线程th2可通过读取该环境变量确定部分s2的偏移地址offset3。或者,主机100可在各个进程的环境变量中设置各个进程可用的共享内存地址段中的地址范围,从而线程th2可根据进程p1可用的地址范围确定上述预设长度,从而确定偏移地址offset3。
45.当进程p1中需要扩充共享区3的大小时,线程th1在确定地址a1的长度不足以存储需要共享的数据时,在一种实施方式中,线程th1可执行mremap函数,从而将地址a1与部分s1的映射更新为地址a1和地址a1之后的一段地址与文件f1中部分s1及部分s1之后的一部分的映射,从而扩充共享区3。在扩充共享区3之后,线程th1可在共享区1中对地址a1与部分
s1的映射关系进行更新。在另一种实施方式中,线程th1可执行mmap函数,建立地址a4与文件f1中的部分s3的映射,其中,地址a4为地址a1之后的与地址a1连续的一段地址,部分s3为与部分s1之后的与部分s1连续的部分,从而扩充共享区3,在进行该扩充之后,线程th1可在共享区1中记录地址a4与文件s3的映射关系(图3中未示出)。
46.当线程th1执行到进程p1中的内存释放请求之后,拦截该内存释放请求,对应地执行共享内存使用库中的释放共享内存的函数,该函数中调用mremap函数或者munmap函数,从而释放进程p1的对共享区3的地址的映射,并在共享区1中删除该映射关系。
47.图4为本说明书一实施例中的进程间内存共享装置的架构图,包括:
48.发送单元41,用于将第一内存地址发送给第二进程,所述第一内存地址为第一进程中与第一文件的第一部分映射的内存地址;
49.映射单元42,用于在获知第二进程不能访问第一内存地址之后,在所述第二进程中建立所述第一内存地址与所述第一文件的第一部分的映射。
50.在一种实施方式中,所述映射单元42还用于:在获取第一进程的对堆上内存的分配指令之后,在预设内存地址段中为第一进程分配第一内存地址,在所述第一进程中建立所述第一内存地址与预先生成的第一文件的第一部分的映射,所述第一部分当前不包含内容。
51.在一种实施方式中,所述映射单元42还用于:在确定所述第一内存地址的长度不够的情况下,在所述第一进程中,将所述第一内存地址与所述第一部分的映射更新为第二内存地址与所述第一文件的第二部分的映射,其中,所述第二内存地址包括所述第一内存地址和在所述预设内存地址段中与所述第一内存地址连续的地址,所述第二部分包括所述第一部分和所述第一文件中与所述第一部分连续的部分。
52.在一种实施方式中,所述映射单元42还用于:在确定所述第一内存地址的长度不够的情况下,在所述第一进程中建立第二内存地址与所述第一文件的第二部分的映射,其中,所述第二内存地址为所述预设内存地址段中与所述第一内存地址连续的地址,所述第二部分为所述第一文件中与所述第一部分连续的部分。
53.在一种实施方式中,所述装置还包括:记录单元43,用于在所述第一进程中建立所述第一内存地址与预先生成的第一文件的第一部分的映射之后,在共享的第三内存地址中记录所述第一进程中的所述第一内存地址与所述第一文件的第一部分的第一映射关系;
54.所述映射单元42还用于:在获知第二进程不能访问第一内存地址之后,在所述第三内存地址读取所述第一进程的所述第一内存地址与所述第一文件的第一部分的第一映射关系,根据所述第一映射关系,在所述第二进程中建立所述第一内存地址与所述第一文件的第一部分的映射。
55.在一种实施方式中,所述记录单元43还用于:在所述第三内存地址中记录所述第一进程的第一内存地址与所述第一文件的第一部分的第一映射关系之后,在所述第三内存地址中记录所述第一进程允许的其它进程对所述第一文件的第一部分的访问权限。
56.在一种实施方式中,所述映射单元42还用于,根据所述第三内存地址中记录的其它进程对所述第一文件的第一部分的访问权限,在所述第二进程中建立所述第一内存地址与所述第一文件的第一部分的映射。
57.在一种实施方式中,所述发送单元41还用于:将第四内存地址发送给所述第二进
程,指示将所述第二进程的与所述第一文件的第一部分对应的返回数据写入所述第四内存地址,所述第四内存地址为所述第一进程的与第二文件的部分映射的内存地址。
58.在一种实施方式中,所述第一文件在生成之后被存入磁盘中,所述装置还包括,删除单元44,用于在所述第二进程中建立所述第一内存地址与所述第一文件的第一部分的映射之后,在确定没有其他进程将建立与所述第一文件的映射之后,删除所述磁盘中的所述第一文件。
59.在一种实施方式中,所述装置还包括,释放单元45,用于在获取第一进程的对所述堆上内存的释放指令之后,在所述第一进程中释放所述第一内存地址。
60.在一种实施方式中,所述释放单元45还用于,在确定在所述第一进程中释放所述第一内存地址之后,在所述第二进程中释放所述第一内存地址。
61.本说明书一实施例还提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行如图2所示的方法。
62.本说明书一实施例还提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现如图2所示的方法。
63.在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(programmable logic device,pld)(例如现场可编程门阵列(field programmable gate array,fpga))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片pld上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(hardware description language,hdl),而hdl也并非仅有一种,而是有许多种,如abel(advanced boolean expression language)、ahdl(altera hardware description language)、confluence、cupl(cornell university programming language)、hdcal、jhdl(java hardware description language)、lava、lola、myhdl、palasm、rhdl(ruby hardware description language)等,目前最普遍使用的是vhdl(very-high-speed integrated circuit hardware description language)与verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
64.控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(application specific integrated circuit,asic)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:arc 625d、atmel at91sam、microchip pic18f26k20以及silicone labs c8051f320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以
纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
65.上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为服务器系统。当然,本技术不排除随着未来计算机技术的发展,实现上述实施例功能的计算机例如可以为个人计算机、膝上型计算机、车载人机交互设备、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
66.虽然本说明书一个或多个实施例提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的手段可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的装置或终端产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境,甚至为分布式数据处理环境)。术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、产品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、产品或者设备所固有的要素。在没有更多限制的情况下,并不排除在包括所述要素的过程、方法、产品或者设备中还存在另外的相同或等同要素。例如若使用到第一,第二等词语用来表示名称,而并不表示任何特定的顺序。
67.为了描述的方便,描述以上装置时以功能分为各种模块分别描述。当然,在实施本说明书一个或多个时可以把各模块的功能在同一个或多个软件和/或硬件中实现,也可以将实现同一功能的模块由多个子模块或子单元的组合实现等。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
68.本发明是参照根据本发明实施例的方法、装置(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
69.这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
70.这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计
算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
71.在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。
72.内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flash ram)。内存是计算机可读介质的示例。
73.计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储、石墨烯存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
74.本领域技术人员应明白,本说明书一个或多个实施例可提供为方法、系统或计算机程序产品。因此,本说明书一个或多个实施例可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本说明书一个或多个实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
75.本说明书一个或多个实施例可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本本说明书一个或多个实施例,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
76.本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本说明书的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
77.以上所述仅为本说明书一个或多个实施例的实施例而已,并不用于限制本本说明
书一个或多个实施例。对于本领域技术人员来说,本说明书一个或多个实施例可以有各种更改和变化。凡在本说明书的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在权利要求范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献