基于双缓存预读的向用户传输数据的方法和装置的制作方法

文档序号:6438029阅读:249来源:国知局
专利名称:基于双缓存预读的向用户传输数据的方法和装置的制作方法
技术领域
本发明涉及通信技术领域,更具体地说,涉及一种基于双缓存预读的向用户传输数据的方法和装置。
背景技术
流媒体是指采用流式传输的方式在互联网上播放的媒体格式。流媒体又叫流式媒体,通常商家用一个视频传送服务器把节目封装成流媒体数据包发出,传送到网络上。用户通过解压设备对这些流媒体数据包进行解压后,节目就可以像发送前那样播放。现在流媒体的应用十分广泛,已经成为互联网的热点。目前,限制流媒体的服务性能的主要因素包括硬盘技术发展滞后带来的网络存储瓶颈;流媒体点播技术瓶颈;互联网带宽瓶颈等,上述服务性能主要包括服务的速度和节目的质量。目前,市场上主流7200转硬盘读取速度在150MB/S左右,磁盘阵列的IO (Input/ Output,输出/输入)吞吐量一般在400MB/S左右。虽然这比以前有了很大提高,但相比较计算机其他方面的性能提高和数字信息量的增长速度,硬盘技术仍相对落后。硬盘技术的缓慢发展,限制了网络存储能力,它成为影响流媒体服务速度的主要因素之一。

发明内容
本发明的实施例提供了一种基于双缓存预读的向用户传输数据的方法和装置,以实现提高现有磁盘存储的吞吐率,消除使用单缓存所带来的延迟。一种基于双缓存预读的向用户传输数据的方法,包括创建多组双缓存,为每个用户分配一组双缓存,所述一组双缓存中包括工作缓存和空闲缓存,用于存储为该用户预读取的数据;创建多个处理线程,每个处理线程分别负责指定磁盘的数据读取,并且为指定的用户服务;每个所述处理线程针对其所服务的每个用户,通过为每个用户分配的一组双缓存中的工作缓存向每个用户传输数据,在所述工作缓存中缓存的数据传输完毕后,控制进行所述工作缓存和空闲缓存之间的切换。一种基于双缓存预读的向用户传输数据的装置,其特征在于,包括缓存管理模块,用于创建多组双缓存,为每个用户分配一组双缓存,所述一组双缓存中包括工作缓存和空闲缓存,用于存储为该用户预读取的数据;线程管理模块,用于创建多个处理线程,每个处理线程分别负责指定磁盘的数据读取,并且为指定的用户服务;数据处理模块,用于针对每个所述处理线程所服务的每个用户,通过为每个用户分配的一组双缓存中的工作缓存向每个用户传输数据,在所述工作缓存中缓存的数据传输完毕后,控制进行所述工作缓存和空闲缓存之间的切换。
本发明实施例通过为每个用户分配一组双缓存,并用双缓存来存储为该用户预读取的数据,在现有磁盘存储容量不变的情况下,可以显著地提高现有磁盘存储的吞吐率,有效地消除使用单缓存所带来的延迟,从而整体提高流媒体系统的服务能力。


为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。图1为本发明实施例一提供的一种基于双缓存和预读技术的向用户传输数据的方法的处理流程图;图2为本发明实施例一提供的一种空闲缓存随机填充式策略的时间轴示意图;图3为本发明实施例一提供的一种指数后退式填充策略的时间轴示意图;图4为本发明实施例二提供的一种双缓存预读、空闲缓存填充的模拟程序工作流程图;图5为本发明实施例三提供的一种基于双缓存和预读技术的向用户传输数据的装置的结构图。
具体实施例方式为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。为便于对本发明实施例的理解,下面将结合附图以几个具体实施例为例做进一步的解释说明,且各个实施例并不构成对本发明实施例的限定。实施例一该实施例提供的一种基于双缓存和预读技术的向用户传输数据的方法的处理流程如图1所示,包括如下的处理步骤步骤11、在系统中预先创建多组双缓存,为每个用户分配一组双缓存,所述一组双缓存中包括工作缓存和空闲缓存,用于存储为该用户预读取的数据。从用户角度来看,在播放流媒体时,大多数情况,用户的习惯是按顺序观看,即使有跳跃观看操作,在短时间内,多数也是按顺序播放的。根据计算机存储的分级结构、磁盘适合大数据量顺序读写的特点和用户大部分时间内进行连续播放的习惯,针对硬盘整体读取速度偏低和访问效率不高的现状,本发明实施例提出了一种知情式文件预读取方法,预读的内容是按媒体文件存储的顺序来选择的, 系统把将来可能用到的数据预先读取到分配给每个用户的双缓存中,从而提高硬盘访问效率,提高用户的服务效果。如果使用单缓存来存储预读取的数据,在缓存数据用完时,系统会经历一段延迟, 用来等待程序再次读取磁盘和填充缓存。为了有效使用预读取的数据,本发明实施例采用双缓存技术,即在一个缓存数据用完时,直接切换至另一缓存,由其接着提供数据,这样就消除了使用单缓存所带来的延迟。初始化系统,在系统中预先创建多组双缓存,连接成工作链表和空闲链表,在没有用户接入时,所有双缓存组都属于空闲链表。当有用户接入,从空闲链表取一组双缓存分配给该用户,为该用户服务,并加入工作链表;当有用户退出时,把分配给该用户的双缓存从工作链表取出,加入到空闲链表。所述一组双缓存中包括工作缓存和空闲缓存。上述一组双缓存是指两个动态申请的且大小相同的内存空间。服务器与不同用户的客户端程序所建立的关联称之为会话,每个会话不仅保存着用户的客户端地址端口、会话状态、媒体文件等信息,而且还是双缓存的入口。双缓存作为会话的结构成员存在。当一个新用户会话被创建时,同时会调用malloc函数动态地为双缓存分配地址空间。双缓存结构体部分成员如下
struct Double_Buffer{
int TotaISize;
//双缓存的大小,等于2*BUF SIZE
int LeftSize;
BUF SIZE
//当前服务的单缓存剩余数椐量,小于等于
int BufferInUse;
//正在使用的单缓存,可以为0或
BUF SIZE
char * BufferPtr[2]; //两个单缓存的起始地址,每个大小为
char * SendPtr;
//下次需要发送的数据的地址
int SendOffset;
//下次需要发送的数据的大小从上述双缓存的结构体看出,该结构体只记录双缓存总大小、剩余数据量、当前服务的单缓存、两个单缓存起始地址、下次发送数据的地址和大小。其中LeftSize和SendPtr 会在每次发送数据后更新数值(即LeftSize- = DATA_SIZE, SendPtr+ = DATA_SIZE,其中DATA_SUE是每次发送的数据量),如果LeftSize减为0,就进行双缓存的切换,立即更新BuffeHr^se (由0变为1,或由1变为0)和SendPtr (指向切换的单缓存起始地址,即 SendPtr = BufferPtr[Bufferlr^se])。步骤12、创建一个主线程和多个处理线程,各个处理线程分别固定地负责指定磁盘IO的数据读取工作,并且固定地服务指定用户,主线程还根据系统的当前CPU(Central Processing Unit,中央处理器)占有率和总的硬盘IO的平均传输速率,实时判断当前系统的状态是忙碌还是空闲。
首先需要根据一定策略,在系统中创建一个主线程和多个处理线程,由主线程指定各个处理线程分别固定地负责一部分磁盘IO的数据读取工作,同时指定各个处理线程固定地服务指定用户,为该指定用户进行双缓存的数据填充和数据传输操作。主线程把任意一个用户会话请求的数据,重定向到一个处理线程,由它执行具体的读写磁盘、双缓存预读和向用户发送数据的操作。比如,将所有用户分成N组,由N个处理线程分别服务一组用户。上述主线程还需要根据各个处理线程的数据读写和传输情况,计算出每个硬盘IO的平均传输速率,然后把所有硬盘IO的平均传输速率相加就得到了总的硬盘IO的平均传输速率。然后,上述主线程判断系统的当前CPU (Central Processing Unit,中央处理器)占有率和总的硬盘IO的平均传输速率都在较低的范围之内,则实时判断当前系统的状态是空闲;否则,判断当前系统的状态是忙碌。步骤13、各个处理线程定时遍历所服务的所有用户,对每个用户进行数据发送、双缓存切换操作。并按照预先设定的空闲缓存填充策略,对所有用户的空闲缓存进行数据填充。每个处理线程需要根据特定码率的需要,设置定时器。具体而言,如果每秒定时 COUNT次发送数据,每次数据量为DATA_SUE kb,则上述特定码率就是COUNT女DATA_SIZE Iibps,通过调节COUNT和DATA_SUE就可以达到要求的特定码率;反之,如果已知特定码率, 也可以推断COUNT或DATA_SUE。根据上述特定码率和上述双缓存中的单缓存大小BUF_ SUE,可以计算出单缓存可以服务的时间长度。在定时器的定时时间到达后,开始遍历本处理线程所服务的所有用户,对于每个用户,确定该用户的使用缓存,当使用缓存不为空时,从该使用缓存中取出数据,通过网络发送给用户,并维护更新相关的记录信息;当该使用缓存为空时,则进行工作缓存和空闲缓存之间的切换,将原先的空闲缓存切换为使用缓存,使用缓存切换为空闲缓存。对于每个用户的空闲缓存,按照预先设定的空闲缓存填充策略进行数据填充,上述空闲缓存填充策略应该保证在双缓存切换时间到来之前,将空闲缓存填充完毕,并且要保证各个磁盘的读取操作均衡化,实现各个磁盘的负载均衡,同时要尽量保证上述空闲缓存的数据填充操作要在系统空闲时进行。本发明实施例提供的上述空闲缓存填充策略主要包括随机填充式策略、状态检测式填充策略和指数后退式填充策略。下面分别介绍该三个填充策略。1、随机填充式策略。为了应对服务器为大量用户并发服务时,同时读磁盘所带来的压力,本发明实施例提出了空闲缓存的随机填充式策略。主要思想是当一个用户的上一次双缓存切换后,不是立即填充空闲缓存,而随机选择一个填充时间,并保证在下次双缓存切换之前完成空闲缓存的填充。这种策略最大的特点是随机化,宏观来看,可以做到使读磁盘操作平均分布于时间轴之上。在附图2所示的空闲缓存随机填充式策略的时间轴中,时间点Tl表示上一次双缓存切换的时间;时间点T2表示填充空闲缓存的时间;时间点T3表示为空闲缓存预留的安全时间,它存在的目的是防止因为系统忙碌或填充时间T2离切换时间T4太近,而没有在切换时间T4到来之前完成空闲缓存的填充;时间点T4下一次双缓存切换的时间。切换动作就是把会话结点中缓存结构的发送指针指向另一缓存,并更新相关的统计数据。
空闲缓存的随机化填充在时间点Tl和T3之间进行。具体实现是首先计算T3-T1 的时间间隔所经历的定时器中断次数INTR_NUM ;然后在时间点Tl进行上一次双缓存切换时,为每个用户会话的空闲缓存生成随机数m,且0 <m< INTR_NUM。每当定时器到期时, 遍历所有用户,当遍历到某个用户时,在中断处理函数中将该用户的m减1,如果该用户的m 等于0,则为该用户进行空闲缓存的填充,即为该用户构造消息传递至读消息队列,由读线程池执行具体的读磁盘操作。此处随机化的作用是避免所有的用户会话同时填充空闲缓存,从而避免了磁盘的大量并发读操作带来的高负荷,达到了的负载均衡的目的。2、状态检测式填充策略。虽然随机填充式策略从宏观上实现了磁盘I/O的负载均衡,但该策略忽略了双缓存切换时磁盘I/O和CPU的状态,有可能错失空闲缓存的最佳填充时机。结合磁盘和CPU的实时状态信息,本发明实施例提出了改进的状态检测式空闲缓存填充策略,在上一次双缓存切换后,处理线程首先从主线程实时获取当前系统的状态,如果当前系统的状态是空闲,就立即对所有用户同时进行空闲缓存填充。并且,实时从主线程获取当前系统的状态,如果当前系统的状态时忙碌,则马上停止所有用户的空闲缓存填充, 按上述随机填充式策略处理。当在双缓存切换后,从主线程实时获取的当前系统的状态是忙碌,则直接按上述随机填充式策略处理。3、指数后退式填充策略。在上一次双缓存切换后,处理线程首先从主线程实时获取当前系统的状态,如果当前系统的状态是空闲,就立即对所有用户同时进行空闲缓存填充。并且,实时从主线程获取当前系统的状态,如果当前系统的状态时忙碌,则马上停止所有用户的空闲缓存填充。当每个所述处理线程实时获取的整个系统的当前状态为忙碌时,则停止其所服务的每个用户的空闲缓存填充操作,为每个用户设置一个在下一次工作缓存和空闲缓存之间的切换时间之前的空闲缓存填充的安全时间点T5,在所述Tl和所述T5之间,为每个用户选择一个空闲缓存的实际填充时间T2 ;当某个用户的所述实际填充时间T2到来时,继续判断整个系统的当前状态,如果当前状态为空闲,则为所述某个用户进行空闲缓存填充;如果当前状态为忙碌,则按照时间指数方式后退的原则,在所述T2和所述T5之间,为所述某个用户选择一个空闲缓存的实际填充时间T3 ;重复进行上述操作,直到所述某个用户的实际填充时间点Tn上系统的当前状态为空闲,则在所述实际填充时间点Tn为所述某个用户进行空闲缓存填充;或者直到所述某个用户的实际填充时间点Tn大于所述安全时间点T5,则在所述安全时间点T5为所述某个用户进行空闲缓存填充。如附图3所示,Tl表示上一次双缓存切换的时间,T2 T4称为退避时间点,T5 表示安全时间点,T6表示下一次双缓存切换的时间,其中安全时间点T5之前的指数避让时间段称为退避时间段,其长短以指数方式增加,T2-T1 =UNITjIME (特定较小的时间段), T3-T2 = 2 * UNIT_TIME,T4-T3 = (22) * UNIT_TIME, T5-T4 <= (23) * U NIT_TIME。除了 Tl,T2-T4都是对应退避时间段里的随机时间点。
9
应用指数后退策略的过程是在时间点Tl,当双缓存切换结束时,首先判断当前系统是否空闲,若是,则立刻进行所有用户的空闲缓存填充操作;若否,则进入指数后退阶段。在该阶段,针对每个用户先Tl T2时间段随机选取一个填充时间点,当每个用户到达该填充时间时,还是判断系统是否忙碌,若是,则在剩余时间段里重复上述过程。但是在安全时间点T5之前最后一个时间段里(如此处的T4 T5),不管是否检测到系统忙,则都立刻进行空闲缓存的填充操作。指数后退式策略改进了随机填充式和状态检测式策略,空闲缓存填充时间点选择的更加合理,可以更好地和均衡地利用磁盘的I/O吞吐量和CPU的能力。但此策略也存在缺点,主要是获取磁盘传输速率和CPU占用率的次数众多,如果获取这些信息花费的时间较长,则有可能过多地占用服务用户的时间。实施例二预读程序的主要目的是测试特定缓存大小时,多用户并发所能产生的磁盘出口能力。它主要实现了多线程处理、双缓存算法、随机生成媒体文件名、微秒级计时等功能,程序短小精悍,易于理解。以具有三块硬盘的服务器,创建1个主进程和3个处理线程为例,该实施例提供的一种双缓存预读、空闲缓存填充的模拟程序工作流程如图3所示,具体处理过程如下1)程序将把用户分成三等份,用户编号模3等于0、1和2各为一组,分别由线程 0、1和2负责。而三个处理线程又分别负责一块硬盘,处理线程0负责硬盘sdb,处理线程1 负责硬盘sdc,处理线程2负责硬盘sdd。所以,所有用户就平均地读三块硬盘。并为每个用户创建一个双缓存。2)以当前时间的微秒数初始化随机函数srandO,为三组里每个用户分别随机生成媒体文件编号和起始点。3)初始化线程计数器为0,创建三个处理线程。每次创建处理线程后,都对线程计数器加1,为防止竞争的出现,用线程信息号机制进行加锁,操作完成后再解锁。4)三个处理线程进入处理流程。5)主进程进入等待状态。等待的结束条件是线程计数器再次变回0,即三个处理线程都结束,此时主进程根据各处理线程完成的时间,首先分别计算各硬盘的平均传输速率,然后把三块硬盘的传输速率相加就得到了真个磁盘的总的传输速率。还可以根据以下
公式计算平均消耗时间
data data data 3 * data3 * * Z1 * 广+ + ~~^^ = 777-7^7-77-
/〇T1T2lIq T1 -τ Tq T2 -t T1 T2处理线程的处理流程1)首先接收主进程传递的参数,判断自己负责的硬盘,把前缀变量设置为正确的路径。2)开始本处理线程的定时器的计时操作。调用Linux函数gettimeofday (),获取当前时间。3)进入服务用户的有限次循环,循环次数由每个用户请求的总数据量除以每次发送的数据得出,例如,总数据量为120MB,每次发送8KB,则需要循环15360次。4)在上面的循环内,再遍历本处理线程所服务的所有用户,对每个用户,以空闲缓存的随机填充式策略为例,处理以下三种情况①判断用户的工作缓存是否为空,若为空,则进行双缓存切换,并设置空闲缓存的填充随机数(这是特意生成的随机数,每次循环时都会减1,当减为0时就填充该空闲缓存),此数值的范围是0 SERVE_C0UNT-2,其中SERVE_C0UNT表示单缓存片能够服务的次数,减去的2是预留的安全时间。例如,单缓存为1MB (双缓存就为2MB),每次发送8KB,则 SERVE_C0UNT 就为 1MB/8KB = 128。②判断空闲缓存填充数是否小于等于0,若是,则进行空闲缓存填充,从磁盘读取 BUF_SIZE大小的数据,并填充到空闲缓存。③通过网络向用户发送少量数据。此处的少量数据选择的是8KB,因为当码率为 2Mbps,这是平均一帧视频数据的大小。上述双缓存预读、空闲缓存填充程序与上层的流媒体监听与发送程序一起,构成了流媒体双缓存预读系统。实际上,上述双缓存预读、空闲缓存填充程序位于操作系统层, 将作为一个模块存在。当上层的流媒体发送程序向底层请求发送数据时,会自动转向上述双缓存预读、空闲缓存填充程序,由其做一次聚合预读,然后进行双缓存式的数据管理,再返回上层应用其所需的数据。短时间内上层程序需要的数据,都还由双缓存提供。实施例三该实施例提供了一种基于双缓存和预读技术的向用户传输数据的装置,其具体结构如图5所示,包括如下的模块缓存管理模块51,用于创建多组双缓存,为每个用户分配一组双缓存,所述一组双缓存中包括工作缓存和空闲缓存,用于存储为该用户预读取的数据;线程管理模块52,用于创建多个处理线程,每个处理线程分别负责指定磁盘的数据读取,并且为指定的用户服务;数据处理模块53,用于针对每个所述处理线程所服务的每个用户,通过为每个用户分配的一组双缓存中的工作缓存向每个用户传输数据,在所述工作缓存中缓存的数据传输完毕后,控制进行所述工作缓存和空闲缓存之间的切换。进一步地,所述的装置还可以包括空闲缓存填充模块M,用于基于每个磁盘的数据预读取操作均衡化和/或在整个系统空闲时进行磁盘数据预读取的原则设置空闲缓存填充策略,所述空闲缓存填充策略还需要保证在进行下一次工作缓存和空闲缓存之间的切换之前,完成空闲缓存的填充操作;针对每个所述处理线程所服务的每个用户,按照所述空闲缓存填充策略对每个用户的空闲缓存进行磁盘数据预读取、数据填充操作。具体的,所述的空闲缓存填充模块M,还用于当所述空闲缓存填充策略为随机填充式策略时,针对每个所述处理线程所服务的每个用户,在上一次工作缓存和空闲缓存之间的切换时间Tl之后,为每个用户设置一个在下一次工作缓存和空闲缓存之间的切换时间之前的空闲缓存填充的安全时间点T3,在所述Tl和所述T3之间,为每个用户随机选择一个空闲缓存的实际填充时间T2 ;通过每个所述处理线程定时遍历其所服务的每个用户,当每个用户的所述实际填充时间T2到来时,为每个用户的空闲缓存进行磁盘数据预读取、数据填充操作。具体的,所述的空闲缓存填充模块M,还用于当所述空闲缓存填充策略为状态检
11测式空闲缓存填充策略时,在上一次工作缓存和空闲缓存之间的切换时间Tl之后,实时获取整个系统的当前状态,所述当前状态根据整个系统的当前中央处理器占有率和总的硬盘输入输出的平均传输速率而得到,当所述当前状态为空闲时,针对每个所述处理线程所服务的每个用户进行空闲缓存填充操作;当实时获取的整个系统的当前状态为忙碌时,则停止每个所述处理线程所服务的每个用户的空闲缓存填充操作,为每个用户设置一个在下一次工作缓存和空闲缓存之间的切换时间之前的空闲缓存填充的安全时间点T3,在所述Tl和所述T3之间,为每个用户随机选择一个空闲缓存的实际填充时间T2 ;通过每个所述处理线程定时遍历其所服务的每个用户,当每个用户的所述实际填充时间T2到来时,为每个用户的空闲缓存进行磁盘数据预读取、数据填充操作。具体的,所述的空闲缓存填充模块M,还用于当所述空闲缓存填充策略为指数后退式填充策略时,在上一次工作缓存和空闲缓存之间的切换时间Tl之后,实时获取整个系统的当前状态,所述当前状态根据整个系统的当前中央处理器占有率和总的硬盘输入输出的平均传输速率而得到,当所述当前状态为空闲时,针对每个所述处理线程所服务的每个用户进行空闲缓存填充操作;当实时获取的整个系统的当前状态为忙碌时,则停止每个所述处理线程所服务的每个用户的空闲缓存填充操作,为每个用户设置一个在下一次工作缓存和空闲缓存之间的切换时间之前的空闲缓存填充的安全时间点T5,在所述Tl和所述T5之间,为每个用户选择一个空闲缓存的实际填充时间T2 ;当某个用户的所述实际填充时间T2到来时,继续判断整个系统的当前状态,如果当前状态为空闲,则为所述某个用户进行空闲缓存填充;如果当前状态为忙碌,则按照时间指数方式后退的原则,在所述T2和所述T5之间,为所述某个用户选择一个空闲缓存的实际填充时间T3 ;重复进行上述操作,直到所述某个用户的实际填充时间点Tn上系统的当前状态为空闲,则在所述实际填充时间点Tn为所述某个用户进行空闲缓存填充;或者直到所述某个用户的实际填充时间点Tn大于所述安全时间点T5,则在所述安全时间点T5为所述某个用户进行空闲缓存填充。应该本发明实施例的装置向用户传输数据的传输数据的具体处理过程和上述方法实施例中的具体处理过程相同,在此不再赘述。本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory, ROM)或随机存储记忆体(Random Access Memory, RAM)等。综上所述,本发明实施例通过为每个用户分配一组双缓存,并用双缓存来存储为该用户预读取的数据,在现有磁盘存储容量不变的情况下,可以显著地提高现有磁盘存储的吞吐率,有效地消除使用单缓存所带来的延迟,从而整体提高流媒体系统的服务能力。本发明实施例通过基于每个磁盘的数据预读取操作均衡化和/或在整个系统空闲时进行磁盘数据预读取的原则设置空闲缓存填充策略,可以实现各个磁盘1/0数据读取操作的均衡化,这样整体就达到了负载均衡的目的。并且,可以尽量保证在系统的状态为空闲时进行磁盘数据读取、空闲缓存填充的操作。针对多块磁盘直接连接服务器的情况,本发明实施例通过每个处理线程负责指定硬盘的读写操作,避免了多线程混合处理有可能引起的竞争、单线程处理会使磁盘利用率变低的情况。以上所述,仅为本发明较佳的具体实施方式
,但本发明的保护范围并不局限于此, 任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换, 都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。
权利要求
1.一种基于双缓存预读的向用户传输数据的方法,其特征在于,包括创建多组双缓存,为每个用户分配一组双缓存,所述一组双缓存中包括工作缓存和空闲缓存,用于存储为该用户预读取的数据;创建多个处理线程,每个处理线程分别负责指定磁盘的数据读取,并且为指定的用户服务;每个所述处理线程针对其所服务的每个用户,通过为每个用户分配的一组双缓存中的工作缓存向每个用户传输数据,在所述工作缓存中缓存的数据传输完毕后,控制进行所述工作缓存和空闲缓存之间的切换。
2.根据权利要求1所述的基于双缓存预读的向用户传输数据的方法,其特征在于,所述的方法还包括基于每个磁盘的数据预读取操作均衡化和/或在整个系统空闲时进行磁盘数据预读取的原则设置空闲缓存填充策略,所述空闲缓存填充策略还需要保证在进行下一次工作缓存和空闲缓存之间的切换之前,完成空闲缓存的填充操作;每个所述处理线程针对其所服务的每个用户,按照所述空闲缓存填充策略对每个用户的空闲缓存进行磁盘数据预读取、数据填充操作。
3.根据权利要求1所述的基于双缓存预读的向用户传输数据的方法,其特征在于,所述的每个所述处理线程针对其所服务的每个用户,按照所述空闲缓存填充策略对每个用户的空闲缓存进行磁盘数据预读取、数据填充操作,包括当所述空闲缓存填充策略为随机填充式策略时,每个所述处理线程针对其所服务的每个用户,在上一次工作缓存和空闲缓存之间的切换时间Tl之后,为每个用户设置一个在下一次工作缓存和空闲缓存之间的切换时间之前的空闲缓存填充的安全时间点T3,在所述 Tl和所述T3之间,为每个用户随机选择一个空闲缓存的实际填充时间T2 ;每个所述处理线程定时遍历其所服务的每个用户,当每个用户的所述实际填充时间T2 到来时,为每个用户的空闲缓存进行磁盘数据预读取、数据填充操作。
4.根据权利要求1所述的基于双缓存预读的向用户传输数据的方法,其特征在于,所述的每个所述处理线程针对其所服务的每个用户,按照所述空闲缓存填充策略对每个用户的空闲缓存进行磁盘数据预读取、数据填充操作,包括当所述空闲缓存填充策略为状态检测式空闲缓存填充策略时,在上一次工作缓存和空闲缓存之间的切换时间Tl之后,每个所述处理线程实时获取整个系统的当前状态,所述当前状态根据整个系统的当前中央处理器占有率和总的硬盘输入输出的平均传输速率而得到,当所述当前状态为空闲时,每个所述处理线程针对其所服务的每个用户进行空闲缓存填充操作;当每个所述处理线程实时获取的整个系统的当前状态为忙碌时,则停止其所服务的每个用户的空闲缓存填充操作,为每个用户设置一个在下一次工作缓存和空闲缓存之间的切换时间之前的空闲缓存填充的安全时间点T3,在所述Tl和所述T3之间,为每个用户随机选择一个空闲缓存的实际填充时间T2 ;每个所述处理线程定时遍历其所服务的每个用户,当每个用户的所述实际填充时间T2 到来时,为每个用户的空闲缓存进行磁盘数据预读取、数据填充操作。
5.根据权利要求1所述的基于双缓存预读的向用户传输数据的方法,其特征在于,所述的每个所述处理线程针对其所服务的每个用户,按照所述空闲缓存填充策略对每个用户的空闲缓存进行磁盘数据预读取、数据填充操作,包括当所述空闲缓存填充策略为指数后退式填充策略时,在上一次工作缓存和空闲缓存之间的切换时间Tl之后,每个所述处理线程实时获取整个系统的当前状态,所述当前状态根据整个系统的当前中央处理器占有率和总的硬盘输入输出的平均传输速率而得到,当所述当前状态为空闲时,每个所述处理线程针对其所服务的每个用户进行空闲缓存填充操作;当每个所述处理线程实时获取的整个系统的当前状态为忙碌时,则停止其所服务的每个用户的空闲缓存填充操作,为每个用户设置一个在下一次工作缓存和空闲缓存之间的切换时间之前的空闲缓存填充的安全时间点T5,在所述Tl和所述T5之间,为每个用户选择一个空闲缓存的实际填充时间T2 ;当某个用户的所述实际填充时间T2到来时,继续判断整个系统的当前状态,如果当前状态为空闲,则为所述某个用户进行空闲缓存填充;如果当前状态为忙碌,则按照时间指数方式后退的原则,在所述T2和所述T5之间,为所述某个用户选择一个空闲缓存的实际填充时间T3 ;重复进行上述操作,直到所述某个用户的实际填充时间点他上系统的当前状态为空闲,则在所述实际填充时间点Tn为所述某个用户进行空闲缓存填充;或者直到所述某个用户的实际填充时间点Tn大于所述安全时间点T5,则在所述安全时间点T5为所述某个用户进行空闲缓存填充。
6.一种基于双缓存预读的向用户传输数据的装置,其特征在于,包括缓存管理模块,用于创建多组双缓存,为每个用户分配一组双缓存,所述一组双缓存中包括工作缓存和空闲缓存,用于存储为该用户预读取的数据;线程管理模块,用于创建多个处理线程,每个处理线程分别负责指定磁盘的数据读取, 并且为指定的用户服务;数据处理模块,用于针对每个所述处理线程所服务的每个用户,通过为每个用户分配的一组双缓存中的工作缓存向每个用户传输数据,在所述工作缓存中缓存的数据传输完毕后,控制进行所述工作缓存和空闲缓存之间的切换。
7.根据权利要求6所述的基于双缓存预读的向用户传输数据的装置,其特征在于,所述的装置还包括空闲缓存填充模块,用于基于每个磁盘的数据预读取操作均衡化和/或在整个系统空闲时进行磁盘数据预读取的原则设置空闲缓存填充策略,所述空闲缓存填充策略还需要保证在进行下一次工作缓存和空闲缓存之间的切换之前,完成空闲缓存的填充操作;针对每个所述处理线程所服务的每个用户,按照所述空闲缓存填充策略对每个用户的空闲缓存进行磁盘数据预读取、数据填充操作。
8.根据权利要求6所述的基于双缓存预读的向用户传输数据的装置,其特征在于所述的空闲缓存填充模块,还用于当所述空闲缓存填充策略为随机填充式策略时,针对每个所述处理线程所服务的每个用户,在上一次工作缓存和空闲缓存之间的切换时间Tl 之后,为每个用户设置一个在下一次工作缓存和空闲缓存之间的切换时间之前的空闲缓存填充的安全时间点T3,在所述Tl和所述T3之间,为每个用户随机选择一个空闲缓存的实际填充时间T2 ;通过每个所述处理线程定时遍历其所服务的每个用户,当每个用户的所述实际填充时间T2到来时,为每个用户的空闲缓存进行磁盘数据预读取、数据填充操作。
9.根据权利要求6所述的基于双缓存预读的向用户传输数据的装置,其特征在于所述的空闲缓存填充模块,还用于当所述空闲缓存填充策略为状态检测式空闲缓存填充策略时,在上一次工作缓存和空闲缓存之间的切换时间Tl之后,实时获取整个系统的当前状态,所述当前状态根据整个系统的当前中央处理器占有率和总的硬盘输入输出的平均传输速率而得到,当所述当前状态为空闲时,针对每个所述处理线程所服务的每个用户进行空闲缓存填充操作;当实时获取的整个系统的当前状态为忙碌时,则停止每个所述处理线程所服务的每个用户的空闲缓存填充操作,为每个用户设置一个在下一次工作缓存和空闲缓存之间的切换时间之前的空闲缓存填充的安全时间点T3,在所述Tl和所述T3之间,为每个用户随机选择一个空闲缓存的实际填充时间T2 ;通过每个所述处理线程定时遍历其所服务的每个用户,当每个用户的所述实际填充时间T2到来时,为每个用户的空闲缓存进行磁盘数据预读取、数据填充操作。
10.根据权利要求6所述的基于双缓存预读的向用户传输数据的装置,其特征在于所述的空闲缓存填充模块,还用于当所述空闲缓存填充策略为指数后退式填充策略时,在上一次工作缓存和空闲缓存之间的切换时间Tl之后,实时获取整个系统的当前状态,所述当前状态根据整个系统的当前中央处理器占有率和总的硬盘输入输出的平均传输速率而得到,当所述当前状态为空闲时,针对每个所述处理线程所服务的每个用户进行空闲缓存填充操作;当实时获取的整个系统的当前状态为忙碌时,则停止每个所述处理线程所服务的每个用户的空闲缓存填充操作,为每个用户设置一个在下一次工作缓存和空闲缓存之间的切换时间之前的空闲缓存填充的安全时间点T5,在所述Tl和所述T5之间,为每个用户选择一个空闲缓存的实际填充时间T2 ;当某个用户的所述实际填充时间T2到来时,继续判断整个系统的当前状态,如果当前状态为空闲,则为所述某个用户进行空闲缓存填充;如果当前状态为忙碌,则按照时间指数方式后退的原则,在所述T2和所述T5之间,为所述某个用户选择一个空闲缓存的实际填充时间T3 ;重复进行上述操作,直到所述某个用户的实际填充时间点他上系统的当前状态为空闲,则在所述实际填充时间点Tn为所述某个用户进行空闲缓存填充;或者直到所述某个用户的实际填充时间点Tn大于所述安全时间点T5,则在所述安全时间点T5为所述某个用户进行空闲缓存填充。
全文摘要
本发明提供了一种基于双缓存预读的向用户传输数据的方法和装置,该方法主要包括创建多组双缓存,为每个用户分配一组双缓存,所述一组双缓存中包括工作缓存和空闲缓存,用于存储为该用户预读取的数据;创建多个处理线程,每个处理线程分别负责指定磁盘的数据读取,并且为指定的用户服务;每个所述处理线程针对其所服务的每个用户,通过为每个用户分配的一组双缓存中的工作缓存向每个用户传输数据,在所述工作缓存中缓存的数据传输完毕后,控制进行所述工作缓存和空闲缓存之间的切换。利用本发明实施例,可以实现提高现有磁盘存储的吞吐率,消除使用单缓存所带来的延迟。
文档编号G06F12/08GK102426553SQ20111035761
公开日2012年4月25日 申请日期2011年11月11日 优先权日2011年11月11日
发明者李俊, 韩坤鹏, 马书超 申请人:中国科学技术大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1