用于在冲突存在时进行有效任务调度的方法与流程

文档序号:14649821发布日期:2018-06-08 21:33阅读:173来源:国知局
用于在冲突存在时进行有效任务调度的方法与流程

敏感且高性能的应用可以改善用户体验。任务并行编程模型广泛用于开发对用户呈现出高性能和对用户敏感的应用。在这种应用开发模型中,应用中的计算被分解为各任务-各小块工作-其中一些任务被指定为在其它任务完成后运行,这些称为任务依赖性。管理并行任务的执行以避免冲突并以支持任务间的相互依赖性是一项编程挑战。



技术实现要素:

各种实施例的方法和装置提供用于在计算设备上存在任务冲突边时进行任务调度的电路和方法。各种实施例可以包括:确定第一任务和第二任务是否是通过任务冲突边相关的;响应于确定所述第一任务和所述第二任务是通过所述任务冲突边相关的,确定所述第二任务是否获取为所述第一任务和所述第二任务的执行所需要的资源;以及响应于确定所述第二任务未能获取所述资源,分配从所述第一任务到所述第二任务的动态任务依赖性边。

在一些实施例中,响应于确定所述第二任务未能获取所述资源而分配从所述第一任务到所述第二任务的动态任务依赖性边可以包括:确定所述第一任务的执行是否完成;以及响应于确定所述第一任务的所述执行未完成,而分配从所述第一任务到所述第二任务的所述动态任务依赖性边。

在一些实施例中,响应于确定所述第二任务未能获取所述资源而分配从所述第一任务到所述第二任务的动态任务依赖性边可以包括:锁定所述第一任务;在锁定所述第一任务之后分配从所述第一任务到所述第二任务的所述动态任务依赖性边,以及解锁所述第一任务。

在一些实施例中,分配从所述第一任务到所述第二任务的动态任务依赖性边可以包括:从数据结构中移除对所述任务冲突边的指示符,以及将对所述动态任务依赖性边的指示符添加到所述数据结构。

一些实施例可以进一步包括:所述第一任务获取所述资源,其中,可以通过要求以与为所述第二任务或第三任务的执行所需要的至少一个其它资源相关的顺序处理所述资源,来避免死锁和循环动态任务依赖性;响应于分配从所述第一任务到所述第二任务的所述动态任务依赖性边,用信号通知被分配用于执行所述第二任务的处理器核进入空闲状态;接收关于所述第一任务完成的信号;以及用信号通知被分配用于执行所述第二任务的所述处理器核从所述空闲状态唤醒。

一些实施例还可以包括:确定是否满足冲突策略;以及响应于确定满足所述冲突策略来确定所述第二任务是否是准备好的任务,而不是响应于确定所述第二任务未能获取所述资源而分配从所述第一任务到所述第二任务的所述动态任务依赖性边。

在一些实施例中,确定是否满足所述冲突策略可以进一步包括确定阈值量的动态任务依赖性边是否在分配会话中被分配给所述第二任务。

在一些实施例中,所述冲突策略可以包括在分配会话中被分配给所述第二任务的动态任务依赖性边的阈值量,并且所述动态任务依赖性边的阈值量是基于针对执行任务的功耗、任务执行等待时间以及所述第二任务的关键性中的至少一项来确定的。

各种实施例可以包括被配置用于在存在任务冲突边时进行任务调度的计算设备。所述计算设备可以包括:为第一任务和第二任务的执行所需要的包括存储器设备的资源、彼此通信地连接的多个处理器核,所述多个处理器核包括第一处理器核、第二处理器核和第三处理器核,其中,所述第二处理器核和所述第三处理器核通信地连接到所述资源,并且所述第一处理器核被配置有处理器可执行指令以执行上述实施例方法中的一个或多个的操作。

各种实施例可以包括被配置用于在存在任务冲突边时进行任务调度的计算设备,其具有用于执行上述实施例方法中的一个或多个实施例方法的功能的单元。

各种实施例可以包括其上存储有处理器可执行指令的非暂时性处理器可读存储介质,所述处理器可执行指令被配置为使计算设备的处理器执行上述实施例方法中的一个或多个的操作。

附图说明

并入本文并且构成本说明书的一部分的附图示出了各种实施例的示例实施例,并且与上面给出的一般描述和下面给出的详细描述一起用于解释权利要求的特征。

图1是示出适于实现实施例的计算设备的组件框图。

图2是示出适于实现实施例的示例多核处理器的组件框图。

图3A-3D是示出根据实施例的包括动态任务依赖性的示例任务图的示意图。

图4A-4D是示出根据实施例的包括动态任务依赖性的示例任务图的示意图。

图5是示出用于在存在任务冲突时进行高效任务调度的实施例方法的处理过程流程图。

图6是示出用于分配动态任务依赖性的实施例方法的处理过程流程图。

图7是示出用于用动态任务依赖性替换任务冲突的实施例方法的处理过程流程图。

图8是示出用于用动态任务依赖性替换任务冲突的实施例方法的处理过程流程图。

图9是示出适用于各种实施例的示例移动计算设备的组件框图。

图10是示出适用于各种实施例的示例移动计算设备的组件框图。

图11是示出适用于各种实施例的示例服务器的组件框图。

具体实施方式

将参照附图详细描述各种实施例。只要有可能,在整个附图中将使用相同的附图标记来表示相同或相似的部分。对特定示例和实现方案的引用是用于说明的目的,而不是为了限制权利要求的范围。

术语“计算设备”和“移动计算设备”在本文中可互换使用,以指代蜂窝电话、智能电话、个人或移动多媒体播放器、个人数据助理(PDA)、膝上型计算机、平板电脑、可转换笔记本电脑/平板电脑(2合1计算机)、智能本、超极本、上网本、掌上电脑、无线电子邮件接收器、支持多媒体因特网的蜂窝电话、移动游戏控制台、无线游戏控制器以及包含存储器以及多核可编程处理器的类似的个人电子设备中的任何一个或全部。尽管各种实施例对于具有有限存储器和电池资源的移动计算设备(例如智能手机)特别有用,但是这些实施例通常可用于实现了多个存储设备以及有限功率预算的任何电子设备,其中降低处理器的功耗可以延长移动计算设备的电池工作时间。术语“计算设备”还可以指包括个人计算机、台式计算机、一体式计算机、工作站、超级计算机、大型计算机、嵌入式计算机、服务器、家庭影院计算机和游戏控制台的固定计算设备。

各实施例包括实现了如下方法的系统和设备,这些方法用于通过使用调度技术提供并行任务的高效执行来提高设备性能,其中调度技术考虑任务依赖性和任务冲突。方法、系统和设备可以用动态任务依赖性替换任务之间的资源冲突,这确保添加动态任务依赖性仅当一任务拥有受制于资源冲突的资源直到添加动态任务依赖性之后为止时发生,并且通过规定在重调度之前识别的冲突的限度来控制重调度受制于动态任务依赖性的任务的频率。

任务依赖性实施了对任务执行的先验排序。依赖性t1->t2(“->”表示依赖性)规定任务t1必须在任务t2开始执行之前完成,而不是相反。一些任务可能通过“任务冲突”相关。冲突t1=t2(“=”表示任务冲突)规定任务t1必须在t2开始执行之前完成,或者任务t2必须在t1开始执行之前完成,但任务t1和t2的执行不得重叠。换句话说,通过任务冲突相关的两个任务可以被任务调度器以任一顺序而非同时地调度用于执行。这种任务冲突通常由于任务需要独占访问一个或多个共享资源而产生,其中一个或多个共享资源可以包括计算设备的受限可用性的任何物理或虚拟组件。资源的例子可以包括处理组件、处理时间、储存组件或存储器组件、存储位置或存储器位置、内部通信组件和外部通信组件、内部通信带宽和外部通信带宽、电力组件、电力、输入组件/输出组件、输入信号/输出信号等等。例如,当任务同时写入存储器设备(例如具有不同步的存储器访问的两个处理器上的数据缓冲器)时,可能发生对资源的共享。在存在任务依赖性和任务冲突时进行任务调度是困难的。

在各种实施例的描述中对特定资源的引用(包括对物理资源和虚拟资源的引用)旨在作为非限制性示例。计算设备的任何资源可能受制于在本文提供的任何描述和示例,并且为了示例性目的,各种类型的任何物理资源或虚拟资源可以替代在本文引用的资源。

由于多个任务可能共享不能被多个任务同时访问的资源,任务之间的依赖性和冲突关系可能会影响对任务的调度。任务冲突可以被建模为资源获取问题。作为例子,考虑任务冲突t1=t2。这种冲突可以被建模为任务需要独占访问资源R。如果任务有多个冲突,则其必须获取对与这些冲突相关联的所有资源的独占访问。在没有冲突的常规任务调度中,当任务的所有依赖性都被满足时,任务是准备好以便执行的。

在具有冲突的任务调度中,任务调度器必须确定准备好的任务是否能够获取对所有资源的独占访问并且在没有冲突地情况下执行。与正被考虑的任务发生冲突的其它任务必须被安排在以后执行。对于尝试同时访问相同资源的任务,可以允许单个任务访问或拥有该资源并成为所有者任务。获取资源的所有权可以通过几种方式来实现。在各种实施例中,资源可以是存储器中的指定位置,其中,存储器中被设为零或空值的字节用以指示没有任务拥有该资源并且存储器中被设为任务的地址(或“任务指针”)的字节用以指示任务拥有该资源。成功获取指定资源的所有权可以涉及:原子地检查存储在该资源的存储器位置中的值是零或者空值,以及与任务指针交换该值。在该资源的存储器位置中存储的不为零或空值的值可以指示该资源已由与所存储的值对应的不同任务所拥有。可以防止其它任务访问所拥有的资源并可以重调度其它任务。可以实现重调度,使得尝试访问所有者任务拥有的资源的任务不继续尝试访问所拥有的资源并浪费通过进行重复的访问尝试的电力和处理资源。

与第二任务(“t2”)具有冲突关系的经初始化的第一任务(“t1”)可以进行第一次尝试以访问受制于冲突的资源。当第二任务尚未成为资源的所有者任务时,第一任务可以成功访问资源,从而使第一任务成为资源的所有者任务。当第二任务已是资源的所有者任务时,第一任务可能无法访问资源。响应于访问资源的不成功尝试,第一任务和第二任务之间的冲突关系可以由动态任务依赖性关系t2=>t1(“=>”表示动态任务依赖性)来替代,该动态任务依赖性关系指定任务t2必须在任务t1开始执行之前完成,由此放弃资源的所有权。

为了避免第一任务以及对第一任务具有依赖性的任何任务在等待状态下搁置(languishing),添加动态任务依赖性可以仅当所有者任务拥有受制于资源冲突的资源直到添加动态任务依赖性之后为止时发生。在一个实施例中,响应于确定第二任务是所有者任务,可以阻止第二任务完成直到添加动态任务依赖性t2=>t1之后为止。这可以通过如下来实现:需要所有者任务被锁定以便完成添加动态任务依赖性,由此锁定第二任务直到添加动态任务依赖性t2=>t1之后为止,然后解锁第二任务以便第二任务可以完成。在一个实施例中,响应于确定第二任务是所有者任务,可以检查第二任务的状态以确定在添加动态任务依赖性t2=>t1之前第二任务是否已完成。任一实施例都避免了如下问题:当依赖性不再必要时建立依赖性t2=>t1,并致使第一任务等待关于第二任务已经完成且关于受制于冲突的资源可用的信号,但直到第二任务下一次执行时才接收到这样的信号或者如果第二任务从不再执行则根本接收不到这样的信号。这还避免了直接或间接依赖于第一任务的任务基于第一任务未执行进行等待的级联效应。

可以检查对受制于第一任务与任意数量的其它任务的冲突的资源的访问。每当对受制于冲突的资源的访问被拒绝时,可以为第一任务添加新的动态任务依赖性。对于每个冲突任务,可以检查对受制于针对第一任务的冲突的资源的访问。第一任务可以根据所添加的动态依赖性被重调度。在一个实施例中,用于重调度具有添加的动态任务依赖性的任务的策略可以基于在检查会话中添加多少动态依赖性来控制第一任务被重调度的频率。换句话说,用于限制针对任务的新添加的动态依赖性的数量的策略可以在达到限制并可以重调度第一任务时中断关于检查对受制于针对第一任务的冲突的资源的访问的过程,即使还没有针对与第一项任务冲突的所有任务检查全部对于受制于冲突的资源的访问也是如此。在后续尝试执行第一任务时,可以检查对于受制于冲突的资源的其余访问。策略可以针对不同的任务并出于不同的目的(例如提供一定量的任务等待时间和/或资源消耗)来设置。

动态依赖性边的无知添加可能在先前非循环图中造成循环。当多个任务同时尝试获取多个资源时,可能造成死锁。例如,第一任务可以尝试以第一资源(“R1”)和第二资源(“R2”)的顺序获取诸如R1和R2的资源,同时第二任务试图先获取R2然后获取R1。每个任务可能等待另一任务拥有的资源的可用性,这导致关于任务等待获取资源的死锁。资源获取期间的死锁和循环依赖性两者可以通过许多方法来避免。在各种实施例中,用于任务的资源可以总是以规范顺序(例如,用于R1和R2的对应资源句柄的指针地址的排序顺序)、或者以分配给每个资源的唯一资源标识符(ID)的排序顺序来处理。在各种实施例中,可以使用死锁检测和恢复技术。

图1示出了包括与适用于各种实施例的远程计算设备50通信的计算设备10的系统。计算设备10可以包括具有处理器14、存储器16、通信接口18和储存存储器接口20的片上系统(SoC)12。计算设备还可以包括通信组件22,诸如有线或无线调制解调器、储存存储器24、用于建立到无线网络30的无线连接32的天线26、和/或用于连接到去往因特网40的有线连接44的网络接口28。处理器14可以包括任何各种硬件核,例如多个处理器核。

在本文使用的术语“片上系统”(SoC)是指一组互连电子电路,典型地但不排他地包括硬件核、存储器和通信接口。硬件核可以包括各种不同类型的处理器,诸如通用处理器、中央处理单元(CPU)、数字信号处理器(DSP)、图形处理单元(GPU)、加速处理单元(APU)、辅助处理器、单核处理器和多核处理器。硬件核还可以实施其它硬件和硬件组合,诸如现场可编程门阵列(FPGA)、专用集成电路(ASIC)、其它可编程逻辑电路、分立门逻辑、晶体管逻辑、性能监测硬件、watchdog硬件和时间参考。集成电路可以被配置成使得集成电路的组件驻留在诸如硅的单片半导体材料上。SoC 12可以包括一个或多个处理器14。计算设备10可以包括多于一个的SoC 12,由此增加处理器14和处理器核的数量。计算设备10还可以包括不与SoC 12相关联的处理器14。各个处理器14可以是如下面参照图2所述的多核处理器。每个处理器14可以被配置用于特定目的,该特定目的可以与计算设备10的其它处理器14相同或不同。具有相同或不同配置的处理器核和处理器14中的一个或多个可以被分组在一起。一组处理器14或处理器核可以被称为多处理器集群。

SoC 12的存储器16可以是被配置用于存储数据和处理器可执行代码以供处理器14访问的易失性或非易失性存储器。计算设备10和/或SoC 12可以包括被配置用于各种目的的一个或多个存储器16。在一个实施例中,一个或多个存储器16可以包括诸如随机存取存储器(RAM)或主存储器或高速缓存存储器的易失性存储器。这些存储器16可以被配置为暂时地保存从数据传感器或子系统接收的有限量的数据、从非易失性存储器请求的数据和/或处理器可执行代码指令、从非易失性存储器加载到存储器16以期将来基于各种因素的访问、和/或由处理器14产生并被暂时地存储以供将来的快速访问而不被存储在非易失性存储器中的中间处理数据和/或处理器可执行代码指令。

存储器16可以被配置为至少暂时地存储数据和处理器可执行代码,该数据和处理器可执行代码从另一存储器设备(例如另一存储器16或储存存储器24)加载到存储器16,以供一个或多个处理器14访问。响应于处理器14执行功能,被加载到存储器16的数据或处理器可执行代码可以被加载。响应于功能的执行而将数据或处理器可执行代码加载到存储器16可能源于不成功的对存储器16的存储器访问请求或未命中,这是因为所请求的数据或处理器可执行代码不位于存储器16中。响应于未命中,可以进行对另一存储器16或储存存储器24的存储器访问请求,以将所请求的数据或处理器可执行代码从另一存储器16或储存存储器24加载到存储器设备16。响应于功能的执行而将数据或处理器可执行代码加载到存储器16可能源于对另一存储器16或储存存储器24的存储器访问请求,并且数据或处理器可执行代码可以被加载到存储器16以供稍后访问。

通信接口18、通信组件22、天线26和/或网络接口28可以一致地工作以使得计算设备10能够经由无线连接32通过无线网络30和/或通过有线网络44与远程计算设备50进行通信。可以如下来实现无线网络30:使用包括例如用于无线通信的射频频谱的各种无线通信技术,以向计算设备10提供到因特网40的连接,其中计算设备10可以通过该连接与远程计算设备50交换数据。

储存存储器接口20和储存存储器24可一起工作以允许计算设备10将数据和处理器可执行代码存储在非易失性存储介质上。储存存储器24可以被配置得非常类似于存储器16的实施例,其中储存存储器24可以存储用于由一个或多个处理器14访问的数据或处理器可执行代码。非易失性的储存存储器24即使在计算设备10的电源被关闭之后也可以保留信息。当电源被重新接通并且计算设备10重新启动时,存储在储存存储器24上的信息可以可用于计算设备10。储存存储器接口20可以控制对储存存储器24的访问并允许处理器14从储存存储器24读取数据并将数据写入储存存储器24。

计算设备10的一些或全部组件可以被不同地布置和/或组合,同时仍然提供必要的功能。此外,计算设备10可以不限于每个组件中的一个,并且每个组件的多个实例可以被包括在计算设备10的各种配置中。

图2示出了适于实现各种实施例的多核处理器14。多核处理器14可以具有多个同构或异构处理器核200、201、202、203。处理器核200、201、202、203可以是同构的,在于:单个处理器14的处理器核200、201、202、203可以被配置用于相同的目的,并且具有相同或相似的性能特征。例如,处理器14可以是通用处理器,并且处理器核200、201、202、203可以是同构通用处理器核。或者,处理器14可以是图形处理单元或数字信号处理器,并且处理器核200、201、202、203可以分别是同构图形处理器核或数字信号处理器核。为了便于引用,术语“处理器”和“处理器核”在本文中可以互换使用。

处理器核200、201、202、203可以是异构的,在于:单个处理器14的处理器核200、201、202、203可以被配置用于不同的目的和/或具有不同的性能特征。这种异构处理器核的异构性可以包括不同的指令集体系结构、流水线、工作频率等。这种异构处理器核的示例可以包括被称为“big.LITTLE”体系结构,其中较慢的低功率处理器核可以与功率较强且耗电的处理器核。在类似的实施例中,SoC 12可以包括多个同构或异构处理器14。

在图2所示的例子中,多核处理器14包括四个处理器核200、201、202、203(即,处理器核0、处理器核1、处理器核2和处理器核3)。为了便于解释,本文的示例可以参照图2中示出的四个处理器核200、201、202、203。然而,图2中示出并在本文描述的四个处理器核200、201、202、203可以仅作为示例提供,决不意味着将各种实施例限于四核处理器系统。计算设备10、SoC 12或多核处理器14可以单独地或组合地包括少于或多于在本文被示出和描述的四个处理器核200、201、202、203。

图3A-3D示出各种任务图配置300a-300e中的示例任务图。任务图及其各种任务图配置300a-300e(包括任务302a-302d、任务304a-304c、任务依赖性边(由不同的任务302a-302d与304a之间的箭头表示)、任务冲突边306a和306b、和动态任务依赖性边308a-308c)仅仅是示例性的,并且可以被配置有不同数量的任务和任务之间的不同关系。

图3A示出了具有通过任务依赖性边彼此相关的任务302a-302d和304a的示例任务图配置300a。换句话说,一个任务依赖于另一个任务,使得依赖任务不能在依赖任务所依赖的任务之前执行。例如,任务302b依赖于任务302a,因此任务302b不能在任务302a完成执行之前执行。以类似的方式,任务304a也依赖于任务302a,任务302c依赖于任务302b,并且任务302d依赖于任务302c和任务304b。任务图配置300a还包括通过任务冲突边306a和306b彼此相关的任务304a-304c。换句话说,一个任务不依赖于另一个任务在于:彼此冲突的两个或更多个任务可以以任何顺序执行,然而,彼此冲突的两个任务可能不同时执行。任务304a-304c之间的冲突边302a和302b可以表示彼此冲突的任务可能需要访问相同的资源以便执行。于是,在这个例子中,任务304a和任务304b可能需要相同的资源以便执行,并且可能不同时执行。类似地,任务304b和任务304c可能需要相同的资源以便执行,并且可能不同时执行。

在各种实施例中,任务调度器(未示出)可以用动态任务依赖性边替换任务冲突边。用动态任务依赖性边替换任务冲突边可以包括将任务相关在用于管理任务之间的关系的数据结构中。将任务相关在数据结构中可以包括:将任务添加到数据结构使得任务在数据结构中的位置暗示任务的关系,或者更新数据结构使得现有条目被改变以指示任务之间的新关系。任务冲突边是否被动态任务依赖性边取代可以取决于与任务冲突边相关联的任务是否是准备好的任务以及与任务冲突边相关联的一个或多个资源是可用于供准备好的任务使用还是由任务冲突相关的任务所拥有。

通常,对于准备好的任务未能获取已拥有的资源,被分配以执行准备好的任务的线程和/或处理器将进行旋转,不断地尝试获取资源直到成功为止,这可能在获取之前采取多次尝试,每次尝试时使用计算设备的功率、处理和带宽资源。调度器可以跟踪任务之间的关系。只要动态任务依赖性边持续存在,调度器就可以允许被分配以执行准备好的任务的线程和/或处理器空闲,或者处理其它不相关的准备好的任务。一旦完成,资源所有者任务可以向调度器发信号,并且调度器可以移除动态任务依赖性边并且用信号通知被分配以执行准备好的任务的线程和/或处理器唤醒,以便其可以尝试获取被已完成的任务放弃的资源。

在各种实施例中,准备好的任务可以经由动态边依赖性与多个其它任务相关,并且调度器可以允许准备好的任务在所需要的资源变得可用时获取所需要的资源,或者可以仅允许准备好的任务在所有所需要的资源都可用时获取所需要的资源。资源可用性可以使用各种技术来跟踪。在各种实施例中,资源可以是存储器中的指定位置,其中存储器中被设为零或空值的字节用以指示没有任务拥有该资源并且存储器中被设为任务的地址(或“任务指针”)的字节用以指示任务拥有该资源。获取指定资源的所有权可以涉及:原子地检查在资源的存储器位置中存储的值为零或空值,以及将该值与任务指针交换。在资源的存储器位置中存储的不为零或空值的值可以指示资源已经由与所存储的值对应的不同任务所拥有。死锁可能由循环动态依赖性边引起,导致第一任务等待获取由正等待获取由第一任务所拥有的资源的第二任务所拥有的资源。为了避免这种死锁,在各种实施例中,针对任务的资源可以总是以规范顺序(例如,资源的对应资源句柄的指针地址的排序顺序)、或者以被分配给每个资源的唯一资源标识符(ID)的排序顺序来处理。在各种实施例中,可以使用死锁检测和恢复技术。换言之,可以通过如下来避免死锁和循环动态任务依赖性:需要为第一任务的执行而需要的资源以与为另一任务的执行而需要的至少一个其它资源相关的顺序来处理。

图3B示出了具有与参照图3A描述的任务图配置300a相同的配置的示例任务图配置300b,不同之处在于动态任务依赖性边308a替换了任务冲突边306a。在这个示例中,任务304a可以是准备好的任务。于是,任务302a可能已经完成执行,满足了任务304a对任务302a的依赖性。为了执行任务304a,由计算设备的处理器或处理器核之一实现的用于执行任务304a的线程可以尝试并成功地获取为执行任务304a所需要的资源。如本文所描述地,任务304a和任务304b之间的任务冲突边306a指示任务304a和304b两者都需要相同的资源以便执行。

在一些情形下,任务304b也可以是准备好的任务,并且用于执行任务304b的线程可能不能获取任务304a和304b两者需要以便执行的资源。计算设备的任务调度器或其它模块可以确定任务304a和304b两者需要执行的资源已被任务304a拥有。因此,任务304b将不能执行,直到任务304a放弃资源的所有权为止。在这种情况下,计算设备的任务调度器可以用动态任务依赖性边308a替换任务304a和任务304b之间的冲突边306a。将冲突边306a改变为动态任务依赖性边308a可以表明任务304b现在依赖于任务304a的完成,由此放弃供任务304b执行的所需要的资源。添加动态任务依赖性边308a可以向用于执行任务304b的线程表明线程可以空闲或者处理其它不相关的准备好的任务,直到通知动态任务依赖性边308a被移除为止,该通知指示任务304a已经完成执行并放弃了供任务304b执行所需要的资源。在这个示例中,任务304c可以执行而不管任务304a是否拥有该资源。

图3C示出了具有与参照图3A描述的任务图配置300a相同的配置的示例任务图配置300c,不同之处在于动态任务依赖性边308a替换了任务冲突边306a并且动态任务依赖性边308b替换了任务冲突边306b。任务图配置300c示出了与参照图3B描述的任务图配置300b的示例类似的示例。也就是说,动态任务依赖性边308a和308b中的每个可以根据其相应的任务304a-304c所需要的不同资源将其相应的任务304a-304c相关。换句话说,示例任务图配置300c可以应用如下处理过程:针对第一资源确定在任务304a和304b之间的动态任务依赖性边308a,并且针对第二资源确定在任务304b和304c之间的动态任务依赖性边308b。作为结果,动态任务依赖性边308a和308b可以不相互依赖。然而,在这个示例中,任务304a-304c的执行可能实际上彼此依赖。尽管任务304a和304c不需要相同的资源,但任务304c可能动态地依赖于任务304b,任务304b可能动态地依赖于任务304a。因此,任务304c可能直到任务304b之后才能够执行,并且任务304b可能直到任务304a之后为止才能执行。

任务图配置300c示出其中任务304a-304c中的每个需要相同的资源以便执行的示例。在这种情形下的各种实施例中,用动态任务依赖性边308a替换任务冲突边306a可以以与参照图3B描述的任务图配置300b的示例类似的方式发生。另外,调度器可以确定任务304c可能需要相同的资源作为受制于动态任务依赖性边308a的资源以便执行。为了避免对于由任务304a放弃且由任务304b和304c所需要的资源的竞争状况,用于实现各种实施例的任务调度器可以通过将任务冲突边306b替换为动态任务依赖性边308b来优先考虑任务304b和304c的执行的顺序。以这样的方式,当任务304c保持空闲或者处理其它不相关的准备好的任务时,任务304b可以被通知任务304a放弃的资源的可用性,并且在资源被任务304b放弃之后,任务304c可以被通知资源的可用性。

图3D示出了具有与参照图3A描述的任务图配置300a相同的配置的示例任务图配置300d,不同之处在于动态任务依赖性边308b替换了任务冲突边306b。任务图配置300d示出与参照图3B描述的任务图配置300b的示例类似的示例。也就是说,在示例任务图配置300d中,任务304b是获取任务304b和304c所需要的资源的准备好的任务。由于任务304c因资源被任务304b拥有而未能获取任务304c需要以便执行的该资源,所以根据各种实施例的任务调度器用任务依赖性边308b替换任务冲突边306b。用于执行任务304c的线程和/或处理器被允许当任务304b执行时空闲或者处理在其它不相关的准备好的任务,并且在任务304b完成执行之后被用信号通知获取由任务304b放弃的资源。在这个示例中,无论任务304b是否拥有资源,任务304a都可以执行。

图4A-4D示出了各种任务图配置400a-400d中的示例任务图。任务图及其各种任务图配置400a-400d(包括任务302a-302d、任务304a-304c、任务依赖性边(由不同的任务302a-302d和304a之间的箭头表示,并且包括任务依赖性边402)、任务冲突边306a和306b以及动态任务依赖性边308a和308b)仅仅是示例性的,并且可以被配置有不同数量的任务和不同的任务间关系。

图4A示出了具有与参照图3A描述的任务图配置300a相同的结构的示例任务图配置400a,其中,在任务304a和304c之间添加了任务依赖性边402。这样,任务图配置400a包括与任务图配置300a类似的特征,不同之处在于任务304c依赖于任务304a并且因此任务304c不能在任务304a之前执行。

图4B示出了具有与参照图3B描述的任务图配置300b相同的结构的示例任务图配置400b,其中,在任务304a和304c之间添加了任务依赖性边402。任务304a和304b的执行可能受制于与针对任务图配置300b所描述的相同的示例。任务304c的执行可能不受用动态任务依赖性边308a替换任务冲突边306a的影响。然而,在该示例中,任务304a和304b之间的动态任务依赖性边308a被颠倒,使得任务304b是首先获取为执行任务304a和304b所需要的资源。因此,任务304c可能事实上变得经由任务304a依赖于任务304b。

图4C示出了具有与参照图3C描述的任务图配置300c相同的结构的示例任务图配置400c,其中,在任务304a和304c之间添加了任务依赖性边402。任务304a和304b的执行可能受制于与针对任务图配置300c所描述的相同的示例。此外,无论受制于动态任务执行边308a和308b的资源是否相同,任务304c现在都可能依赖于任务304a并且动态地依赖于任务304b。然而,尽管任务304c直接依赖于任务304a,由任务304a放弃为执行任务304c所需要的第一资源也可能不足以执行任务304c,因为为执行任务304c所需要的第二资源可能被任务304b所拥有。在各种实施例中,调度器可唤醒用于执行任务304c的线程和/或处理器以获取由任务304a放弃的第一资源。在各种实施例中,调度器可允许用于执行任务304c的线程和/或处理器在等待第二资源被任务304b放弃的同时回到空闲。在各种实施例中,只有当第一和第二资源两者被任务304a和304b放弃时,调度器才唤醒用于执行任务304c的线程和/或处理器。在各种实施例中,等待仅当第一资源和第二资源都可用时才唤醒用于执行任务304c的线程和/或处理器才可以在另一任务需要第一资源或第二资源中的一个以便执行时实现。

在一些情况下,相同的资源可能受制于动态任务依赖性边308a和依赖性边402。为了避免对于由任务304a放弃且由任务304b和304c所需要的资源的竞争状况,用于实现各种实施例的任务调度器可以优先考虑任务304b和304c的执行的顺序。以这种方式,可以当较低优先级任务保持空闲或者处理其它不相关的准备好的任务时,向较高优先级任务通知由任务304a放弃的资源的可用性,并且可以在资源被较高优先级任务放弃之后向较低优先级任务通知资源的可用性。在各种实施例中,任务调度器可以相比依赖性边402优先考虑动态任务依赖性边308a和308b,使得任务调度器可以添加动态任务依赖性边308b,以便任务304b获取受制于其与任务304c的任务冲突的资源并在任务304c之前执行。

图4D示出了具有与参照图3D描述的任务图配置300d相同的结构的示例任务图配置400d,其中,在任务304a和304c之间添加了任务依赖性边402。任务304a和304b的执行可能受制于与针对任务图配置300d所描述的相同的示例。如参照图4C针对示例任务图配置400c所描述地,调度器可以用动态任务依赖性边308b来优先考虑任务304b和304c的执行。这样,尽管被任务304a放弃的第一资源可用,但是任务304c的执行可能被延迟到任务304b完成为止,因为动态任务依赖性边308b可能指导任务调度器允许任务304b在任务304c之前获取第二资源。

图5示出了用于在存在任务冲突时进行任务调度的实施例方法500。方法500可以在计算设备中以在处理器中执行的软件、以通用硬件或专用硬件来实现,并且可以在任何这样的配置中被实现为任务调度器。在各种实施例中,方法500可以由多个处理器或硬件组件上的多个线程来实现。

在确定框502中,计算设备(例如,在计算设备内实现的任务调度器)可以确定任务t是否是准备好的任务。为了确定任务t是否是准备好的任务,计算设备可以确定任务t是否依赖于任何其它任务。在一些实施例中,计算设备可以确定任务t是否被包括在用于指示对另一任务的依赖性和/或动态依赖性的数据结构中。这可以包括分析单个或多个数据结构中的单个条目或多个条目。每个这样的数据结构可以专用于特定的任务关系,或者可以包括多种类型的任务关系。确定任务t被输入为依赖于另一任务可以指示任务t不是准备好的任务。确定任务t被输入为不依赖于另一任务或未被输入到数据结构中可以指示任务t不依赖于另一任务并因此是准备好的任务。

响应于确定任务t不是准备好的任务(即,确定框502=“否”),在确定框502中,计算设备可以继续检查任务t是否是准备好的任务。

响应于确定任务t是准备好的任务(即,确定框502=“是”),计算设备可以在确定框504中确定任务t是否具有与任务tj的任务冲突。如参照图6进一步描述,对于任务t是否具有与另一任务的冲突的确定可以针对多个任务来实现。类似于确定任务t是否依赖于另一任务,计算设备可以分析数据结构以确定任务t是否具有与任务tj的冲突,查找指示任务t与任务tj之间的冲突的条目。在各种实施例中,数据结构可以被配置为指示冲突关系或者可以指示每个任务所需要的资源,并且所需要的资源可以被比较以确定是否存在冲突。例如,需要至少一个相同资源的两个任务可能相互冲突。

响应于确定任务t没有与任务tj的冲突(即,确定框504=“否”),计算设备可以在框512中获取供任务t执行所需要的资源。例如,可以锁定所需要的资源,以便在任务t执行时任何其它任务都不能访问该任务。在各种实施例中,获取资源可能不需要对资源的独占访问,并且资源可以由其它任务共享(诸如当只需要读取访问或者资源中的不同部分被访问时)。在框514中,计算设备可以使用所获取的资源来执行任务t。

响应于确定任务t确实与任务tj有冲突(即,确定框504=“是”),计算设备可以在框506中尝试获取资源(包括受制于任务冲突的资源)用于执行任务t。计算设备可以尝试以与针对框512所描述的方式类似的方式来获取资源。在各种实施例中,尝试获取资源可以使用参照图3A所描述的资源可用性跟踪和/或死锁避免技术。在各种实施例中,计算设备可以在获取资源之前检查资源的可用性。对于可用的资源,计算设备可以获取资源,并且对于不可用的资源,计算设备可以跳过获取资源。在各种实施例中,计算设备可以在各个资源可用时获取各个可用资源,或者可以仅在一组或全部所需要的资源可用时才获取资源。

在确定框508中,计算设备可确定任务t是否获取包括受制于任务冲突的资源的资源用于执行任务t。取决于任务t的执行需求,当其它任务具有的对资源的所有权不允许任务t取得对资源的独占或共享所有权时,计算设备可能不能获取为执行任务t所需要的任何资源。在各种实施例中,关于任务t是否获取资源的确定可以包括:从任务接收指示获取了资源的信号,或者通过检查在存储器中针对资源的字节中设置的任务的地址(或“任务指针”)来使用资源可用性跟踪。

响应于确定计算设备未能获取包括受制于任务冲突的资源的资源以便执行任务t(即,确定框508=“否”),计算设备可以在框510分配从任务tj到任务t的动态任务依赖性边。换句话说,计算设备可以使任务t动态地依赖于任务tj,要求任务tj在执行任务t之前放弃为了任务t的执行而需求的资源。参照图6进一步描述了分配从任务tj到任务t的动态任务依赖性边。

响应于确定计算设备获取了用于执行任务t的包括受制于任务冲突的资源的资源(即,确定框508=“是”),计算设备可以在框514中使用所获取的资源执行任务t。

图6示出了用于分配动态任务依赖性的实施例方法600。方法600可以在计算设备中以在处理器中执行的软件、以通用硬件或专用硬件来实现,并且可以在任何这样的配置中被实现为任务调度器。在各种实施例中,方法600可以由多个处理器或硬件组件上的多个线程来实现。在各种实施例中,方法600可以被实现为如参照图5所描述的框510的一部分。

在确定框602中,计算设备(例如,在计算设备内执行的任务调度器)可以确定是否满足冲突策略。在各种实施例中,冲突策略可以确定每分配会话将多少个动态任务依赖性边分配给任务t。换句话说,不管是否仍有待分析与任务t的冲突的其它任务,冲突策略都可以响应于特定数量的动态任务依赖性边被分配给任务t而中断分配会话。任务策略可以根据诸如任务等待时间、功耗和任务关键性的各种因素来设置。例如,为了增加任务等待时间,策略可以增加被分配给任务t的动态任务依赖性边的数量,并且可以减少动态任务依赖性边的数量以减少任务等待时间。确定是否满足冲突策略还可以基于时间、其它任务的执行的次数、处理器周期和其它度量。

任务等待时间可能与动态任务依赖性边的数量有关,因为在尝试获取所需资源之前任务t必须等待完成的任务越多,则可能需要的时间越长。类似地,较少的动态任务依赖性边可以允许任务t较频繁地尝试获取所需要的资源,因此可能较快。在另一个示例中,与动态任务依赖性边的数量的功耗关系可能与等待时间逆相关。动态任务依赖性边越少,任务t尝试获取所需要的任务越频繁,从而被分配用于执行任务t的线程和/或处理器的空闲时间越少并且越活跃。在另一个示例中,任务的关键性越高,动态任务依赖性边可能被分配地越少,使得任务可能与针对执行的关键时段越同时地执行。

响应于确定冲突策略被满足(即,确定框602=“是”),计算设备可以在确定框502中确定任务t是否是准备好的任务,并继续执行参照图5所描述的方法500。

响应于确定冲突策略未被满足(即,确定框602=“否”),计算设备可以在框604中用从任务tj到任务t的动态任务依赖性边替换任务t和任务tj之间的任务冲突边。如参照图5所示,计算设备可以维护指示任务之间的关系的数据结构。为了用从任务tj到任务t的动态任务依赖性边替换任务t和任务tj之间的任务冲突边,计算设备可以创建或更新一个或多个数据结构中的条目以指示任务冲突边的移除和动态任务依赖性边的添加。在各种实施例中,指示各种关系和各种任务的条目可以被维护在一个或多个数据结构中。在各种实施例中,可能不必需移除或编辑任务边冲突条目,因为动态任务依赖性边条目可以简单地取代其它关系条目。

在框606中,例如通过将任务tj设置为tj+1,计算设备可以改变与tj相关的任务。如本文所述,动态任务依赖性边的分配可以持续进行,直到满足冲突策略或者直到不再有任务与任务t冲突为止。但是,只要有余下的任务并且不满足冲突策略,任务t就可以被与下一任务进行比较。在确定框504中,计算设备可以确定任务t是否具有与任务tj的任务冲突并且继续进行参照图5所描述的方法500。

在各种实施例中,确保任务tj不在确定任务t不能获取由冲突任务tj所拥有的被需要以便执行的资源与用动态任务依赖性边替换任务冲突边之间的时间完成可能是重要的。这个约束可以有助于防止:任务t因资源在动态任务依赖关系边被添加之前变得可用而搁置地等待被用信号通知资源是可用的。因此,直到任务tj的下一次完成执行或者参照图6所述的某个其它度量,任务t可能才尝试获取资源。这种延迟也可以级联到直接或间接依赖于任务t的其它任务。参照图7和8描述的方法涉及确保任务tj的所有权的原子性以及从任务tj到任务t的动态任务依赖性边的添加。

图7示出用于用动态任务依赖性替换任务冲突的实施例方法700。方法700可以在计算设备中以在处理器中执行的软件、以通用硬件或专用硬件来实现,并且可以在任何这样的配置中被实现为任务调度器。在各种实施例中,方法700可以由多个处理器或硬件组件上的多个线程来实现。在各种实施例中,方法700可以被实现为如参照图6所描述的框604的一部分。

在确定框702中,计算设备(例如,在计算设备中执行的任务调度器)可以确定任务tj的执行是否被完成。在各种实施例中,计算设备可以从任务tj或用于执行任务tj的线程和/或处理器接收关于执行被完成的信号。信号可以由计算设备的调度器接收。响应于确定任务tj的执行没有被完成(即,确定框702=“否”),计算设备可以在框704中用从任务tj到任务t的动态任务依赖性边替换任务冲突边,如参照图6在框604中所描述地。响应于确定任务tj的执行被完成(即,确定框702=“是”),在在框704中用从任务tj到任务t的动态任务依赖性边替换任务冲突边之后,计算设备可以在框606中改变与其相关的任务并且继续进行参照图6所描述的方法600。

图8示出了用于用动态任务依赖性替换任务冲突的实施例方法800。方法800可以在计算设备中以在处理器中执行的软件、以通用硬件或专用硬件来实现,并且可以在任何这样的配置中被实现为任务调度器。在各种实施例中,方法800可以由多个处理器或硬件组件上的多个线程来实现。在各种实施例中,方法800可以被实现为如参照图6所描述的框604的一部分。

在框802中,计算设备(例如,在计算设备中执行的任务调度器)可以锁定任务tj。在各种实施例中,计算设备可以通过用对被分配以执行任务tj的线程和/或处理器的中断信号或命令中断任务tj的执行,来锁定任务tj,由此暂停任务tj的执行。在各种实施例中,计算设备可以通过获取对由任务tj为执行所需要的一个或多个资源的独占访问或以其它方式防止任务tj访问由任务tj为执行所需要的一个或多个资源来锁定任务tj,类似地暂停任务tj的执行。

在框804中,计算设备可以用从任务tj到任务t的动态任务依赖性边替换任务冲突边,类似于参照图6描述的方法600的框604中的操作。

在框806中,计算设备可以解锁任务tj。在各种实施例中,计算设备可以通过用对被分配以执行任务tj的线程和/或处理器的恢复信号或命令恢复任务tj的执行,来解锁任务tj,由此继续任务tj的执行。在各种实施例中,计算设备可以通过放弃对由任务tj为执行所需要的一个或多个资源的独占访问或以其它方式允许任务tj访问对由任务tj为执行所需要的一个或多个资源,来解锁任务tj,类似地继续任务tj的执行。然后,计算设备可以在框606中改变与tj相关的任务,并且如参照图6所描述地继续进行方法600。

各种实施例(包括但不限于以上参照图1-8所讨论的实施例)可以在各种各样的计算系统中实现,这些计算系统可以包括适用于在图9中所示的各种实施例的示例移动计算设备。移动计算设备900可以包括耦合到触摸屏控制器904和内部存储器906的处理器902。处理器902可以是被指定用于通用或特定处理任务的一个或多个多核集成电路。内部存储器906可以是易失性或非易失性存储器,并且也可以是安全的和/或加密的存储器、或不安全的和/或未加密的存储器、或其任何组合。可以利用的存储器类型的示例包括但不限于DDR、LPDDR、GDDR、WIDEIO、RAM、SRAM、DRAM、P-RAM、R-RAM、M-RAM、STT-RAM和嵌入式DRAM。触摸屏控制器904和处理器902还可以耦合到触摸屏面板912,诸如电阻式感测触摸屏、电容式感测触摸屏、红外感测触摸屏等。此外,计算设备900的显示器不需要具有触摸屏幕功能。

移动计算设备900可以具有用于发送和接收通信的一个或多个无线电信号收发机908(例如,Peanut、蓝牙、Zigbee、Wi-Fi、RF无线电)和天线910,其彼此耦合和/或耦合到处理器902。收发机908和天线910可以与上述电路一起使用以实现各种无线传输协议栈和接口。移动计算设备900可以包括蜂窝网无线调制解调器芯片916,其使得能够经由蜂窝网进行通信并且耦合到处理器。

移动计算设备900可以包括耦合到处理器902的外围设备连接接口918。外围设备连接接口918可以被单独配置为接受一种类型的连接,或者可以被配置为接受通用或专有的各种类型的物理和通信连接,如USB、FireWire、Thunderbolt或PCIe。外围设备连接接口918还可以耦合到类似配置的外围设备连接端口(未示出)。

移动计算设备900还可以包括用于提供音频输出的扬声器914。移动计算设备900还可以包括由塑料、金属或材料的组合构成的外壳920,用于容纳本文所讨论的全部或部分组件。移动计算设备900可以包括耦合到处理器902的电源922,例如一次性电池或可再充电电池。可再充电电池还可以耦合到外围设备连接端口以从移动计算设备900外部的源接收充电电流。移动计算设备900还可以包括用于接收用户输入的物理按钮924。移动计算设备900还可以包括用于打开和关闭移动计算设备900的电源按钮926。

各种实施例(包括但不限于以上参照图1-8讨论的实施例)可以在各种计算系统中实现,这些计算系统可以包括各种移动计算设备,诸如图10中所示的膝上型计算机1000。许多膝上型计算机包括用作计算机的指示设备的触摸板触摸界面1017,并且因此可以接收与在配备有触摸屏显示器并且如上所述的计算设备上实现的拖动、滚动和轻拂手势类似的拖动、滚动和轻拂手势。膝上型计算机1000通常将包括耦合到易失性存储器1012的处理器1011和诸如闪存的磁盘驱动器1013的大容量非易失性存储器。另外,计算机1000可以具有用于发送和接收电磁辐射的一个或多个天线1008,其可以连接到耦合到处理器1011的蜂窝电话收发机1016和/或无线数据链路。计算机1000还可以包括耦合到处理器1011的软盘驱动器1014和压缩光碟(CD)驱动器1015。在笔记本配置中,计算机外壳包括全部耦合到处理器1011的触摸板1017、键盘1018和显示器1019。计算设备的其它配置可以包括众所周知的耦合到处理器(例如,经由USB输入)的计算机鼠标或轨迹球,其也可以与各种实施例结合使用。

各种实施例(包括但不限于以上参照图1-8讨论的实施例)可以在各种各样的计算系统中实现,这些计算系统可以包括用于压缩服务器缓存存储器中的数据的各种商业可用服务器中的任何一种。示例服务器1100在图11中示出。这样的服务器1100通常包括一个或多个耦合到易失性存储器1102的多核处理器组件1101和大容量非易失性存储器(例如磁盘驱动器1104)。如在图11中所示,多核处理器组件1101可以通过将多核处理器组件1101插入到组件的机架中而被添加到服务器1100。服务器1100还可以包括耦合到处理器1101的软盘驱动器、压缩光碟(CD)或数字通用碟(DVD)碟驱动器1106。服务器1100还可以包括耦合到多核处理器组件1101的网络访问端口1103,用于与网络1105建立网络接口连接,网络1105诸如是耦合到其它广播系统计算机和服务器的局域网、因特网、公共交换电话网和/或蜂窝数据网(例如CDMA、TDMA、GSM、PCS、3G、4G、LTE或任何其它类型的蜂窝数据网)。

用于在可编程处理器上执行以用于执行各种实施例的操作的计算机程序代码或“程序代码”可以用诸如C、C++、C#、Smalltalk、Java、JavaScript、Visual Basic、结构化查询语言(例如,Transact-SQL)、Perl等高级编程语言或以其它各种编程语言来书写。如本申请中所使用的存储在计算机可读存储介质上的程序代码或程序可以指其格式可被处理器理解的机器语言代码(诸如目标代码)。

前述方法描述和过程流程图仅作为说明性示例提供,并不意图要求或暗示各个实施例的操作必须按所给出的顺序执行。如一名本领域技术人员将理解的,前述实施例中的操作顺序可以以任何顺序执行。诸如“此后”、“然后”、“下一”等词语不旨在限制操作的顺序;这些词只是用来指导读者通读对方法的描述。此外,例如使用冠词“一”、“一个”或“该”的任何单数形式的对权利要求要素的引用不应被解释为将该要素限制为单数。

结合各种实施例描述的各种说明性逻辑框、模块、电路和算法操作可以实现为电子硬件、计算机软件或二者的组合。为了清楚地说明硬件和软件的这种可互换性,上面已经就其功能一般性地描述了各种说明性的组件、框、模块、电路和操作。这样的功能是以硬件还是软件来实现取决于特定的应用和对整个系统施加的设计约束。本领域技术人员可以针对每个特定应用以各种方式实施所描述的功能,但是这样的实现决定不应被解释为导致偏离权利要求的范围。

用于实现结合本文公开的实施例描述的各种说明性逻辑、逻辑框、模块和电路的硬件可以用被设计以执行本文所描述的功能的通用处理器、数字信号处理器(DSP)、专用集成电路(ASIC)、现场可编程门阵列(FPGA)或其它可编程逻辑器件、分立门或晶体管逻辑、分立硬件组件或其任何组合。通用处理器可以是微处理器,但是替代地,处理器可以是任何传统的处理器、控制器、微控制器或状态机。处理器还可以实现为计算设备的组合,例如,DSP和微处理器的组合、多个微处理器、一个或多个微处理器与DSP核的结合、或者任何其它这样的配置。或者,一些操作或方法可以由特定于给定功能的电路来执行。

在一个或多个实施例中,被描述的功能可以用硬件、软件、固件或其任何组合来实现。如果以软件实现,则可将功能作为一个或一个以上指令或代码存储在非暂时性计算机可读介质或非暂时性处理器可读介质上。本文公开的方法或算法的操作可以被实施在可以驻留在非暂时性计算机可读或处理器可读存储介质上的处理器可执行软件模块中。非暂时性计算机可读或处理器可读存储介质可以是可以由计算机或处理器访问的任何存储介质。作为示例而非限制,这种非暂时性计算机可读或处理器可读介质可以包括RAM、ROM、EEPROM、闪存、CD-ROM或其它光盘存储、磁盘存储或其它磁存储设备、或者可以用于以指令或数据结构的形式存储期望的程序代码并且可以由计算机访问的任何其它介质。如在本文使用的盘和碟包括压缩碟(CD)、激光碟、光碟、数字多功能碟(DVD)、软盘和蓝光碟,其中盘通常磁性地复制数据,而碟用激光光学地再现数据。以上的组合也包括在非暂时性计算机可读和处理器可读介质的范围内。此外,方法或算法的操作可以作为代码和/或指令的一个或任何组合或集合驻留在可以并入计算机程序产品的非暂时性处理器可读介质和/或计算机可读介质上。

提供所公开的实施例的先前描述以使所属领域的任何技术人员能够制作或使用权利要求。对于本领域技术人员而言,对这些实施例的各种修改将是显而易见的,并且在不脱离权利要求的范围的情况下,在本文中定义的一般原理可以应用于其它实施例。因此,本公开内容并非旨在限于本文中所展示的实施例,而是应符合与以下权利要求及本文中所公开的原理和新颖特征一致的最广泛范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1