专利名称:同步的消息队列的制作方法
技术领域:
本发明的实施例主要涉及通信。更特别地,这些实施例涉及在消息中继服务器中有效地存储消息的系统和方法。
背景技术:
随着互联网和无线通信越来越普及,网络设计者和服务提供商面临着许多性能关注。一个特别的关注涉及消息路由选择。消息路由器从发送器主机接收消息并将这些消息转发到一个或多个目的地主机。该接收和发送消息的进程有时被称为事务处理(transaction),是任何联网结构的重要组件。对于一个高性能消息路由器来说被要求每秒完成好几百次事务处理并不罕见。
传统的消息接发系统使用存储-转发模型用于消息路由选择。在这种方法下,当路由器接收消息时,该消息被存储在非易失性存储器(“NVM”)中,这样当没有电源提供给该存储器时,内容能够被保存。NVM的实例包括,但并不仅限于,电子可擦除可编程只读存储器(“EEPROM”)和磁盘。将消息存储到NVM使得在系统崩溃或者电源故障的事件中能够恢复消息。从NVM读取和向NVM写入的初级技术相对慢,会产生网络中的性能瓶颈。
图1是根据本发明一个实施例的一种通信系统的框图。
图2是根据本发明一个实施例的,图1中网关服务器的框图。
图3是根据本发明一个实施例的,一种恢复队列索引文件的方法的流程图。
图4是根据本发明一个实施例的,一种处理流进数据的方法的实例的流程图。
图5是根据本发明一个替换实施例的,一种处理流进数据的方法的实例的流程图。
图6是根据本发明一个实施例的,确定写请求是否应当触发一批写的进程的进程流程图。
具体实施例方式本发明的实施例可以组合几种技术来最小化由于写数据到非易失性存储器而产生的性能瓶颈。这些技术可以包括相连地和/或基本相连地写数据到盘以便利用大多数现代硬盘系统的相连布局。这些技术还可以包括分批执行写请求以便最小化对盘系统的写请求的总数量,还包括使用单独的同步助手进程以便让同步的盘写入被异步地执行。这些技术还可以包括最小化要被同步写入到盘的数据;并最小化从队列中删除数据的成本。
根据本发明的一个实施例,一个或多个足够大尺寸的文件可以在非易失性存储器(NVM)中被建立并且存储器映射到易失性存储器。要被列队的消息和/或数据可以被复制到其中一个文件的存储器映射区域中,其可以被称为队列数据文件。索引数据结构可以在与队列数据文件相关联的易失性存储器中被维护,并且在索引数据结构中的入口可以被用来记录在队列数据文件中已经写消息/数据的位置。通常,消息/数据可以被写入到队列数据文件中的顺序区域中以便减小写的等待时间。消息/数据的处理可以涉及操作索引数据结构并访问在存储器映射的队列数据文件区域中的消息/数据,其本质上使得队列数据文件在消息/数据被最初写入队列数据文件之后不被物理地接触。如果由于某些原因,消息不能被立即处理,那么该消息可以被忽略并稍后处理或者移动到二级队列中。为了帮助最小化数据丢失并提高恢复效率,该索引数据结构可以被周期性地写入到非易失性存储器(NVM)中。
类似地,在本发明的当前实施例中,为了防止数据丢失并为了确保顺序的盘写,队列数据文件写可以被同步地写入到盘中。因为同步写数据到盘中是与异步输入/输出(“I/O”)环境不相兼容的,并且通常显著降低了写性能,所以同步助手进程可以被用来分批处理和分类队列数据文件写请求。该同步助手进程可以分批处理和分类所述队列数据文件写请求,这样在队列数据文件中的存储器映射区域以有效和可靠的方式与盘同步(也就是说,物理地被写)。
图1是根据本发明一个实施例的,一种通信系统的框图。在图1中,系统10可以具有耦接到网关服务器12a的终端14和耦接到网关服务器12b的终端18。根据本实施例,终端14可以是发送器主机,诸如邮件客户终端,终端18可以是目的地主机,诸如邮件服务器。例如,终端14,18可以包括计算机、工作站、个人数字助理(PDA)、陆上线路和无线电话。发送器主机14可以与网关服务器12a(例如,邮件网关)通信,目的地主机18可以和网关服务器12b(例如,邮件网关)通信,而服务器12a,12b可以经由网络16互相通信。网络16可以包括互联网,局域网(LAN),和/或广域网(WAN)。应当认识到,网关服务器12a和12b可以是服务器,路由器,交换机等等。还应当认识到,系统10可以包括其他被省略的组件,设备和/或系统。
虽然在这里将参考至目的地主机的消息的路由选择来描述某些实例,但是本发明的实施例并不是这样限制的。实际上,这里描述的原理可以被容易地应用于任何类型的流进数据而不偏离本发明实施例的实质和范围。例如,图像、声音文件和其他类型的数据也可以获益于在这里所述的原理。仍然,还有许多非常适合于本发明实施例的消息的方面。还应当注意,一条消息可以去往多个接收方(未示出)和/或目的地主机,而每个目的地主机服务于被连接到特定接收器主机的接收方。
应当注意,数据分组的传统的互联网协议(“IP”)路由选择被设计来容忍一定数量的数据丢失,而路由选择消息(诸如电子邮件消息)需要更高级别的可靠性。结果,消息路由器或服务器通常更少地容忍数据丢失,并且已经传统地使用了上面讨论的存储-转发模型。虽然某些实施例将参考一个或多个上述协议来描述,但是应当注意本发明的实施例并不是这样限制的。实际上,任何当前存储技术可以被实现的协议可以被使用。
图2是根据本发明一个实施例的,图1的网关服务器的框图。在图2中,网关服务器12a可以包括多媒体消息网关(“MMG”)20,其可以耦接到终端14和网络16。MMG 20还可以耦接到盘队列22,更具体而言耦接到盘队列22中的队列数据文件24和索引文件26。MMG 20可以进一步耦接到同步组件28,其进而又可以耦接到队列数据文件24。同步组件28可以实现为分批处理和分类队列数据文件24写请求的进程,以便在队列数据文件24中的存储器映射区域可以被有效地和可靠地同步(也就是说,物理地同步地被写)到队列数据文件24被存储器映射的盘文件。
在图2中,MMG20可以在所有流出和流进消息(例如,电子邮件消息)被传递之前将这些消息存储到盘队列22中。例如,在本实施例中,写入盘队列22(其可以包括队列数据文件24和索引文件26)是顺序的;在确认之前每次写可以与盘队列22同步;并且在启动时MMG 20可以恢复盘队列22以便重新开始队列活动。在队列数据文件24中的每个消息可以被存储器映射到存储器并且被MMG20上所有活动的进程共享。在队列数据文件24中的每个消息可以具有一个相关联的索引文件26,当系统崩溃时可以从该索引文件26中恢复队列处理状态。索引文件26在下文中可互换地被称为队列索引文件26。此外,有限数量的消息可以被列队,如果队列数据文件24满的话可以拒绝新消息。索引入口的数量可以由主要存储器、盘大小和队列文件的大小来限制。索引文件26还可以被存储器映射到MMG20中并且可以被所有其他的MMG 20进程共享。
根据本实施例,队列数据文件24中的每个消息可以在索引文件26中具有一个入口。索引文件26可以在系统安装的时候被创建成在专用盘分区上最大允许的大小。索引文件26可以由MMG 20进行存储器映射,并且与盘文件的同步可以周期地发生(例如,每10秒)。索引文件26到非易失性存储器(NVM)的周期的同步可以被异步地执行,并且通常MMG 20并不等待确认该写已经成功完成。周期的同步可以导致复制消息被传递,但是如果在完成同步之前系统崩溃的话,将不丢失任何消息。索引文件26可以由一个“队列_索引”结构构成,其进而又可以包括一个“索引_入口”结构的数组。这还可以是一个互斥(mutex)变量,其可以起到共享互斥锁的作用,并且可以被所有访问该索引的运行的MMG20进程所共享。该互斥变量可以起到防止队列索引被不止一个MMG 20进程同时改变。根据本实施例,在任何报头数据的读或写之前,以及在锁定索引入口之前可以获得互斥。索引文件26可以帮助提供对队列数据有效的访问。特别地,索引文件26可以保持指针指向队列消息的位置。当删除一个消息时,索引文件26可以被更新以便删除那个入口,从而取消对队列数据文件24的物理修改的需求。结果,“成本”,也就是,从盘队列22删除数据所需的时间和处理资源可以被最小化。此外,索引文件26可以保持有限的状态信息量,例如,重试可以被MMG频繁使用的数据。从索引文件26中可以比从队列数据文件24中更快和更有效地检索并检查消息的重试数据。
根据本发明的实施例,索引文件26的数据结构可以定义如下struct queue_index{int head;//使用中的LL的报头的索引int tail;//使用中的LL的报尾的索引//对应于写入的最后入口int free;//自由列表的报头int num_entries;time_t last_sync;struct index_entry[];}struct index_entry{int offset;//队列文件的偏移int len; //在队列文件中的数据的长度int lock; //已经锁定该入口的进程的pid//或者如果未锁定就是0byte type; //索引入口的类型,例如SMS,SMTPint status;int checksum;int retry_count;time_t last_retry;//在unix时间中,最后重试的日期int prev; //在链接表中前一个项目的索引int next;//在链接表中下一个项目的索引}应当注意,上述索引文件26的数据结构只是一个可能的表示,决不应当理解为限制现在可预期的可能的替换实施例。例如,可以预期这样的替换实施例,其中,可以包括更少的字段、额外的字段以及上述两者的组合,还可以包括其它的字段。
为了确保从索引_入口写数据到盘是一个院子操作,单个的索引_入口不应该跨越不止一个盘块。对该问题的一个可能解决方案就是添加填充(padding)到索引_入口结构以便确保其大小是操作系统的盘块大小的因子。例如,如果盘块大小是4096字节,那么索引_入口数据结构可以扩展到4096字节的因子的大小,例如32字节。如果,例如,在索引文件26中的每个入口占32字节,那么32兆字节的索引文件将被要求来支持一百万个索引入口。
在系统崩溃之后,索引文件2 6和队列数据文件24可以被MMG20读取来恢复在系统崩溃之前存在的队列处理状态。
每一个MMG 20队列可以使用一个或多个专用的数据文件和专用索引文件。每个数据文件可以在单个的盘分区上被创建,通常,在该分区中没有其他盘文件。同队列索引文件26一样,队列数据文件24可以在系统安装时被创建成它们各自的最大允许的大小。这帮助确保了队列数据文件24由相连的盘块组成并使得有可能相连的盘写入队列数据文件24。多个队列文件可以放在单独的物理盘中以便提高并行性。队列数据文件和队列索引文件可以被放在单独的物理盘中以便提高并行性。在MMG 20的初始化期间,队列数据文件24可以通过MMG 20被存储器映射以便存储消息。在每个消息被添加到队列数据文件24之后,盘和存储器文件可以被同步以便防止数据丢失。
单个的队列数据文件大小可以被限制为,例如2GB或更多,但是4GB是最大的文件大小,其中偏移(offset)可以使用32比特无符号整数表示。超过4GB的队列数据文件的大小是可能的,但要求该队列入口位置(队列数据文件偏移)使用长整数(例如64比特)来表示。如果平均的流进消息大小是4k个八位字节,那么2GB的队列数据文件24可以存储最大大约500k(k=1024)消息。除了实际的消息内容,报头信息也可以被写入队列数据文件24。这样的报头信息可以包含消息号码,创建日期和被写的消息的大小。
根据本发明的一个实施例,每个消息可以以一定的顺序和封装信息一起被写入队列数据文件24。因为队列恢复进程可能不总是能够依靠正完成的索引文件26,通常,队列数据文件24应当包括足够的信息来为该消息重建索引入口。因此,队列数据文件24入口格式可以包括,例如
根据本发明的一个实施例,可以包括队列索引文件恢复过程,因为队列索引文件26通常不同步地写入到盘中。为了促进恢复过程,队列索引文件26(如上所述的数据结构中所示)可以包括字段“time_t_last_sync”,其可以指定索引文件被写入盘的最后的时间。通常,time_t_last_sync数据可以仅仅在文件被同步到盘之前立即被修改。在队列数据文件24中的每个队列入口可以在一个偏移开始,其通常是在预定的边界,例如256字节的边界。队列数据文件入口可以是预先考虑的,也就是说预先固定的,使用固定的4字节特征标作为入口的前4个字节,例如“\252\88\132\133”。为了确保其反映队列数据文件24的正确的索引信息,队列索引文件26可以使用证实过程被证实。例如,根据本发明的一个实施例,一个可能的证实过程可以如以下伪码过程中所述的那样实现scan queue index file″inuse″linked list;if loop discovered,break loop;if any entry is locked,unlock;if any entry is marked as free,move to″free″list;scan queue index file″free″list;if loop discovered,break loop;if the entry is marked as″inuse″and the entry points to valid data,movethe entry to″inuse″list;for any entries not on the″inuse″list or the″free″list;if locked,unlock the entry;if not marked free,and the entry points to valid data,move the entry to the″inuse″list;if not marked free,but the entry points to invalid data,move the entry tothe″free″list;if free,move the entry to the″free″list. 图3是根据本发明一个实施例的,在系统崩溃后将信息恢复到队列索引文件的方法的流程图。在图3中,对于队列索引文件26可能的入口,在队列数据文件24中的记录可以按例如预定的边界间隔(诸如,以256字节的间隔)被扫描(310)。入口是否需要被恢复到队列索引文件26中可以被确定(320)。确定(320)该入口需要被恢复可以包括确定该入口是否有效。如果以下两个条件都是真,该入口就可以被确定为有效1)前4个字节匹配固定的4个字节报头;和2)入口校验和是正确的。确定(320)入口是否需要被恢复还可以包括确定一个有效的入口是否从队列索引文件26中丢失。如果以下任一个条件为真,有效的入口就可以被确定为丢失1)入口的日期字段包含在队列索引文件26的last_sync时间字段所包含的日期之后的日期,或者2)入口没有在队列索引文件26中。因此,入口可以被添加(330)到队列索引文件26,如果入口被确定(320)为既有效又丢失的。在队列数据文件24中是否具有更多记录可以被确定(340)。如果更多记录被确定(340)在队列数据文件24中,该方法可以使扫描在队列数据文件24中向前跳到下一个记录(350)。要被跳过(350)的距离或者等于预定的边界间隔,或是等于可选地约等于最相近边界间隔的入口的长度字段的距离。通常,不管用于记录的入口是否被确定(320)存在,要被跳过(350)的距离可以是预定的边界间隔。然而,如果记录被确定(320)存在,那么要被跳过(350)的距离可以由可选地约等于最相近边界间隔的入口的长度字段所确定,其可以在跳过(350)预定边界间隔上提供一些性能提高。该方法可以循环回以便继续扫描(310)队列数据文件24,如上所述。否则,该方法就可以终止,如果没有更多的记录被确定(340)在队列数据文件24中。
消息数据可以具有根据消息类型的特定格式。例如,根据本发明的一个实施例,SMTP消息数据可以具有以下格式
类似地,根据本发明的一个实施例,SMS消息可以具有以下格式
此外,传递指令可以被添加到该消息格式,诸如例如,邮件服务器主机名称,或者SMSC位置,以防止用户被执行两次授权(例如,轻量级目录访问协议(“LDAP”)查询)。MMG 20列队任务。返回到图2,根据本发明的一个实施例,盘队列22可以包括队列数据文件24(虽然其他实施例可能使用不止一个队列数据文件来实现)和索引文件26。而在本实施例中,队列数据文件24和索引文件26可以被存储在物理盘上,队列数据文件24的各个部分也可以被存储器映射到主要的存储器中以便提高处理效率。
将消息添加到队列中。该任务可以添加消息到队列数据文件24。当接收到确认该消息已经被写入盘中时,可以认为该添加是成功的。在本发明的一个实施例中,当队列索引文件26中的一个入口已经被成功分配并且当在队列数据文件24中有足够的空间容纳该消息时,消息可以被添加。否则,该消息将被拒绝。如果该消息被添加,那么消息的内容可以被复制到队列数据文件24的保留空间,并且在对队列数据文件24完成复制操作之后可以执行盘同步。
存储可用性检测。通常,当执行队列存储可用性检测时,要考虑两种情况。此外,重要的是要知道队列数据文件24正在被读(R)和写(W)所位于的当前偏移、要保留(S)的大小和队列数据文件24的最大大小(Q)。
在本实施例中,R可以对应于第一队列入口的偏移位置,W可以对应于最后一个队列入口的偏移加上该入口的长度。因此,根据本发明的一个实施例,队列索引的数据结构可以定义为struct queue_index q_index;[...]R=q_index.index_entry[q_index.head].offset;W=q_index.index_entry[q_index.tail].offset+q_index.index_entry[q_index_tail].len;
应当理解,所有的算法可以是队列数据文件24大小的模,虽然这里为了可读性而省略了详细的细节。
在第一种情况下,根据本实施例,当前读偏移R可以小于当前写偏移W。用于存储的可用的空间可以表示为s=Q-W,并且如果S小于s,那么分配就成功。否则,W可以被重置或者环绕到队列数据文件24的开始,并且空间可用性检查可以在以下所述的情况下再一次执行。
在第二种情况下,根据本实施例,当前的写偏移W可以小于当前的读偏移R,并且用于存储的可用的空间可以表示为s=R-W。如果s小于S,那么在偏移R的队列入口可以被跳过。
虽然,之前已经描述了如何检查在队列数据文件24中的空闲的存储空间,但是如果读和写位置太靠近,那么就没有空间放新的消息数据。当队列数据文件24满的时候就会发生这种情况,在该情况下,就没有选择,只能拒绝流进的消息。幸运的是,这种可能性非常小。但是更可能的是,读和写位置之间的空间可以很小,因为在读位置(q_index.head)的消息非常旧。在这种情况下,旧的消息可以通过将其从列表的头移动到尾而不被跳过。这可以例如通过以下代码段来实现MMG_mutex_acquire(index_lock)int tmp=q_index.head;q_index.head=q_index.indexL_entry[q_index.head].next;q_index.index_entry[q_index.head].prev=-1;//NONEq_index..index_entry[q_index.tail].next=tmp;q_index.index_entry[tmp].prev=q_index.tail;q_index.index_entry[tmp].next=-1; //NONEq_index.tail=tmp;MMG_mutex_release(index_lock);该操作具有移动写指针(W)和读指针(R)的效果。
索引入口分配。根据本发明的一个实施例,索引入口可以存储在数组中。当该索引最初被实例化时,可以建立空闲索引入口的链接表。例如,q_index.free可以指向该链接表的头。在该空闲列表中的每个入口可以使用它的index_entry.next值来指向列表中下一个入口。该列表可以以a-1结束。当需要新的索引时,该进程可以首先获取index_lock,然后其可以将第一项目从栈q_index.free中出栈,如以下代码段所示
int new_entry=q_index.free;if(new_entry==-1)return ERROR_NO_MORE_INDEX_ENTRIES;q_index.free=q_index.index_entries[q_index.free].next;
队列处理。根据本发明的一个实施例,队列处理进程或线程,通常,按顺序地将消息从根索引中的消息队列中取出。每个消息可以被锁定用于处理,然后如果其不能被成功处理就解锁定。如果消息的重试限制被超过,那么通过将该消息的相应索引入口从索引文件的in_use列表移动到空闲列表从而可以从队列中删除该消息。在该消息被成功地或者不成功地处理之后,该索引入口可以类似地从in_use列表移动到空闲列表。
根据本发明的实施例,存储器内索引可以被用来分组所有指向相同的主机或域的消息。这使许多消息被一次发送到单个的主机。
队列文件同步。根据本发明的一个实施例,队列文件同步可以使用同步命令(例如,msync())实现,以确保数据被成功地保存到盘中。然而,因为同步调用msync()会阻塞所有其他线程的操作并阻塞对盘队列的所有访问,因此,助手进程(例如,如图2所示,同步组件28)可以用来处理同步。MMG 20可以使用先进、先出(“FIFO”)队列来与同步组件28通信。
图4是根据本发明一个实施例的处理流进数据的方法的实例的流程图。在图4中,显示了能够产生好的并行的用于同步组件28的两阶段、分批的方法。该方法可以使用4个FIFO队列requestfifo 401-MMG 201发送请求到同步组件28receiptifio 401-同步组件28确认收到请求confirmfifo 403-同步组件28确认完成所有接收的请求confconffifo 404-MMG 20确认每个接收的同步组件28的确认。
在图4中,同步组件28可以侦听用于msync数据命令的requestfifo 401。该命令可以是4字节整数的偏移,之后是4字节整数的长度。该命令也可以是4字节整数的偏移,之后是8字节长整数的长度。该偏移可以表示队列数据文件24中在存储器映射文件中的位置。
在图4中,MMG线程,例如MMG线程1,可以获取(410)互斥并经由requestfifo 401发送(412)同步(“sync”)请求到同步组件28。MMG线程1可以等待(414)指示sync请求被接收的收据,同步组件28可以列队(416)该接收的sync请求并经由receiptfifo 402发送(418)该sync请求已经被接收的确认到MMG线程1。在接收到该请求被接收的确认之后,MMG线程1可以释放(420)互斥并等待(421)来自confirmfifo403的该请求被处理的确认。在一个时间不止一个MMG 20可以等待confirmfifo 403。
在图4中,第二个MMG线程,MMG线程2,可以在互斥被MMG线程1释放(420)之后获取(422)该互斥。MMG线程2可以经由requestfifo401发送(424)另一个sync请求到同步组件28并等待(426)指示该sync请求被接收的收据,同步组件28可以列队(428)该接收的sync请求并发送(430)该sync请求被接收的确认回到MMG线程2。MMG线程2可以释放(432)该互斥并等待(433)msync的确认。
在图4中,当请求被接收时,同步组件28可以分批请求。例如,同步组件28可以继续分批sync请求,直到其已经接收了一组相连的或基本相连的sync请求,或者一些预定的事件或超时发生。此时,同步组件28可以停止接受新的在requestfifo401上的sync请求并执行(434)所有接收的sync请求。如果映射文件的恰当部分已经被存储器映射,那么简单的msync可以被调用(434)。如果不是,那么恰当部分可以被存储器映射,然后msync可以被调用(434)。同步组件28可以发送(436)出N个sync确认到受影响的线程(例如,MMG线程1和MMG线程2)并等待(438)发送N个sync确认的一个或多个确认。N是在等待确认的MMG线程的数量。虽然未示出,但是如果接收的sync请求和写请求的当前批没有基本相连的资格,那么根据一些配置参数,该被接收的sync请求可以被延迟,直到下一批的开始,该被中继的sync请求可以在下一批中被处理。
会存在竞争情况,其中在附加的MMG线程开始听confirmfifo403之前,不是每个MMG线程已经从confirmfifo 403中接收到信号。因此,confconffifo 404可以被使用,这样每个MMG线程被要求来确认每个确认的接收。当每个确认已经被确认时,同步组件28可以再一次开始接收和确认其他sync请求的收到。例如,MMG线程1可以发送(440)对发送(436)的msync确认的确认回到同步组件28,MMG线程2可以发送(442)对发送的(436)msync确认的确认回到同步组件28。同步组件28可以返回(444)以便继续从活动线程中接收和列队(416)msync请求。
超时可以在同步组件28中利用来处理在MMG 20能够经由confconffifo 404确认接收确认之前就停止运行的情况。类似地,MMG 20可以具有超时,这样其可以检测同步组件28何时停止运行以及何时重新启动。
在低吞吐量时,利用单独的同步组件可以比简单的同步请求/响应系统更慢,但是该方法具有更高的最大吞吐量。这可以产生更少的系统调用msync,因为每个调用将要求msync来同步更多的数据。同步组件28越长时间地等待sync请求以便形成相连的块,那么能够获得的吞吐量就越高,但是这意味着低吞吐量系统效率更低并经历更高的等待时间。因此,许多配置选项可以被指定给同步组件28来微调同步组件28的性能。例如,以下配置选项可以在同步组件中设置以字节指定的最大批大小;由写请求数量指定的最大批大小;最大批收集时间;没有新写请求的最大允许时间;其中新写请求将不再认为是基本相连的最大偏移(以页或字节)。
存储器映射操作。多个区域可以被存储器映射到队列数据文件24用于向和从队列数据文件24写和读消息。当映射感兴趣的区域时可以使用以八位字节的预定大小,并且在选择大小的时候应当小心,这样该系统不用频繁地执行重映射。通常,要被映射的区域的大小应当是盘页大小的倍数。主要的是应当注意,每个线程或进程可以具有其自己的队列数据文件24的映射。
例如,根据本发明的一个实施例,本方法可以是具有一个用于读的映射区域和另一个用于写的映射区域。这意味着当写到“写”区域时可以重新映射“读”区域。另一个重要的事情就是在对每个映射区域进行任何操作之前检查该区域的边界。当执行盘同步任务时,同步组件28可以使用其自己的存储器映射。
根据本发明的另一个实施例,一种方法可以用来维持存储器映射区域的可配置大小的池,其可以被锁定以便被任何单独的线程或进程排它地使用,可选地由线程和进程重映射,读或写,然后当线程或进程结束时解锁定。在该实施例中,当多个线程请求一个映射区域时,线程的等待-列队被保持,然后在池中就具有映射的区域。
图5是根据本发明一个替换实施例的处理流进数据的方法的实例的流程图。在图5中,可以从运行进程中接收(505)写请求,该方法可以确定(510)是否添加写请求到一批基本相连的盘写。如果确定(510)添加写请求到该批基本相连的盘写,那么该写请求可以被添加(515)到该批基本相连的盘写。该方法可以确定(520)是否将该批基本相连的盘写写到非易失性存储器,如果确定了将该批基本相连的盘写写到非易失性存储器,那么就可以确定(525)该批基本相连的盘写是否是存储器映射的。
在图5中,如果确定(525)该批基本相连的盘写是存储器映射的,那么该批基本相连的盘写可以被写(530)到非易失性存储器。确认该批基本相连的盘写的写入可以被发送(535)到写请求最初从中接收的一个或多个进程。该方法可以等待从发送(535)写确认的一个或多个进程中的每一个接收(540)对所发送(535)确认的确认。如果对所发送(535)确认的确认被从一个或多个进程中的每一个接收(540),那么该批基本相连的盘写可以被清除(545),并且能够确定(550)是否有任何跳过的写请求和/或是否在临时存储器中保存了写请求。如果确定(550)在临时存储器中保存了写请求,那么该方法可以循环到确定(510)是否添加其中一个保存的写请求到一批基本相连的盘写并如上所述继续。如果确定(550)在临时存储器中没有保存任何写请求,那么该方法可以循环到接收(505)新的写请求并如上所述继续。
在图5中,如果确定(510)不添加接收的写请求到该批基本相连的盘写,那么可以确定(555)是否跳过或保存该写请求到临时存储器中。如果确定(555)跳过该写请求,那么该方法可以循环到接收(505)新的写请求并如上所述继续。如果确定(555)保存该写请求到临时存储器,那么该方法可以保存(560)该写请求到临时存储器中并循环到接收(505)新的写请求并如上所述继续。
在图5中,如果确定(525)该批基本相连的盘写并不是使用非易失性存储器进行存储器映射,那么该方法可以使用非易失性存储器对该写请求进行存储器映射(565)。该方法可以写(530)该批基本相连的盘写到非易失性存储器并如上所述继续。
图6是显示根据本发明的一个实施例的确定无状态路由是否适当的进程的进程流程图。在图6中,写请求可以从运行的进程中接收(610),该方法可以添加(620)该写请求到一批基本相连的盘写操作中。该方法可以确定(630)是否将该批基本相连的盘写写到非易失性存储器中,并且如果确定(630)将该批基本相连的盘写写到非易失性存储器,那么该批基本相连的盘写可以被写(640)到非易失性存储器。对该批基本相连的盘写的写的确认可以被发送(650)到写请求最初从之接收的进程。该方法可以从每个发送(650)写确认的进程接收(660)对所发送(650)确认的确认。该批基本相连的盘写可以被清除(670),该方法可以循环到接收(610)新的写请求并如上所述继续。
在图6中,如果确定(630)不写该批基本相连的盘写,那么该方法可以循环到接收(610)新的写请求并如上所述继续。
本领域的技术人员将理解从以上描述中,本发明的实施例的广泛的技术可以以各种形式实现。因此,虽然本发明的实施例已经通过其特定实例来描述,但是本发明实施例的真实范围不应当这样限制,因为在研究附图、实施例和以下权利要求而进行的其他修改对于本领域技术人员来说是显而易见的。
权利要求
1. 一种方法,包括接收写请求;添加该写请求到一批基本相连的盘写;确定将该批基本相连的盘写写到非易失性存储器;将该批基本相连的盘写写到该非易失性存储器;发送对写该批基本相连的盘写的确认;接收对该写确认的确认;和清除该批基本相连的盘写。
2. 权利要求1的方法,其中接收写请求包括接收对与在该批基本相连的盘写中的存储器位置相连的存储器位置的写请求。
3. 权利要求1的方法,其中接收写请求包括从处理线程中接收写请求。
4. 权利要求3的方法,其中从处理线程中接收写请求包括从位于多媒体消息网关的处理线程中接收写请求。
5.权利要求1的方法,其中确定将该批基本相连的盘写写到非易失性存储器包括确定自从前一次将该批基本相连的盘写写到非易失性存储器后已经流逝预定时间段。
6.权利要求1的方法,其中确定将该批基本相连的盘写写到非易失性存储器包括确定该批基本相连的盘写的预定大小已经被超过。
7.权利要求1的方法,其中确定将该批基本相连的盘写写到非易失性存储器包括确定该批基本相连的盘写包含多个相连的写请求。
8.权利要求1的方法,其中确定将该批基本相连的盘写写到非易失性存储器包括确定该批基本相连的盘写的大小超过预定的最大字节数量。
9.权利要求1的方法,其中确定将该批基本相连的盘写写到非易失性存储器包括确定在该批基本相连的盘写中存储的写请求数量超过预定的最大数量。
10.权利要求1的方法,其中确定将该批基本相连的盘写写到非易失性存储器包括确定收集该批基本相连的盘写的预定最大时间已经被超过。
11.权利要求1的方法,其中确定将该批基本相连的盘写写到非易失性存储器包括确定自从最后一次写请求收到之后的预定最大时间已经被超过。
12.权利要求1的方法,其中确定将该批基本相连的盘写写到非易失性存储器包括确定该写请求超过该批基本相连的盘写中最大允许的页偏移。
13.权利要求1的方法,其中确定将该批基本相连的盘写写到非易失性存储器包括确定该写请求超过该批基本相连的盘写中最大允许的字节偏移。
14.权利要求1的方法,其中将该批基本相连的盘写写到该非易失性存储器包括将该批基本相连的盘写异步地写到该非易失性存储器。
15.权利要求1的方法,其中将该批基本相连的盘写写到该非易失性存储器包括确定该批基本相连的盘写是否是存储器映射的;如果该批基本相连的盘写不是存储器映射的,就存储器映射该批基本相连的盘写;和将该批基本相连的盘写写到该非易失性存储器。
16.权利要求1的方法,还包括确定在临时存储器中是否有未解决的未处理的写请求;和如果在临时存储器中有未解决的未处理的写请求,那么将该未解决的未处理的写请求添加到新的一批基本相连的盘写中。
17.一种在其上存储了多条可运行指令来执行一种方法的机器可读介质,该方法包括接收写请求;添加写请求到一批基本相连的盘写;确定有可能将该批基本相连的盘写写到非易失性存储器;将该批基本相连的盘写写到该非易失性存储器;发送对写该批基本相连的盘写的确认;接收对写确认的确认;和清除该批基本相连的盘写。
18.权利要求17的机器可读介质,其中接收写请求包括接收对与在该批基本相连的盘写中的存储器位置相连的存储器位置的写请求。
19.权利要求17的机器可读介质,其中接收写请求包括从处理线程中接收写请求。
20.权利要求19的机器可读介质,其中从处理线程中接收写请求包括从位于多媒体消息网关的处理线程中接收写请求。
21.权利要求17的机器可读介质,其中确定将该批基本相连的盘写写到非易失性存储器包括确定自从前一次该批基本相连的盘写写到非易失性存储器后已经流逝预定时间段。
22.权利要求17的机器可读介质,其中确定将该批基本相连的盘写写到非易失性存储器包括确定该批基本相连的盘写的预定大小已经被超过。
23.权利要求17的机器可读介质,其中确定有可能将该批基本相连的盘写写到非易失性存储器包括确定该批基本相连的盘写包含多个相连的写请求。
24.权利要求17的机器可读介质,其中确定将该批基本相连的盘写写到非易失性存储器包括确定该批基本相连的盘写的大小超过预定的最大字节数量。
25.权利要求17的机器可读介质,其中确定将该批基本相连的盘写写到非易失性存储器包括确定在该批基本相连的盘写中存储的写请求的数量超过预定的最大数量。
26.权利要求17的机器可读介质,其中确定将该批基本相连的盘写写到非易失性存储器包括确定收集该批基本相连的盘写的预定最大时间已经被超过。
27.权利要求17的机器可读介质,其中确定将该批基本相连的盘写写到非易失性存储器包括确定自从最后一次写请求收到之后的预定最大时间已经被超过。
28.权利要求17的机器可读介质,其中确定将该批基本相连的盘写写到非易失性存储器包括确定该写请求超过该批基本相连的盘写中最大允许的页偏移。
29.权利要求17的机器可读介质,其中确定将该批基本相连的盘写写到非易失性存储器包括确定该写请求超过该批基本相连的盘写中最大允许的字节偏移。
30.权利要求17的机器可读介质,其中将该批基本相连的盘写写到该非易失性存储器包括将该批基本相连的盘写异步地写到该非易失性存储器。
31.权利要求17的机器可读介质,其中将该批基本相连的盘写写到该非易失性存储器包括将该批基本相连的盘写异步地写到该非易失性存储器。
32.权利要求17的机器可读介质,其中将该批基本相连的盘写写到该非易失性存储器包括确定该批基本相连的盘写是否是存储器映射的;如果该批基本相连的盘写不是存储器映射的,就存储器映射该批基本相连的盘写;和将该批基本相连的盘写写到该非易失性存储器。
33.权利要求17的机器可读介质,还包括确定在临时存储器中是否有未解决的未处理的写请求;和如果在临时存储器中有未解决的未处理的写请求,那么将该未解决的未处理的写请求添加到新的一批基本相连的盘写中。
34.一种方法,包括由第一线程或进程获得对共享互斥锁的控制;从第一线程或进程发送第一写请求到同步进程;通过同步线程或进程列队第一写请求;发送对接收到第一写请求的确认到第一线程或进程;一旦接收到对接收到第一写请求的确认,就由第一线程或进程释放对共享互斥锁的控制;由第二线程或进程获得对共享互斥锁的控制;从第二线程或进程发送第二写请求到同步进程;如果第一和第二写请求是到基本相连的存储器位置,就由同步进程对第二写请求和第一写请求列队;发送对接收到第二写请求的确认到第二线程或进程;一旦接收到对接收到第二写请求的确认,就由第二线程或进程释放对共享互斥锁的控制;将列队的第一和第二写请求写到非易失性存储器;发送对写到非易失性存储器的确认到第一进程和第二进程中的每一个;从第一进程和第二进程中的每一个发送对接收到写确认的确认;和如果从第一进程和第二进程中的每一个接收到了对接收到写确认的确认,就重新开始该方法。
35.权利要求34的方法,其中将列队的第一和第二写请求写到非易失性存储器包括确定是否已经发生预定条件;和如果已经发生预定条件,就将列队的第一和第二写请求写到非易失性存储器。
36.权利要求34的方法,其中该预定条件包括预定时间段被超过。
37.权利要求34的方法,其中该预定条件包括该列队的写请求基本上互相相连。
38.权利要求34的方法,其中该预定条件包括列队的写请求的大小超过了预定最大字节数量。
39.权利要求34的方法,其中该预定条件包括列队的写请求的数量超过了预定最大数量。
40.权利要求34的方法,其中该预定条件包括收集列队的写请求的预定最大时间已经被超过。
41.权利要求34的方法,其中该预定条件包括自从最后一次接收到写请求之后的预定最大时间已经被超过。
42.权利要求34的方法,其中该预定条件包括新的写请求超过了从列队写请求的最大允许的页偏移。
43.权利要求34的方法,其中该预定条件包括新的写请求超过了从列队写请求的最大允许的字节偏移。
44.一种在其上存储了多条可运行指令来执行一种方法的机器可读介质,该方法包括由第一线程或进程获得对共享互斥锁的控制;从第一线程或进程发送第一写请求到同步进程;通过同步线程或进程列队第一写请求;发送对接收到第一写请求的确认到第一线程或进程;一接收到对接收到第一写请求的确认就由第一线程或进程释放对共享互斥锁的控制;由第二线程或进程获得对共享互斥锁的控制;从第二线程或进程发送第二写请求到同步进程;如果第一和第二写请求是到基本相连的存储器位置,就由同步进程对第二写请求和第一写请求列队;发送对接收到第二写请求的确认到第二线程或进程;一接收到对接收到第二写请求的确认就由第二线程或进程释放对共享互斥锁的控制;将列队的第一和第二写请求写到非易失性存储器;发送对写到非易失性存储器的确认到第一进程和第二进程的每一个;从第一进程和第二进程的每一个发送对接收到写确认的确认;和如果从第一进程和第二进程的每一个接收到了对接收到写确认的确认,就重新开始该方法。
45.权利要求44的机器可读介质,其中列队第一写请求包括在一批文件中存储第一写请求。
46.权利要求45的机器可读介质,其中列队第二写请求包括在该批文件中存储第二写请求。
47.权利要求44的机器可读介质,其中在发生预定条件时写列队的第一和第二写请求。
48.权利要求47的机器可读介质,其中该预定条件包括预定时间段被超过。
49.权利要求47的机器可读介质,其中该预定条件包括该列队的写请求互相相连。
50.权利要求44的机器可读介质,其中该预定条件包括列队的写请求的大小超过了预定最大字节数量。
51.权利要求44的机器可读介质,其中该预定条件包括列队的写请求的数量超过了预定最大数量。
52.权利要求44的机器可读介质,其中该预定条件包括收集列队的写请求的预定最大时间已经被超过。
53.权利要求44的机器可读介质,其中该预定条件包括自从最后一次接收到写请求之后的预定最大时间已经被超过。
54.权利要求44的机器可读介质,其中该预定条件包括新的写请求超过了从列队写请求的最大允许的页偏移。
55.权利要求44的机器可读介质,其中该预定条件包括新的写请求超过了从列队写请求的最大允许的字节偏移。
56.一种装置,包括网关;耦接到网关的队列数据文件;耦接到网关的索引文件;和耦接到网关和队列数据文件的同步组件,该同步组件用于接收写请求;添加写请求到一批基本相连的盘写;确定是否将该批基本相连的盘写写到非易失性存储器;将该批基本相连的盘写写到该非易失性存储器;发送对写该批基本相连的盘写的确认;接收对写确认的确认;和清除该批基本相连的盘写。
57.权利要求56的装置,其中网关包括多媒体消息网关。
58.权利要求56的装置,其中队列数据文件和索引文件被包括在盘队列中。
59.权利要求56的装置,其中队列数据文件包括包含足以重建相关的用于索引文件中记录的入口的信息的记录。
60.权利要求56的装置,其中索引文件包括与队列数据文件中记录相关联的入口,该入口包括具有索引分量和入口信息分量的数据结构。
61.权利要求56的装置,其中网关用于读取队列数据文件和索引文件以便恢复在装置的系统崩溃之前存在的队列处理状态。
62.权利要求56的装置,其中队列数据文件位于单个的盘分区上。
63.权利要求56的装置,其中队列数据文件包括多个相连的盘块。
64.一种方法,包括接收写请求;确定是否添加该写请求到一批未解决的请求中;如果确定要添加该写请求到该批中,就添加该写请求到该批;确定是否将该批写到非易失性存储器中;如果确定要将该批写到非易失性存储器,那么就确定该批是否是存储器映射到非易失性存储器;如果确定该批是存储器映射到非易失性存储器,那就将该批写到非易失性存储器;发送对写该批的确认到与该批中每个写请求相关联的进程;确定是否所有的对写该批的确认已经被接收;如果所有的对写该批的确认已经被接收,就清除该批;确定是否有任何写请求被跳过或者被存储在临时存储器中;以及如果确定没有被跳过或者被存储的写请求,就循环回去以接收下一个写请求。
65.权利要求64的方法,还包括如果确定未解决的未处理的写请求在临时存储器中,就添加未处理的写请求到新的一批未解决的请求。
66.权利要求64的方法,还包括如果确定要将写请求存储在临时存储器,就存储写请求在临时存储器中;以及如果确定要跳过该写请求,就循环回去以接收下一个写请求。
67.权利要求64的方法,还包括如果确定不将该批写到非易失性存储器,那就循环回去以接收下一个写请求。
68.权利要求64的方法,还包括如果确定该批不是与非易失性存储器存储器映射的,那就就在将该批写到非易失性存储器之前使该批与非易失性存储器存储器映射。
69.权利要求64的方法,还包括如果确定被保存的写请求在临时存储器中,那么就确定是否将保存的写请求写到非易失性存储器中。
70.一种在其上存储了多条可运行指令来执行一种方法的机器可读介质,该方法包括接收写请求;确定是否添加该写请求到一批未解决的请求中;如果确定要添加该写请求到该批中,就添加该写请求到该批;确定是否将该批写到非易失性存储器中;如果确定要将该批写到非易失性存储器,那么就确定该批是否是存储器映射到非易失性存储器;如果确定该批是存储器映射到非易失性存储器,那就将该批写到非易失性存储器;发送对写该批的确认到与该批中每个写请求相关联的进程;确定是否所有的对写该批的确认已经被接收;如果所有的对写该批的确认已经被接收,就清除该批;确定是否有任何写请求被跳过或者被存储在临时存储器中;以及如果确定没有被跳过或者被存储的写请求,就循环回去以接收下一个写请求。
71.权利要求70的机器可读介质,其中该方法还包括如果确定了未解决的未处理的写请求在临时存储器中,就添加未处理的写请求到新的一批未解决的请求。
72.权利要求70的机器可读介质,其中该方法还包括如果确定要将写请求存储在临时存储器,就存储写请求在临时存储器中;以及如果确定要跳过该写请求,就循环回去以接收下一个写请求。
73.权利要求70的机器可读介质,其中该方法还包括如果确定不将该批写到非易失性存储器,那就循环回去以接收下一个写请求。
74.权利要求70的机器可读介质,其中该方法还包括如果确定该批不是与非易失性存储器存储器映射的,那就在将该批写到非易失性存储器之前将该批与非易失性存储器存储器映射。
75.权利要求70的机器可读介质,其中该方法还包括如果确定被保存的写请求在临时存储器中,那么就确定是否将保存的写请求写到非易失性存储器中。
全文摘要
一种方法包括接收写请求;添加写请求到一批基本相连的盘写;确定将该批基本相连的盘写写到非易失性存储器;将该批基本相连的盘写写到该非易失性存储器;发送写该批基本相连的盘写的确认;接收确认写的确认;和清除该批基本相连的盘写。
文档编号G06F17/30GK101084490SQ200580017660
公开日2007年12月5日 申请日期2005年3月25日 优先权日2004年3月31日
发明者G·H·奥加萨瓦拉, J·施瓦茨, D·斯通 申请人:双子星移动科技公司