CN103257888A - 一种对缓冲队列并发执行读、写访问的方法和设备 - Google Patents
一种对缓冲队列并发执行读、写访问的方法和设备 Download PDFInfo
- Publication number
- CN103257888A CN103257888A CN2012100355758A CN201210035575A CN103257888A CN 103257888 A CN103257888 A CN 103257888A CN 2012100355758 A CN2012100355758 A CN 2012100355758A CN 201210035575 A CN201210035575 A CN 201210035575A CN 103257888 A CN103257888 A CN 103257888A
- Authority
- CN
- China
- Prior art keywords
- data
- buffer queue
- play amount
- address
- start address
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本申请公开了一种对缓冲队列并发执行读、写访问的方法和设备,主要内容包括:在实现并行对缓冲队列执行读、写访问时,不再利用锁操作,而是通过确定发起写访问的第一进程可执行写操作的起始地址,从该起始地址开始,将待写数据写入缓冲队列的空闲内存中,以及确定发起读访问的第二进程确定可执行读操作的起始地址,从该起始地址开始,依次读取数据,避免了读、写操作同时对缓冲队列的数据区中的数据执行不同操作引起的数据混乱和数据结构体一致性被破坏的问题,以及利用锁操作控制多个进程的并发读写,性能低下,并且锁操作过程中CPU资源消耗大的问题。
Description
技术领域
本申请涉及计算机数据存储领域,尤其涉及一种对缓冲队列并发执行读、写访问的方法和设备。
背景技术
随着计算机技术的不断发展,大多数的服务器已配置了多核CPU,为了提高服务器的CPU利用率,每个CPU可采用多进程的工作方式,每一进程负责一个应用程序,各进程间可通过共享内存的缓冲队列进行通信。
在进程间进行通信的过程中,一些进程需要向共享内存的缓冲队列中写入数据,而另一些进程则需要从共享内存的缓冲队列中读取数据,因此,可能存在不同的进程同时对共享内存的缓冲队列发起读、写访问的情况。一旦出现这种情况,将会导致缓冲队列中的数据混乱,并使得该数据结构体的一致性被破坏。
为了避免上述问题,可采用锁操作的方式来限制读、写访问的并发执行,所述锁操作是服务器为保证进程对共享内存的互斥访问采用的一种保护措施,具体是指:当多进程同时发起对共享内存的访问时,要求进程首先获取共享内存的互斥锁,获得互斥锁的进程具有访问共享内存的权限,而没有获得互斥锁的进程不具有访问共享内存的权限,获得互斥锁的进程访问共享内存,并在结束对共享内存的访问时,释放互斥锁,其他进程可根据获取的互斥锁依次访问共享内存。
需要说明的是,获得互斥锁的进程在访问共享内存时享有对该共享内存的排他访问权限。
例如,当进程A和进程B同时需要对共享内存的缓冲队列执行访问(假设进程A要对缓冲队列进行写访问,进程B要对缓冲队列进行读访问)时,进程A和进程B需要先请求获取针对该缓冲队列中的互斥锁。假设进程A先获取了互斥锁,则进程A获得了对共享内存的缓冲队列进行访问的资格,此时进程B不能对该缓冲队列进行访问,只能等待进程A访问结束后释放互斥锁。
进程A获得互斥锁后,可执行以下步骤:
首先,利用获取的互斥锁对该缓冲队列执行加锁操作,目的是在进程A对该缓冲队列执行操作的过程中阻止其他进程对该缓冲队列的操作;
然后,进程A将数据写入加锁后的缓冲队列中;
最后,在写操作执行结束后,进程A释放加载在缓冲队列上的互斥锁,此时进程B可获得互斥锁,共享缓冲队列将响应进程B的操作。
利用锁操作的方式虽然避免了不同进程对缓冲队列进行同时操作时引起的数据混乱和访问数据出错的问题,但是利用锁操作方式在不同的操作系统中有不同的实现方式和使用规则,因此对服务器硬件和操作系统的依赖性很大,这使得共享内存的缓冲队列并发互斥操作的可移植性差,并且通过锁操作的方式控制多个进程的并发执行,效率较低,也使得在执行锁操作的过程与进程间互换时造成CPU资源的浪费。
发明内容
本申请实施例提供了一种并发读、写队列的方法和设备,用以解决不同进程并行发起对缓冲队列读、写访问时,引起缓冲队列中数据混乱和利用互斥锁方式导致读、写访问效率低的问题。
一种对缓冲队列并发执行读、写访问的方法,该方法包括:
在第一进程和第二进程并行对同一缓冲队列分别发起写访问和读访问时,所述第一进程确定缓冲队列的数据区中可进行写操作的起始地址,并从所述写操作的起始地址开始,依次将待存数据的数据长度和数据内容写入缓冲队列的数据区的连续空闲内存中;
所述第二进程确定缓冲队列的数据区中可进行读操作的起始地址,并从所述读操作的起始地址开始,依次读取数据。
一种对缓冲队列并发执行读、写访问的设备,该设备包括:
第一进程确定模块,用于在第一进程对以缓冲队列发起写访问时,确定缓冲队列的数据区中可进行写操作的起始地址;
第一进程写访问模块,用于从第一进程确定模块确定的所述写操作的起始地址开始,依次将待存数据的数据长度和数据内容写入缓冲队列的数据区的连续空闲内存中;
第二进程确定模块,用于在第二进程并行对以同一缓冲队列发起读访问时,确定缓冲队列的数据区中可进行读操作的起始地址;
第二进程读访问模块,用于从第二进程确定模块确定的所述读操作的起始地址开始,依次读取数据。
本申请有益效果如下:
本申请实施例在实现并行对缓冲队列执行读、写访问时,不再利用锁操作,而是通过确定发起写访问的第一进程可执行写操作的起始地址,从该起始地址开始,将待写数据写入缓冲队列的空闲内存中,以及确定发起读访问的第二进程确定可执行读操作的起始地址,从该起始地址开始,依次读取数据,避免了读、写操作同时对缓冲队列的数据区中的数据执行不同操作引起的数据混乱和数据结构体一致性被破坏的问题,以及利用锁操作控制多个进程的并发读写,性能低下,并且锁操作过程中CPU资源消耗大的问题。
附图说明
图1为连续内存的数据结构图;
图2(a)为缓冲队列的结构示意图;
图2(b)为缓冲队列的结构示意图;
图3为实施例一的一种对缓冲队列并发执行读、写访问的方法流程图;
图4为实施例二的一种对缓冲队列并发执行读、写访问的方法流程图;
图5(a)为对缓冲队列并发执行读、写访问的写操作的结构示意图;
图5(b)为对缓冲队列并发执行读、写访问的写操作的结构示意图;
图6(a)为对缓冲队列并发执行读、写访问的读操作的结构示意图;
图6(b)为对缓冲队列并发执行读、写访问的读操作的结构示意图;
图7为实施例三的一种对缓冲队列并发执行读、写访问的设备的结构示意图。
具体实施方式
为了实现本申请的目的,本申请实施例提供了一种对缓冲队列并发执行读、写访问的方法和设备,在第一进程和第二进程并行对同一缓冲队列分别发起读访问和写访问时,发起写访问的第一进程根据读取的第一偏移量确定缓冲队列的数据区中可进行写操作的起始地址,以该起始地址为开始,依次将待写数据写入缓冲队列的数据区的空闲内存中;发起读访问的第二进程根据读取的第二偏移量确定缓冲队列的数据区中可进行读操作的起始地址,以该起始地址为开始,依次读取数据。
与现有技术相比,在实现并行对缓冲队列执行读、写访问时,不再利用锁操作,这减少了CPU的开销,保证了读、写操作的效率;此外,在并行对缓冲队列执行读、写操作时,限定了写操作和读操作执行的内存空间,避免了读、写操作同时对缓冲队列的数据区中的数据执行不同操作引起的数据混乱和数据结构体一致性被破坏的问题。
在执行各实施例的方案之前,以Linux操作系统为例,在其共享内存中开辟一段连续的内存,并初始化该内存,得到缓冲队列的初始状态。需要说明的是,本申请即可以使用在Linux系统中,也可以使用在具有Linux系统特性的其他操作系统中;所述缓冲队列可以是循环队列,也可以是具有循环队列的特性的缓冲队列。
如图1所示,其为连续内存的数据结构图,在内存初始化的过程中,将该内存划分成头部区Header和数据区Data两部分,头部用来标识缓冲队列的当前状态,数据区用来存储实际的数据。其中,头部区中包含以下参数用来标识缓冲队列的当前状态:
iBufSize:记录数据区的内存大小,不包括头部本身占用的内存空间,用Header->iBufSize表示数据区内存大小的值。例如:缓冲队列数据区的内存大小为20M,则Header->iBufSize=20M;
iReserveLen:用于判断缓冲队列是空还是满,可通过设定的字段长度表示,例如:设定为8字段,用Header->iReserveLen表示该设定的字段长度值,例如:Header->iReserveLen=8;
iEnd:表示缓冲队列的数据区最后一个有效字符所在地址与数据区首地址之间的第一偏移量,即根据该第一偏移量和数据区首地址可确定数据区的最后一个有效字符所在的位置,用Header->iEnd表示第一偏移量对应的数值;
iBegin:表示缓冲队列的数据区第一个有效字符所在地址与数据区首地址之间的第二偏移量,即根据该第二偏移量和数据区首地址可确定数据区的第一个有效字符所在的位置,用Header->iBegin表示第二偏移量对应的数值。
需要说明的是,第一偏移量和第二偏移量中涉及的“第一”和“第二”,没有特殊含义,只是用来区分偏移量的不同。
如图2(a)所示,其为缓冲队列的结构示意图。其中,第一偏移量大于第二偏移量,图中阴影部分表示已存储数据占用的内存空间,图中空白部分表示可存储数据的内存空间。
如图2(b)所示,其为缓冲队列的结构示意图。其中,第一偏移量小于第二偏移量,图中阴影部分表示已存储数据占用的内存空间,空白部分表示可存储数据的内存空间。
当缓冲队列首次被创建时,需要确定缓冲队列的首地址pBuf和长度iSize。当长度iSize不大于头部区长度HeaderLen、数据长度Marklen和Header->iReserveLen之和时,创建失败;否则,将pBuf作为头部区Header的首地址,即Header->pBuf,将pBuf位移HeaderLen(表示头部区Header的长度值)后指定的地址作为数据区Data的首地址,数据区Header->iBufSize=iSize-HeaderLen,其中,数据区Header->iBegin=Header->iEnd=0。
下面结合说明书附图对各实施例进行详细描述。
实施例一:
如图3所示,其为本实施例一的一种对缓冲队列并发执行读、写访问的方法流程图。本实施例一适用于一个进程对一个缓冲队列进行读操作时,另一个进程并行对同一缓冲队列进行写操作。本实施例一的具体步骤包括:
步骤101:第一进程和第二进程并行对同一缓冲队列分别发起写访问和读访问,发起写访问的第一进程执行步骤102,发起读访问的第二进程执行步骤103。
在本步骤101的实施方案中,第一进程和第二进程并行对同一缓冲队列分别发起写访问和读访问,具体可以包括以下几种情况:
第一种情况:在第一进程发起对缓冲队列的写访问时,第二进程同时发起对该缓冲队列的读访问;
第二种情况:在第一进程对缓冲队列进行写访问的过程中,第二进程发起对该缓冲队列的读访问;
第三种情况:在第二进程对缓冲队列进行读访问的过程中,第一进程发起对该缓冲队列的写访问。
需要说明的是,本步骤101中,“第一进程”和“第二进程”中的“第一”和“第二”没有特殊含义,只是用于区分进程的不同,可以是第一进程发起写访问,第二进程发起读访问;也可以是第一进程发起读访问,第二进程发起写访问。
步骤102:第一进程确定缓冲队列的数据区中可进行写操作的起始地址,并从所述写操作的起始地址开始,依次将待存数据的数据长度和数据内容写入缓冲队列的数据区的连续空闲内存中。具体包括:
步骤1021:第一进程从缓冲队列的头部区中读取第一偏移量(即Header->iEnd),所述Header->iEnd是该缓冲队列的数据区最后一个有效字符所在地址与该数据区首地址之间的偏移量。
在步骤1021的实施方案中,第一进程发起对缓冲队列的写访问,那么确定写操作的起始地址是本次写访问的关键步骤。在对缓冲队列进行初始化操作时,缓冲队列的头部区中存储iEnd参数,且iEnd参数的属性是根据每一进程写入数据的大小不同而时时被更新,因此,第一进程从缓冲队列的头部区读取Header->iEnd后,可以根据Header->iEnd确定当前缓冲队列的数据区中可进行写操作的起始地址,根据该起始地址,第一进程就可以对该缓冲队列进行写访问。
步骤1022:第一进程根据所述第一偏移量(即Header->iEnd)确定缓冲队列的数据区中可进行写操作的起始地址。
在步骤1022的实施方案中,第一进程根据从缓冲队列的头部区读取的Header->iEnd和数据区的首地址,确定该缓冲队列的数据区最后一个有效字符所在地址,则第一进程对该缓冲队列的数据区中可进行写操作的起始地址为确定的该缓冲队列的数据区最后一个有效字符所在地址的下一个地址。
需要说明的是,如图2(a)所示,从该缓冲队列的数据区最后一个有效字符所在地址的下一个地址开始至缓冲队列的数据区的尾地址,以及从缓冲队列的数据区首地址至该缓冲队列的数据区第一个有效字符所在地址之间的内存空间为该缓冲队列的数据区的空闲内存空间;如图2(b)所示,从该缓冲队列的数据区最后一个有效字符所在地址的下一个地址开始至该缓冲队列的数据区第一个有效字符所在地址之间的内存空间为该缓冲队列的数据区的空闲内存空间,所述空闲内存空间可以用来存储数据。
步骤1023:第一进程从所述写操作的起始地址开始,依次将待存数据的数据长度和数据内容写入缓冲队列的数据区的空闲内存中,此时完成写操作,执行步骤104。
在本步骤1023的实施方案中,第一进程将待存数据写入缓冲队列的数据区的空闲内存中之前,判断该缓冲队列的数据区的空闲内存大小是否不小于待存数据所需的内存大小,若是,则从所述写操作的起始地址开始,依次将待存数据的数据长度和数据内容写入缓冲队列的数据区的空闲内存中;否则,返回第一进程写入失败的结果。
步骤103:第二进程确定缓冲队列的数据区中可进行读操作的起始地址,并从所述读操作的起始地址开始,依次读取数。具体包括:
步骤1031:第二进程从缓冲队列的头部区中读取第二偏移量(即Header->iBegin),所述Header->iBegin是该缓冲队列的数据区第一个有效字符所在地址与该数据区首地址之间的偏移量。
在步骤1031的实施方案中,第二进程发起对缓冲队列的读访问,那么确定第二进程可执行读操作的起始地址是本次读访问的关键步骤。在对缓冲队列进行初始化操作时,缓冲队列的头部区中存储iBegin参数,且iBegin参数的属性是根据每一进程读取数据的大小不同而时时被更新,因此,第二进程从缓冲队列的头部区读取Header->iBegin后,可以根据Header->iBegin确定缓冲队列的数据区中可进行读操作的起始地址,根据该起始地址,第二进程就可以对该缓冲队列进行读访问。
步骤1032:第二进程根据所述第二偏移量(即Header->iBegin)确定缓冲队列的数据区中可进行读操作的起始地址。
在步骤1032的实施方案中,第二进程根据从缓冲队列的头部区读取的Header->iBegin和数据区的首地址,确定该缓冲队列的数据区第一个有效字符所在地址,则第二进程对该缓冲队列的数据区中可进行读操作的起始地址为确定的该缓冲队列的数据区第一个有效字符所在地址。
步骤1033:第二进程从所述读操作的起始地址开始,依次读取数据,此时在完成读操作时,执行步骤104。
需要说明的是,如图2(a)所示,从缓冲队列的数据区第一个有效字符所在地址开始,至该缓冲队列的数据区最后一个有效字符所在地址之间的数据为可读取的数据;如图2(b)所示,从缓冲队列的数据区第一个有效字符所在地址开始至缓冲队列的数据区的尾地址之间的数据,以及从缓冲队列的数据区首地址开始至缓冲队列的数据区最后一个有效字符所在地址之间的数据,为可读取的数据。
此外,第二进程在从所述读操作的起始地址开始依次读取数据时,数据一旦被进程读访问,则进程在读访问过程中读取的数据将不再存储在缓冲队列中,数据被访问后释放该数据所占用的内存空间。
步骤104:第一进程和第二进程分别在对缓冲队列的写访问和读访问结束后,分别更新缓冲队列的头部区中已存储的第一偏移量和第二偏移量。具体包括:
第一进程在完成对该缓冲队列的写访问时,将本次写操作执行完成后该缓冲队列的数据区最后一个有效字符所在地址与该数据区首地址之间的偏移量作为新的第一偏移量,并更新缓冲队列的头部区中已存储的第一偏移量;
第二进程在完成对该缓冲队列的读访问时,将本次读操作执行完成后该缓冲队列的数据区第一个有效字符所在地址与该数据区首地址之间的偏移量作为新的第二偏移量,并更新缓冲队列的头部区中已存储的第二偏移量。
由于第一进程在执行完写操作后,更新相应的第一偏移量,使得下一次发起写访问的进程能够快速定位可执行写操作的起始地址,同时第二进程在执行完读操作后,更新相应的第二偏移量,使得下一次发起读访问的进程能够快速定位可执行读操作的起始地址,提高了并行执行读操作和写操作的效率,此外,偏移量的时时更新,避免了访问时数据混乱的问题,以及数据结构体一致性被破坏的问题。
通过实施例一的方案,限定了发起写访问的第一进程将缓冲队列的数据区最后一个有效字符所在地址的下一个地址为可进行写操作的起始地址,从确定的起始地址开始,依次将待存数据写入缓冲队列的数据区的空闲内存中;同时限定了发起读访问的第二进程将缓冲队列的数据区第一个有效字符所在地址为可进行读操作的起始地址,从确定的起始地址开始,依次读取数据,这样,在两个进程并行对缓冲队列发起读访问和写访问时,根据不同访问请求所确定的执行操作的起始地址不同,分别对缓冲队列执行相应的操作,实现了无锁状态下对缓冲队列进行并行访问,提高了并行读、写访问缓冲队列的效率。
同时,在写访问时,缓冲队列的剩余空间不能满足待写数据所需的内存空间时,将返回写失败的结果,保证了并行对缓冲队列执行不同操作时,避免了数据被覆盖的问题,进而消除了缓冲队列中数据发生混乱,使得缓冲队列数据结构保持一致。
实施例二:
如图4所示,为本实施例二的一种对缓冲队列并发执行读、写访问的方法流程图。本实施例二是实施例一中各步骤的详细描述,具体包括以下步骤:
步骤201:第一进程和第二进程并行对同一缓冲队列分别发起写访问和读访问。
需要说明的是,在本实施例二中,假设第一进程对所述缓冲队列发起写访问,第二进程对所述缓冲队列发起读访问。
步骤202:第一进程从缓冲队列的头部区中读取该缓冲队列的数据区最后一个有效字符所在地址与该数据区首地址之间的第一偏移量(即Header->iEnd),第二进程从缓冲队列的头部区中读取该缓冲队列的数据区第一个有效字符所在地址与该数据区首地址之间的第二偏移量(即Header->iBegin)。
步骤203:比较所述第一偏移量和第二偏移量的大小,根据比较结果分别执行不同的操作。具体包括:
第一种情况:若第一偏移量与第二偏移量相同且为0,则说明当前缓冲队列为空,执行读访问失败;允许从缓冲队列的数据区的首地址开始,执行写访问。
第二种情况:若第一偏移量与第二偏移量差值的绝对值不大于设定的字段长度,则说明当前缓冲队列为满队列,执行写访问失败;允许从缓冲队列的数据区第一个有效字符所在地址开始,执行读访问。
第三种情况:若第一偏移量大于第二偏移量,则执行步骤204。
第四种情况:若第一偏移量小于第二偏移量,则执行步骤205。
步骤204:若所述第一偏移量大于所述第二偏移量时,第一进程对所述缓冲队列执行以下写操作,第二进程对所述缓冲队列执行以下读操作,如图2(a)所示的缓冲队列。具体包括:
1、第一进程对所述缓冲队列执行写操作,具体包括:
步骤11:第一进程从缓冲队列的头部区中读取该缓冲队列的数据区最后一个有效字符所在地址与该数据区首地址之间的第一偏移量(即Header->iEnd)。
步骤12:第一进程根据所述Header->iEnd和缓冲队列的数据区首地址确定缓冲队列的数据区中可进行写操作的起始地址(即Data首地址+Header->iEnd)。
步骤13:第一进程从缓冲队列的头部区中读取该缓冲队列的数据区内存大小值Header->iBufSize,将该数据区内存大小值与第一偏移量的第一差值(即Header->iBufSize-Header->iEnd)与存储待存数据所需的内存大小值进行比较,根据比较结果的不同执行不同的操作。
所述待存数据所需的内存大小值包括:数据长度MarkLen和数据内容所需内存大小Len。
执行操作具体包括:
若所述第一差值不小于存储待存数据所需的内存大小值(即Header->iBufSize-Header->iEnd>MarkLen+Len)时,则执行步骤14;
否则,第一进程确定所述第一差值与第二偏移量之和,并将和值(即Header->iBufSize-Header->iEnd+Header->iBegin)与存储待存数据所需的内存大小值进行比较,若所述和值不小于存储待存数据所需的内存大小值(即Header->iBufSize-Header->iEnd+Header->iBegin>MarkLen+Len)时,则执行步骤15;若所述和值小于存储待存数据所需的内存大小值(即Header->iBufSize-Header->iEnd+Header->iBegin<MarkLen+Len),则第一进程写入失败。
步骤14:若所述第一差值不小于存储待存数据所需的内存大小值(即Header->iBufSize-Header->iEnd>MarkLen+Len)时,第一进程从所述写操作的起始地址开始依次将待存数据写入数据区的空闲内存中。具体包括:
首先,第一进程确定待存数据的数据长度MarkLen,从所述写操作的起始地址(即Data首地址+Header->iEnd)开始将确定的所述MarkLen写入数据区的连续空闲内存中。
然后,第一进程确定待存数据的数据内容所需的内存大小Len,从所述写操作的起始地址位移MarkLen个字段后对应的地址(即Data首地址+Header->iEnd+MarkLen)开始,将确定的所述Len写入数据区的连续空闲内存中。
最后,第一进程在完成本次写访问时,将第一偏移量与MarkLen和所述Len三者之和(即Header->iEnd+MarkLen+Len)作为新的第一偏移量,并更新缓冲队列的头部区中已存储的第一偏移量。
需要说明的是,确定的新的第一偏移量的方法还可以是:将第一偏移量与MarkLen和所述Len三者之和,利用得到的和值与Header->iBufSize作取模运算得到余值(即(Header->iEnd+MarkLen+Len)/Header->iBufSize的余值),将该余值作为新的第一偏移量。
步骤15:若所述第一差值小于存储待存数据所需的内存大小值,且所述第一差值与第二偏移量之和对应的和值不小于存储待存数据所需的内存大小值时,第一进程从所述写操作的起始地址开始依次写入待存数据,并在写至数据区尾地址时,再从数据区首地址继续写入待存数据。具体包括:
第一种情况,如图5(a)所示:
若所述第一差值小于存储待存数据所需的内存大小值,且所述第一差值不小于待存数据的数据长度MarkLen(即Header->iBufSize-Header->iEnd>MarkLen)时,执行以下操作:
第一步:第一进程确定待存数据的数据长度MarkLen可连续存放至缓冲队列中,从所述写操作的起始地址(即Data首地址+Header->iEnd)开始,将所述MarkLen写入数据区的连续空闲内存中。
第二步第一进程确定所述第一差值与MarkLen的第三差值(即Header->iBufSize-Header->iEnd-MarkLen),从所述写操作的起始地址位移MarkLen个字段后对应的地址(即Data首地址+Header->iEnd+MarkLen)开始,将待存数据的数据内容中满足第三差值对应的字段写入缓冲队列的数据区从所述对应的地址至缓冲队列的数据区尾地址之间的空闲内存中。
第三步:第一进程从缓冲队列的数据区首地址开始,将待存数据的剩余数据内容写入缓冲队列的数据区以数据区首地址(即Data首地址)开始的连续空闲内存中,所述剩余数据内容是指待存数据的数据内容所需的内存大小Len与第三差值的差值(即Len-(Header->iBufSize-Header->iEnd-MarkLen))对应的数据内容的字段。
第四步:第一进程在完成本次写访问时,将待存数据的数据内容所需的内存大小Len与第三差值的差值(即Len-(Header->iBufSize-Header->iEnd-MarkLen))作为新的第一偏移量,并更新缓冲队列的头部区中已存储的第一偏移量。
第二种情况,如图5(b)所示:
若所述第一差值小于存储待存数据所需的内存大小值,且所述第一差值小于待存数据的数据长度MarkLen时,执行以下操作:
第一步:第一进程从所述写操作的起始地址开始,将待存数据的数据长度中满足第一差值(即Header->iBufSize-Header->iEnd)对应的字段写入缓冲队列的数据区从所述起始地址开始至缓冲队列的数据区尾地址之间的空闲内存中。
第二步:第一进程从缓冲队列的数据区首地址(即Data首地址)开始,将待存数据的剩余数据长度写入缓冲队列的数据区以数据区首地址开始的连续空闲内存中,所述剩余数据长度是指待存数据的数据长度MarkLen与第一差值的差值对应的数据长度的字段(即MarkLen-(Header->iBufSize-Header->iEnd))。
第三步:第一进程从缓冲队列的数据区首地址位移所述剩余数据长度个字段后对应的地址(即Data首地址+MarkLen-(Header->iBufSize-Header->iEnd))开始,将待存数据的内存大小为Len的数据内容写入缓冲队列的数据区的连续空闲内存中。
第四步:第一进程在完成本次写访问时,将待存数据的数据内容所需的内存大小Len与所述剩余数据长度之和对应的数值(即Len+MarkLen-Header->iBufSize+Header->iEnd)作为新的第一偏移量,并更新缓冲队列的头部区中已存储的第一偏移量。
2、第二进程对所述缓冲队列执行读操作,具体包括:
步骤21:第二进程从缓冲队列的头部区中读取该缓冲队列的数据区第一个有效字符所在地址与该数据区首地址之间的第二偏移量(即Header->iBegin)。
步骤22:第二进程根据所述Header->iBegin确定缓冲队列的数据区中可进行读操作的起始地址。
步骤23:第二进程从所述读操作的起始地址(即Data首地址+Header->iBegin)开始,先读取数据长度MarkLen,再从所述读操作的起始地址位移MarkLen个字段对应的地址(即Data首地址+Header->iBegin+MarkLen)开始,读取数据长度对应的内存大小为Len的数据内容。
步骤24:第二进程在完成本次读访问时,将第二偏移量与读取数据的数据内容所需的内存大小Len和读取数据的数据长度MarkLen之和对应的数值(即Header->iBegin+MarkLen+Len)作为新的第二偏移量,并更新缓冲队列的头部区中已存储的第二偏移量。
步骤205:若所述第一偏移量小于所述第二偏移量时,第一进程对所述缓冲队列执行以下写操作,第二进程对所述缓冲队列执行以下读操作,如图2(b)所示的缓冲队列。具体包括:
1、第一进程对所述缓冲队列执行写操作,具体包括:
步骤31:第一进程从缓冲队列的头部区中读取该缓冲队列的数据区最后一个有效字符所在地址与该数据区首地址之间的第一偏移量(即Header->iEnd);
步骤32:第一进程根据所述Header->iEnd确定缓冲队列的数据区中可进行写操作的起始地址。
步骤33:第一进程将所述第二偏移量与所述第一偏移量的第二差值(即Header->iBegin-Header->iEnd)与存储待存数据所需的内存大小值进行比较,若所述第二差值不小于存储待存数据所需的内存大小值时,执行步骤34;否则,执行步骤36。
所述存储待存数据所需的内存大小值包括待存数据的数据长度MarkLen和待存数据的数据内容所需的内存大小Len。
步骤34:第一进程从所述写操作的起始地址(即Data首地址+Header->iEnd)开始,先将待存数据的数据长度MarkLen写入缓冲队列的数据区空闲内存中,再从所述写操作的起始地址位移MarkLen个字段对应的地址开始,将待存数据的数据内容写入缓冲队列的数据区空闲内存中。
步骤35:第一进程在完成本次写访问时,将第一偏移量与待存数据的数据内容所需的内存大小Len和待存数据的数据长度MarkLen之和对应的数值(即Header->iEnd+MarkLen+Len)作为新的第一偏移量,并更新缓冲队列的头部区中已存储的第一偏移量。
步骤36:若所述第二差值小于存储待存数据所需的内存大小值时,返回第一进程写入失败的结果。
2、第二进程对所述缓冲队列执行读操作,具体包括:
步骤41:第二进程从缓冲队列的头部区中读取该缓冲队列的数据区第一个有效字符所在地址与该数据区首地址之间的第二偏移量(即Header->iBegin)。
步骤42:第二进程根据所述Header->iBegin和缓冲队列的数据区首地址确定缓冲队列的数据区中可进行读操作的起始地址(即Data首地址+Header->iBegin)。
步骤43:第二进程从缓冲队列的头部区中读取该缓冲队列的数据区内存大小值Header->iBufSize,将所述Header->iBufSize与第二偏移量的第四差值(即Header->iBufSize-Header->iBegin)与读取数据所需的内存大小值进行比较,根据比较结果的不同执行不同的操作。
其中,所述读取数据所需的内存大小值包括:数据长度MarkLen和数据内容所需的内存大小Len。
根据比较结果的不同执行不同的操作,具体包括:
若所述第四差值不小于读取数据所需的内存大小值时,则执行步骤44;
否则,执行步骤45。
步骤44:若所述第四差值不小于读取数据所需的内存大小值时,第二进程从所述读操作的起始地址开始依次读取数据。具体包括:
首先,第二进程确定读取数据的数据长度MarkLen,从所述读操作的起始地址(即Data首地址+Header->iBegin)开始读取数据的数据长度MarkLen。
然后,第二进程从所述读操作的起始地址位移MarkLen个字段后对应的地址(即Data首地址+Header->iBegin+MarkLen)开始,读取数据内存大小为Len的数据内容。
最后,第二进程在完成本次读访问时,将第二偏移量与MarkLen和所述Len三者之和(即Header->iBegin+MarkLen+Len)作为新的第二偏移量,并更新缓冲队列的头部区中已存储的第二偏移量。
步骤45:若所述第四差值小于读取数据所需的内存大小值时,则第二进程从所述读操作的起始地址开始读取数据,并在读至数据区尾地址时,再从数据区首地址继续读取数据。具体包括:
第一种情况,如图6(a)所示的缓冲队列,具体包括:
若所述第四差值小于读取数据所需的内存大小值,且所述第四差值不小于读取数据的数据长度MarkLen(即Header->iBufSize-Header->iBegin>MarkLen)时,执行以下操作:
第一步:第二进程确定读数据的数据长度MarkLen连续存放在缓冲队列中,从所述读操作的起始地址(即Data首地址+Header->iBegin)开始,读取数据的数据长度MarkLen;
第二步:第二进程确定所述MarkLen与所述第四差值的第五差值(即MarkLen-(Header->iBufSize-Header->iBegin)),读取从所述读操作的起始地址位移MarkLen个字段后对应的地址(即Data首地址+Header->iBegin+MarkLen)开始至缓冲队列的数据区尾地址间的数据内容。
第三步:第二进程从缓冲队列的数据区首地址(即Data首地址)开始,将读取数据的剩余数据内容,所述剩余数据内容是指读取数据的数据内容为内存大小Len与第五差值的差值(即Len-MarkLen+(Header->iBufSize-Header->iBegin))对应的数据内容的字段。
第四步:第二进程在完成本次读访问时,将读取数据的数据内容为内存大小Len与第五差值的差值(即Len-MarkLen+(Header->iBufSize-Header->iBegin))对应的数值作为新的第二偏移量,并更新缓冲队列的头部区中已存储的第二偏移量。
第二种情况,如图6(b)所示:
若所述第四差值小于存储待存数据所需的内存大小值,且所述第四差值小于读取数据的数据长度MarkLen(即Header->iBufSize-Header->iBegin<MarkLen)时,执行以下操作:
第一步:第二进程读取从所述读操作的起始地址(即Data首地址+Header->iBegin)开始至缓冲队列的数据区尾地址之间的数据长度字段。
第二步:第二进程从缓冲队列的数据区首地址开始,读取数据的剩余数据长度,所述剩余数据长度是指读取数据的数据长度MarkLen与第四差值的差值(即MarkLen-(Header->iBufSize-Header->iBegin))对应的数据长度字段;
第三步:第二进程从缓冲队列的数据区首地址位移所述剩余数据长度个字段后对应的地址(即Data首地址+MarkLen-(Header->iBufSize-Header->iBegin))开始,读取数据的内存大小为Len的数据内容。
第四步:第二进程在完成本次读访问时,将读取数据的数据内容所需的内存大小Len与所述剩余数据长度之和(即Len+MarkLen-(Header->iBufSize-Header->iBegin))对应的数值作为新的第二偏移量,并更新缓冲队列的头部区中已存储的第二偏移量。
实施例三:
如图7所示,其为本实施例三的一种对缓冲队列并发执行读、写访问的设备的结构示意图,该设备包括:第一进程确定模块71、第一进程写访问模块72、第二进程确定模块73和第二进程读访问模块74。具体包括:
第一进程确定模块71,用于在第一进程对以缓冲队列发起写访问时,确定缓冲队列的数据区中可进行写操作的起始地址;
第一进程写访问模块72,用于从第一进程确定模块71确定的所述写操作的起始地址开始,依次将待存数据的数据长度和数据内容写入缓冲队列的数据区的连续空闲内存中;
第二进程确定模块73,用于在第二进程并行对以同一缓冲队列发起读访问时,确定缓冲队列的数据区中可进行读操作的起始地址;
第二进程读访问模块74,用于从第二进程确定模块73确定的所述读操作的起始地址开始,依次读取数据。
具体地,所述第一进程确定模块71,具体包括:
第一偏移量获取单元81,用于从缓冲队列的头部区中读取该缓冲队列的数据区最后一个有效字符所在地址与该数据区首地址之间的第一偏移量(即Header->iEnd)。
第一起始地址确定单元82,用于根据第一偏移量获取模块读取的所述第一偏移量确定缓冲队列的数据区中可进行写操作的起始地址。
所述第一进程写访问模块72,具体用于从第一起始地址确定单元82确定的所述写操作的起始地址开始,依次将待存数据的数据长度和数据内容写入缓冲队列的数据区的连续空闲内存中。
所述设备还包括:第一偏移量更新模块84。
第一偏移量更新模块84,用于在第一进程写操作执行完成后,将本次写操作执行完成后该缓冲队列的数据区最后一个有效字符所在地址与该数据区首地址之间的第一偏移量,更新缓冲队列的头部区中已存储的第一偏移量。
其中,所述第一进程写访问模块72,具体包括:
第一比较单元91,用于在所述第一偏移量大于第二偏移量时,从缓冲队列的头部区中读取该缓冲队列的数据区内存大小值,将该数据区内存大小值与第一偏移量的第一差值与存储待存数据所需的内存大小值进行比较。
第一写操作单元92,用于在第一比较单元91的比较结果为所述差值不小于存储待存数据所需的内存大小值时,从所述写操作的起始地址开始依次将待存数据写入数据区的空闲内存中。
所述第一写操作单元92,具体用于确定待存数据的数据长度MarkLen,从所述写操作的起始地址(即Data首地址+Header->iEnd)开始将确定的所述MarkLen写入数据区的连续空闲内存中;并确定待存数据的数据内容所需的内存大小Len,从所述写操作的起始地址位移MarkLen个字段后对应的地址(即Data首地址+Header->iEnd+MarkLen)开始,将确定的所述Len写入数据区的连续空闲内存中。
所述第一偏移量更新模块84,具体用于在第一写操作模块执行完毕后,将原来的第一偏移量与MarkLen和所述Len三者之和(即Header->iEnd+MarkLen+Len)作为新的第一偏移量,并更新缓冲队列的头部区中已存储的第一偏移量。
第二比较单元93,用于在第一比较单元91的比较结果为所述差值小于存储待存数据所需的内存大小值时,确定所述第一差值与第二偏移量之和,并将和值与存储待存数据所需的内存大小值进行比较。
第二写操作单元94,用于在第二比较单元93的比较结果为所述和值不小于存储待存数据所需的内存大小值时,从所述写操作的起始地址开始依次写入待存数据,并在写至数据区尾地址时,再从数据区首地址继续写入待存数据。
具体地,所述第二写操作单元94包括:第二写操作A子单元94A和第二写操作B子单元94B。
所述第二写操作A子单元94A,具体用于在第二比较单元94的比较结果为所述和值不小于存储待存数据所需的内存大小值,且所述第一差值小于存储待存数据所需的内存大小值且所述第一差值不小于待存数据的数据长度MarkLen(即Header->iBufSize-Header->iEnd>MarkLen)时,确定待存数据的数据长度MarkLen可连续存放至缓冲队列中,从所述写操作的起始地址(即Data首地址+Header->iEnd)开始,将所述MarkLen写入数据区的连续空闲内存中;并确定所述第一差值与MarkLen的第三差值(即Header->iBufSize-Header->iEnd-MarkLen),从所述写操作的起始地址位移MarkLen个字段后对应的地址(即Data首地址+Header->iEnd+MarkLen)开始,将待存数据的数据内容中满足第三差值对应的字段写入缓冲队列的数据区从所述对应的地址至缓冲队列的数据区尾地址之间的空闲内存中;再从缓冲队列的数据区首地址开始,将待存数据的剩余数据内容写入缓冲队列的数据区以数据区首地址(即Data首地址)开始的连续空闲内存中,所述剩余数据内容是指待存数据的数据内容所需的内存大小Len与第三差值的差值(即Len-(Header->iBufSize-Header->iEnd-MarkLen))对应的数据内容的字段。
所述第一偏移量更新模块84,具体用于在第二写操作A子单元94A执行完成后,将待存数据的数据内容所需的内存大小Len与第三差值的差值(即Len-(Header->iBufSize-Header->iEnd-MarkLen))作为新的第一偏移量,并更新缓冲队列的头部区中已存储的第一偏移量。
所述第二写操作B子单元94B,具体用于在第二比较单元94的比较结果为所述和值不小于存储待存数据所需的内存大小值,所述第一差值小于存储待存数据所需的内存大小值且所述第一差值小于待存数据的数据长度MarkLen(即Header->iBufSize-Header->iEnd>MarkLen)时,从所述写操作的起始地址开始,将待存数据的数据长度中满足第一差值(即Header->iBufSize-Header->iEnd)对应的字段写入缓冲队列的数据区从所述起始地址开始至缓冲队列的数据区尾地址之间的空闲内存中;并从缓冲队列的数据区首地址(即Data首地址)开始,将待存数据的剩余数据长度写入缓冲队列的数据区以数据区首地址开始的连续空闲内存中,所述剩余数据长度是指待存数据的数据长度MarkLen与第一差值的差值对应的数据长度的字段(即MarkLen-(Header->iBufSize-Header->iEnd));再从缓冲队列的数据区首地址位移所述剩余数据长度个字段后对应的地址(即Data首地址+MarkLen-(Header->iBufSize-Header->iEnd))开始,将待存数据的内存大小为Len的数据内容写入缓冲队列的数据区的连续空闲内存中。
所述第一偏移量更新模块84,还用于在第二写操作B子单元94B执行完成后,将待存数据的数据内容所需的内存大小Len与所述剩余数据长度之和对应的数值(即Len+MarkLen-Header->iBufSize+Header->iEnd)作为新的第一偏移量,并更新缓冲队列的头部区中已存储的第一偏移量。
写操作失败单元95,用于在第二比较单元93的比较结果为所述和值小于存储待存数据所需的内存大小值时,返回第一进程写入操作失败的结果。
第三比较单元96,用于在所述第一偏移量小于第二偏移量时,将第二偏移量与第一偏移量的第二差值与存储待存数据所需的内存大小值进行比较。
第三写操作单元97,用于在第三比较单元96的比较结果为所述第二差值不小于存储待存数据所需的内存大小值时,从所述写操作的起始地址开始依次写入待存数据。
具体地,所述第三写操作单元97,具体用于从所述写操作的起始地址(即Data首地址+Header->iEnd)开始,先将待存数据的数据长度MarkLen写入缓冲队列的数据区空闲内存中,再从所述写操作的起始地址位移MarkLen个字段对应的地址开始,将待存数据的数据内容写入缓冲队列的数据区空闲内存中。
所述第一偏移量更新模块84,具体用于第三写操作单元执行完毕后,将第一偏移量与待存数据的数据内容所需的内存大小Len和待存数据的数据长度MarkLen之和对应的数值(即Header->iEnd+MarkLen+Len)作为新的第一偏移量,并更新缓冲队列的头部区中已存储的第一偏移量。
所述写操作失败单元95,还用于在第三比较单元96的比较结果为所述第二差值小于存储待存数据所需的内存大小值时,返回第一进程写入操作失败的结果。
所述第二进程确定模块73,具体包括:
第二偏移量获取单元85,用于从缓冲队列的头部区中读取该缓冲队列的数据区第一个有效字符所在地址与该数据区首地址之间的第二偏移量(即Header->iBegin);
第二起始地址确定单元86,用于根据第二偏移量获取单元85读取的所述第二偏移量确定缓冲队列的数据区中可进行读操作的起始地址;
所述第二进程读访问模块74,具体用于从第二起始地址确定单元86确定的所述读操作的起始地址开始,依次读取数据。
所述设备还包括:第二偏移量更新模块88。
第二偏移量更新模块88,用于在第二进程读操作执行完成后,将本次读操作执行完成后该缓冲队列的数据区第一个有效字符所在地址与该数据区首地址之间的第二偏移量,更新缓冲队列的头部区中已存储的第二偏移量。
具体地,所述第二进程读访问模块74,具体包括:
第一读操作单元101,用于在第一偏移量大于第二偏移量时,从所述读操作的起始地址(即Data首地址+Header->iBegin)开始,先读取数据长度MarkLen,再从所述读操作的起始地址位移MarkLen个字段对应的地址(即Data首地址+Header->iBegin+MarkLen)开始,读取数据长度对应的内存大小为Len的数据内容。
所述第二偏移量模块88,具体用于在第一读操作模块完成本次读访问时,将第二偏移量与读取数据的数据内容所需的内存大小Len和读取数据的数据长度MarkLen之和对应的数值(即Header->iBegin+MarkLen+Len)作为新的第二偏移量,并更新缓冲队列的头部区中已存储的第二偏移量。
第四比较单元102,用于在第一偏移量大于第二偏移量时,将所述Header->iBufSize与第二偏移量的第四差值(即Header->iBufSize-Header->iBegin)与读取数据所需的内存大小值进行比较。
第二读操作单元103,用于第四比较单元102的结果为所述第四差值不小于读取数据所需的内存大小值时,先确定读取数据的数据长度MarkLen,从所述读操作的起始地址(即Data首地址+Header->iBegin)开始读取数据的数据长度MarkLen;然后,第二进程从所述读操作的起始地址位移MarkLen个字段后对应的地址(即Data首地址+Header->iBegin+MarkLen)开始,读取数据内存大小为Len的数据内容。
所述第二偏移量更新模块88,具体用于在第二读操作模块读操作执行完成后,第二偏移量与MarkLen和所述Len三者之和(即Header->iBegin+MarkLen+Len)作为新的第二偏移量,并更新缓冲队列的头部区中已存储的第二偏移量。
第五比较单元104,用于在在第一偏移量大于第二偏移量,且所述第四差值小于读取数据所需的内存大小值时,将所述第四差值与读取数据的数据长度MarkLen进行比较。
第三读操作单元105,用于在第五比较单元104的结果为所述第四差值不小于读取数据的数据长度MarkLen时,首先确定读数据的数据长度MarkLen连续存放在缓冲队列中,从所述读操作的起始地址(即Data首地址+Header->iBegin)开始,读取数据的数据长度MarkLen;然后确定所述MarkLen与所述第四差值的第五差值(即MarkLen-(Header->iBufSize-Header->iBegin)),读取从所述读操作的起始地址位移MarkLen个字段后对应的地址(即Data首地址+Header->iBegin+MarkLen)开始至缓冲队列的数据区尾地址间的数据内容;最后从缓冲队列的数据区首地址(即Data首地址)开始,将读取数据的剩余数据内容,所述剩余数据内容是指读取数据的数据内容为内存大小Len与第五差值的差值(即Len-MarkLen+(Header->iBufSize-Header->iBegin))对应的数据内容的字段。
所述第二偏移量更新模块88,具体用于在第三读操作模块读操作执行完毕后,将读取数据的数据内容为内存大小Len与第五差值的差值(即Len-MarkLen+(Header->iBufSize-Header->iBegin))对应的数值作为新的第二偏移量,并更新缓冲队列的头部区中已存储的第二偏移量。
第四读操作单元106,用于在第五比较单元104的结果为所述第四差值小于读取数据的数据长度MarkLen时,首先读取从所述读操作的起始地址(即Data首地址+Header->iBegin)开始至缓冲队列的数据区尾地址之间的数据长度字段;然后从缓冲队列的数据区首地址开始,读取数据的剩余数据长度,所述剩余数据长度是指读取数据的数据长度MarkLen与第四差值的差值(即MarkLen-(Header->iBufSize-Header->iBegin))对应的数据长度字段;最后从缓冲队列的数据区首地址位移所述剩余数据长度个字段后对应的地址(即Data首地址+MarkLen-(Header->iBufSize-Header->iBegin))开始,读取数据的内存大小为Len的数据内容。
所述第二偏移量更新模块88,具体用于在第四读操作模块读操作执行完成后,将读取数据的数据内容所需的内存大小Len与所述剩余数据长度之和(即Len+MarkLen-(Header->iBufSize-Header->iBegin))对应的数值作为新的第二偏移量,并更新缓冲队列的头部区中已存储的第二偏移量。
所述该设备还包括:判断模块75。
判断模块75,用于判断第一偏移量和第二偏移量不满足第一条件时,确定缓冲队列不为空,触发第二进程确定模块73,所述第一条件为第一偏移量和第二偏移量都为0,以及判断第一偏移量和第二偏移量不满足第二条件时,确定缓冲队列未存满,触发第一进程确定模块71,所述第二条件为第一偏移量和第二偏移量差值的绝对值不大于设定的字段长度。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
Claims (10)
1.一种对缓冲队列并发执行读、写访问的方法,其特征在于,该方法包括:
在第一进程和第二进程并行对同一缓冲队列分别发起写访问和读访问时,所述第一进程确定缓冲队列的数据区中可进行写操作的起始地址,并从所述写操作的起始地址开始,依次将待存数据的数据长度和数据内容写入缓冲队列的数据区的连续空闲内存中;
所述第二进程确定缓冲队列的数据区中可进行读操作的起始地址,并从所述读操作的起始地址开始,依次读取数据。
2.如权利要求1所述的方法,其特征在于,所述第一进程确定缓冲队列的数据区中可进行写操作的起始地址,具体包括:
第一进程从缓冲队列的头部区中读取该缓冲队列的数据区最后一个有效字符所在地址与该数据区首地址之间的第一偏移量;
第一进程根据所述第一偏移量确定缓冲队列的数据区中可进行写操作的起始地址;
所述第二进程确定缓冲队列的数据区中可进行读操作的起始地址,具体包括:
第二进程从缓冲队列的头部区中读取该缓冲队列的数据区第一个有效字符所在地址与该数据区首地址之间的第二偏移量;
第二进程根据所述第二偏移量确定缓冲队列的数据区中可进行读操作的起始地址。
3.如权利要求2所述的方法,其特征在于,在写操作执行完成后,所述方法还包括:
第一进程将本次写操作执行完成后该缓冲队列的数据区最后一个有效字符所在地址与该数据区首地址之间的第一偏移量,更新缓冲队列的头部区中已存储的第一偏移量;
在读操作执行完成后,所述方法还包括:
第二进程将本次读操作执行完成后该缓冲队列的数据区第一个有效字符所在地址与该数据区首地址之间的第二偏移量,更新缓冲队列的头部区中已存储的第二偏移量。
4.如权利要求2所述的方法,其特征在于,在所述第一偏移量大于第二偏移量时,第一进程从所述写操作的起始地址开始依次将待存数据写入数据区的空闲内存中,具体包括:
第一进程从缓冲队列的头部区中读取该缓冲队列的数据区内存大小值,将该数据区内存大小值与第一偏移量的第一差值与存储待存数据所需的内存大小值进行比较;
在所述第一差值不小于存储待存数据所需的内存大小值时,第一进程从所述写操作的起始地址开始依次将待存数据写入数据区的空闲内存中;
否则,第一进程确定所述第一差值与第二偏移量之和,并将和值与存储待存数据所需的内存大小值进行比较;
在所述和值不小于存储待存数据所需的内存大小值时,第一进程从所述写操作的起始地址开始依次写入待存数据,并在写至数据区尾地址时,再从数据区首地址继续写入待存数据;在所述和值小于存储待存数据所需的内存大小值时,返回第一进程写入操作失败的结果。
5.如权利要求2所述的方法,其特征在于,在所述第一偏移量小于第二偏移量时,第一进程从所述写操作的起始地址开始依次写入待存数据,具体包括:
第一进程将第二偏移量与第一偏移量的第二差值与存储待存数据所需的内存大小值进行比较;
在所述第二差值不小于存储待存数据所需的内存大小值时,第一进程从所述写操作的起始地址开始依次写入待存数据;
否则,返回第一进程写入操作失败的结果。
6.如权利要求2所述的方法,其特征在于,所述方法还包括:
当第一偏移量和第二偏移量不满足第一条件时,表示缓冲队列不为空,允许第二进程对所述缓冲队列执行读操作,所述第一条件为第一偏移量和第二偏移量都为0;
当第一偏移量和第二偏移量不满足第二条件时,表示缓冲队列未存满,允许第一进程对所述缓冲队列执行写操作,所述第二条件为第一偏移量和第二偏移量差值的绝对值不大于设定的字段长度。
7.一种对缓冲队列并发执行读、写访问的设备,其特征在于,该设备包括:
第一进程确定模块,用于在第一进程对以缓冲队列发起写访问时,确定缓冲队列的数据区中可进行写操作的起始地址;
第一进程写访问模块,用于从第一进程确定模块确定的所述写操作的起始地址开始,依次将待存数据的数据长度和数据内容写入缓冲队列的数据区的连续空闲内存中;
第二进程确定模块,用于在第二进程并行对以同一缓冲队列发起读访问时,确定缓冲队列的数据区中可进行读操作的起始地址;
第二进程读访问模块,用于从第二进程确定模块确定的所述读操作的起始地址开始,依次读取数据。
8.如权利要求7所述的设备,其特征在于,所述第一进程确定模块,具体包括:
第一偏移量获取单元,用于从缓冲队列的头部区中读取该缓冲队列的数据区最后一个有效字符所在地址与该数据区首地址之间的第一偏移量;
第一起始地址确定单元,用于根据第一偏移量获取单元读取的所述第一偏移量确定缓冲队列的数据区中可进行写操作的起始地址;
所述第二进程确定模块,具体包括:
第二偏移量获取单元,用于从缓冲队列的头部区中读取该缓冲队列的数据区第一个有效字符所在地址与该数据区首地址之间的第二偏移量;
第二起始地址确定单元,用于根据第二偏移量获取单元读取的所述第二偏移量确定缓冲队列的数据区中可进行读操作的起始地址。
9.如权利要求8所述的设备,其特征在于,所述设备还包括:
第一偏移量更新模块,用于在第一进程写操作执行完成后,将本次写操作执行完成后该缓冲队列的数据区最后一个有效字符所在地址与该数据区首地址之间的第一偏移量,更新缓冲队列的头部区中已存储的第一偏移量;
第二偏移量更新模块,用于在第二进程读操作执行完成后,将本次读操作执行完成后该缓冲队列的数据区第一个有效字符所在地址与该数据区首地址之间的第二偏移量,更新缓冲队列的头部区中已存储的第二偏移量。
10.如权利要求8所述的设备,其特征在于,所述第一进程写访问模块,具体包括:
第一比较单元,用于在所述第一偏移量大于第二偏移量时,从缓冲队列的头部区中读取该缓冲队列的数据区内存大小值,将该数据区内存大小值与第一偏移量的第一差值与存储待存数据所需的内存大小值进行比较;
第一写操作单元,用于在第一比较单元的比较结果为所述差值不小于存储待存数据所需的内存大小值时,从所述写操作的起始地址开始依次将待存数据写入数据区的空闲内存中;
第二比较单元,用于在第一比较单元的比较结果为所述差值小于存储待存数据所需的内存大小值时,确定所述第一差值与第二偏移量之和,并将和值与存储待存数据所需的内存大小值进行比较;
第二写操作单元,用于在第二比较单元的比较结果为所述和值不小于存储待存数据所需的内存大小值时,从所述写操作的起始地址开始依次写入待存数据,并在写至数据区尾地址时,再从数据区首地址继续写入待存数据;
写操作失败单元,用于在第二比较单元的比较结果为所述和值小于存储待存数据所需的内存大小值时,返回第一进程写入操作失败的结果。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2012100355758A CN103257888A (zh) | 2012-02-16 | 2012-02-16 | 一种对缓冲队列并发执行读、写访问的方法和设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2012100355758A CN103257888A (zh) | 2012-02-16 | 2012-02-16 | 一种对缓冲队列并发执行读、写访问的方法和设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN103257888A true CN103257888A (zh) | 2013-08-21 |
Family
ID=48961823
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2012100355758A Pending CN103257888A (zh) | 2012-02-16 | 2012-02-16 | 一种对缓冲队列并发执行读、写访问的方法和设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103257888A (zh) |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103631665A (zh) * | 2013-12-12 | 2014-03-12 | 北京奇虎科技有限公司 | 一种基于消息队列的线程间通信的方法和系统 |
CN104821924A (zh) * | 2014-01-30 | 2015-08-05 | 西门子公司 | 一种网络数据包处理方法、装置和网络处理设备 |
CN105912479A (zh) * | 2016-04-07 | 2016-08-31 | 武汉数字派特科技有限公司 | 一种并发数据的缓存方法及结构 |
CN106230839A (zh) * | 2016-08-03 | 2016-12-14 | 青岛海信宽带多媒体技术有限公司 | 实时流式传输的接收控制方法和装置 |
CN106776056A (zh) * | 2016-11-10 | 2017-05-31 | 北京像素软件科技股份有限公司 | 游戏数据处理方法、装置及服务器 |
CN107844262A (zh) * | 2016-09-21 | 2018-03-27 | 东软集团股份有限公司 | 数据缓存、发送方法及装置 |
WO2018121740A1 (zh) * | 2016-12-30 | 2018-07-05 | 北京奇虎科技有限公司 | 一种流数据的并发读写方法和装置 |
CN108733344A (zh) * | 2018-05-28 | 2018-11-02 | 深圳市道通智能航空技术有限公司 | 数据读写方法、装置以及环形队列 |
CN110046047A (zh) * | 2019-04-15 | 2019-07-23 | Oppo广东移动通信有限公司 | 一种进程间通信方法、装置及计算机可读存储介质 |
CN110888773A (zh) * | 2019-10-28 | 2020-03-17 | 北京字节跳动网络技术有限公司 | 一种获取线程标识的方法、装置、介质和电子设备 |
CN112130765A (zh) * | 2020-09-17 | 2020-12-25 | 智新控制系统有限公司 | Eeprom数据读写方法及装置 |
CN113254321A (zh) * | 2021-06-07 | 2021-08-13 | 恒为科技(上海)股份有限公司 | 一种评估处理器内存访问性能的方法及系统 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101266541A (zh) * | 2007-03-16 | 2008-09-17 | 武汉海恒信息存储有限责任公司 | iSCSI目标器与存储设备的接口方法 |
CN101667144A (zh) * | 2009-09-29 | 2010-03-10 | 北京航空航天大学 | 一种基于共享内存的虚拟机通信方法 |
US20100100656A1 (en) * | 2008-10-21 | 2010-04-22 | International Business Machines Corporation | Interruption facility for adjunct processor queues |
-
2012
- 2012-02-16 CN CN2012100355758A patent/CN103257888A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101266541A (zh) * | 2007-03-16 | 2008-09-17 | 武汉海恒信息存储有限责任公司 | iSCSI目标器与存储设备的接口方法 |
US20100100656A1 (en) * | 2008-10-21 | 2010-04-22 | International Business Machines Corporation | Interruption facility for adjunct processor queues |
CN101667144A (zh) * | 2009-09-29 | 2010-03-10 | 北京航空航天大学 | 一种基于共享内存的虚拟机通信方法 |
Cited By (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103631665B (zh) * | 2013-12-12 | 2017-11-07 | 北京奇安信科技有限公司 | 一种基于消息队列的线程间通信的方法和系统 |
CN103631665A (zh) * | 2013-12-12 | 2014-03-12 | 北京奇虎科技有限公司 | 一种基于消息队列的线程间通信的方法和系统 |
CN104821924A (zh) * | 2014-01-30 | 2015-08-05 | 西门子公司 | 一种网络数据包处理方法、装置和网络处理设备 |
CN104821924B (zh) * | 2014-01-30 | 2018-11-27 | 西门子公司 | 一种网络数据包处理方法、装置和网络处理设备 |
CN105912479A (zh) * | 2016-04-07 | 2016-08-31 | 武汉数字派特科技有限公司 | 一种并发数据的缓存方法及结构 |
CN106230839B (zh) * | 2016-08-03 | 2020-02-07 | 青岛海信宽带多媒体技术有限公司 | 实时流式传输的接收控制方法和装置 |
CN106230839A (zh) * | 2016-08-03 | 2016-12-14 | 青岛海信宽带多媒体技术有限公司 | 实时流式传输的接收控制方法和装置 |
CN107844262A (zh) * | 2016-09-21 | 2018-03-27 | 东软集团股份有限公司 | 数据缓存、发送方法及装置 |
CN107844262B (zh) * | 2016-09-21 | 2021-06-25 | 东软集团股份有限公司 | 数据缓存、发送方法及装置 |
CN106776056A (zh) * | 2016-11-10 | 2017-05-31 | 北京像素软件科技股份有限公司 | 游戏数据处理方法、装置及服务器 |
WO2018121740A1 (zh) * | 2016-12-30 | 2018-07-05 | 北京奇虎科技有限公司 | 一种流数据的并发读写方法和装置 |
CN108733344A (zh) * | 2018-05-28 | 2018-11-02 | 深圳市道通智能航空技术有限公司 | 数据读写方法、装置以及环形队列 |
CN110046047A (zh) * | 2019-04-15 | 2019-07-23 | Oppo广东移动通信有限公司 | 一种进程间通信方法、装置及计算机可读存储介质 |
CN110888773A (zh) * | 2019-10-28 | 2020-03-17 | 北京字节跳动网络技术有限公司 | 一种获取线程标识的方法、装置、介质和电子设备 |
CN110888773B (zh) * | 2019-10-28 | 2023-06-06 | 北京字节跳动网络技术有限公司 | 一种获取线程标识的方法、装置、介质和电子设备 |
CN112130765A (zh) * | 2020-09-17 | 2020-12-25 | 智新控制系统有限公司 | Eeprom数据读写方法及装置 |
CN113254321A (zh) * | 2021-06-07 | 2021-08-13 | 恒为科技(上海)股份有限公司 | 一种评估处理器内存访问性能的方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103257888A (zh) | 一种对缓冲队列并发执行读、写访问的方法和设备 | |
US20200012521A1 (en) | Task parallel processing method, apparatus and system, storage medium and computer device | |
KR102275563B1 (ko) | 호스트-관리 비휘발성 메모리 | |
CN103577158A (zh) | 数据处理方法与装置 | |
CN107111552B (zh) | 用于版本控制的方法、版本控制器以及机器可读介质 | |
US20140082631A1 (en) | Preferential cpu utilization for tasks | |
CN100538641C (zh) | 操作计算装置的方法 | |
CN110032450B (zh) | 一种基于固态盘扩展内存的大规模深度学习方法及系统 | |
CN103513956B (zh) | 一种处理器处理数据的方法以及装置 | |
US20180275916A1 (en) | Logical to Physical Sector Size Adapter | |
TWI529730B (zh) | 資料儲存裝置與快閃記憶體控制方法 | |
US9652416B2 (en) | Storage device for performing in-storage computing operations, method of operation the same, and system including the same | |
CN103365926A (zh) | 在文件系统中用于保存快照的方法和装置 | |
TWI710905B (zh) | 資料儲存裝置及邏輯至物理位址映射表之載入方法 | |
TWI520152B (zh) | 資料儲存裝置與快閃記憶體控制方法 | |
US20140082293A1 (en) | Store Buffer for Transactional Memory | |
CN104461384A (zh) | 一种数据写入方法及存储设备 | |
CN105955971B (zh) | 一种键值缓存的实现方法及装置 | |
US20170300255A1 (en) | Method and Apparatus for Detecting Transaction Conflict and Computer System | |
CN113050886A (zh) | 面向嵌入式内存数据库的非易失性内存存储方法及系统 | |
TW201617875A (zh) | 資料儲存裝置以及快閃記憶體控制方法 | |
CN111164694B (zh) | 存储器设备和用于存储器设备的易失性管理的方法 | |
JP5334048B2 (ja) | メモリ装置および計算機 | |
US20050278482A1 (en) | Method and system for data processing for controlling a cache memory | |
US20190370060A1 (en) | Multi-processor system, multi-core processing device, and method of operating the same |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 1184574 Country of ref document: HK |
|
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20130821 |
|
RJ01 | Rejection of invention patent application after publication | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: WD Ref document number: 1184574 Country of ref document: HK |