在多个处理器之间快速转移工作负载的制作方法

文档序号:16049900发布日期:2018-11-24 11:11阅读:169来源:国知局

嵌入式设备通常用相对便宜的硬件(例如,有限容量的电源、需要较少能量的较慢组件,等等)来构建。使用较便宜的硬件允许制造商经济地大规模生产这些嵌入式设备,但是经济上的节省是以降级的设备性能为代价的。例如,在多处理器系统中(且尤其是像树莓派2(raspberrypi2)这样的被用于嵌入式设备的低级别多处理器平台),从中断仅仅在主中央处理单元(cpu)上被递送,而非跨多个可用cpu被负载均衡的角度来讲,体系结构可以是非对称的。这可能导致在多处理器系统中的主cpu的过度利用和(诸)其他cpu的未充分利用。此外,许多嵌入式设备利用相对慢的直接存储器访问(dma)控制器。通常,程序员通过以下来变通地解决该约束:设计嵌入式软件以使用cpu代替较慢的dma控制器来执行存储器转移操作,因为存储器转移操作可利用cpu来被更快速地执行。这可能给主cpu带来更多的工作负载,因为主cpu被完全地占用达存储器转移操作的历时并且不可用于接收中断。

当前操作系统可通过在多处理器系统中将任务调度到(或将任务转移至)替代cpu来缓解这些问题,这减轻了主cpu上的一些负担。例如,设备驱动器和/或操作系统(os)组件可通过以下来在各cpu之间转移任务:利用在第一cpu上运行的“生产者”线程创建任务,并且利用在第二cpu上运行的“消费者”线程执行该任务。然而,从生产者线程发信号通知消费者线程执行任务的时间开始,到消费者线程“唤醒”并且实际上准备好执行任务的时间为止存在显著的延迟。该延迟可由唤醒消费者线程和使消费者线程准备好执行任务中的固有调度等待时间导致。例如,消费者线程要花费时间来从系统存储器加载堆栈和多个页面,以便使其自己准备好执行任务。执行这些“加载”操作所花费的时间可致使可辨识的性能降级。许多嵌入式设备(诸如执行时间严格的(time-critical)操作的控制设备(例如,机械臂))可以从更高性能os中受益。

概述

本文中所描述的是用于一旦对任务的需要被主cpu检测到就预调度替代cpu的技术和系统。预调度替代cpu可包括在向将被用于执行任务的消费者线程提供相关信息之前发送事件——以唤醒要在替代cpu上运行的消费者线程。以这种方式预调度替代cpu最小化或消除了在对任务的需要在生产者线程上下文中出现(被检测到)的时刻与该任务在消费者线程上下文中被执行的时刻之间的延迟,该消费者线程运行在替代cpu上。在各cpu之间转移任务方面的延迟的降低或消除对于低端嵌入式设备而言是特别地有用的。

在一些配置中,消费者线程可停滞在非优先抢占的“自旋锁(spinlock)”中。自旋锁是一种同步原语,其致使尝试获取它的线程在循环中等待(“自旋”),同时重复地检查该自旋锁是否被释放(或可用于被获取)。由于线程保持活跃但没有正在执行有用的任务,因此对这样的自旋锁的使用是忙等待(busywait)状态。相应地,一种用于将任务从第一cpu转移到第二cpu的过程包括:利用在第一cpu上运行的生产者线程来检测外部中断,获取自旋锁,以及响应于获取自旋锁来将事件发送到要在第二cpu上运行的消费者线程。在由消费者线程接收到该事件之际,消费者线程获取自旋锁,该自旋锁使消费者线程“停滞”在循环中,直到该自旋锁被生产者线程释放。当消费者线程响应于从生产者线程接收到该事件而正“唤醒”时,生产者线程创建任务、发布该任务并且释放自旋锁,由此致使消费者线程退出循环、检索该任务并且执行该任务。

os性能中的改进可通过以下来被实现:在对执行任务的需要被检测到之后尽可能早地“预调度”消费者线程,并且此后使消费者线程停滞在非优先抢占的自旋锁中直到生产者线程发布供消费的任务。换言之,对消费者线程的预调度致使消费者线程的“唤醒”操作与由生产者线程在创建任务和发布任务以供消费时所执行的操作并行地发生。该预调度技术使得由自然调度等待时间造成的延迟最小化。虽然预调度在消费者线程停滞在循环中以获取自旋锁的同时可以在替代cpu上创建轻微的附加负载,但是各cpu之间的改进的转移速度胜过了替代cpu上所经历的轻微的附加负载。

提供本概述是为了以简化的形式介绍将在以下详细描述中进一步描述的概念选集。本概述并不旨在标识所要求保护主题的关键特征或必要特征,亦非旨在用于限制所要求保护主题的范围。

附图简述

详细描述参考附图进行描述。在附图中,附图标记最左边的(诸)数位标识该附图标记首次出现的附图。不同附图中的相同的附图标记指示类似或相同的项。

图1解说了用于实现本文中所描述的技术的示例多处理器计算设备。

图2是用于预调度替代cpu的说明性过程的流程图。

详细描述

本公开的配置尤其涉及用于一旦对任务的需要被主cpu检测到就预调度替代cpu的技术和系统。通过对本文中所公开的技术的使用,与将任务调度到替代cpu上的当前办法相比,一个或多个设备可被配置成以改进的速度将任务调度到替代cpu上。例如,任务可被调度到(或被转移至)替代cpu上的速度可通过以下来增加:一旦对任务的需要被主cpu检测到就预调度替代cpu。增加工作负载可在多个cpu之间被转移的速度可改进多处理器设备的性能。

在一些配置中,一个或多个设备可被配置成在功率资源、存储器资源、通信带宽资源、处理资源、和/或其他资源方面节省资源,同时提供用于预调度替代cpu的机制。除了本文中提到的那些技术效果之外的技术效果也可通过本文中所公开的技术的实施来实现。本文中所描述的技术和系统可以以多种方式来实现。以下参考下面的附图提供各示例实现。

图1解说了用于实现本文中所描述的技术的示例多处理器计算设备100(在本文中被称为“计算设备100”)。例如,计算设备100可表示一个或多个计算机器,包括但不限于,(诸)嵌入式设备、(诸)服务器、(诸)个人计算机、或(诸)任何其他合适的计算设备,不论该计算设备是移动的还是静止的。在一说明性示例中,计算设备100表示嵌入式设备。嵌入式设备可具有各种形式,诸如但不限于,可穿戴计算机、控制设备(例如,机械臂)、家用电器(例如,厨房电器),等等。图1中示出的计算设备100仅仅是可被用来实现本文中所描述的技术的一个示例多处理器设备。由此,本文中所描述的技术不限于使用图1的计算设备100的执行。

计算设备100可包括多个处理器102(1)、102(2)、……、102(n)(统称为102)。取决于计算设备100的实现细节,个体处理器102可表示任何合适类型的执行单元,诸如中央处理单元(cpu)、核、和/或节点。例如,任何个体处理器102可表示单个cpu、具有被配置成执行分开的线程的多个处理器或核的节点、或任何其他合适的处理器布置。在一些配置中,处理器102中的各个个体处理器可各自具有用作处理器102和共享存储器104(例如,主存储器、或系统存储器)之间的中介的相关联的本地高速缓冲存储器。

共享存储器104顾名思义可以在各处理器102之间被共享。相应地,总线106可将处理器102连接到共享存储器104。在一些实施例中,总线106可表示用来将处理器102连接到共享存储器104、或共享存储器104的各部分的互连网络。取决于确切的配置,共享存储器104可以是易失性的(例如,随机存取存储器(ram))、非易失性的(例如,只读存储器(rom)、闪存存储器等)、或这两者的某种组合。计算设备100可进一步包括输入/输出(i/o)系统108,该输入/输出系统包括i/o设备和介质。在一些配置中,i/o系统108可包括嵌入式设备、和/或外围设备。这些设备在本文中通常被称为计算设备100的“硬件”。

计算设备100还可包括附加的数据存储设备(可移动和/或不可移动),诸如举例而言,磁盘、光盘、或磁带,这些都是计算机存储介质的示例。共享存储器104是计算机存储介质的另一示例。计算机存储介质可包括以用于存储诸如计算机可读指令、数据结构、程序模块、或其他数据等信息的任何方法或技术实现的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括但不限于,ram、rom、电可擦除可编程只读存储器(eeprom)、闪存存储器或其他存储器技术、压缩盘只读存储器(cd-rom)、数字多功能盘(dvd)、或其他光学存储、磁带盒、磁带、磁盘存储或其他磁存储设备、或可被用来储存可由计算设备100访问的所需信息、对象和/或数据结构的任何其他介质。虽然对本文中所包含的计算机存储介质的描述引用了诸如固态驱动器、硬盘或cd-rom驱动器之类的大容量存储设备,但是本领域的技术人员应当领会,计算机可读介质可以是可由处理器102访问的任何可用的计算机存储介质或通信介质。通信介质包括诸如载波或其他传输机制等已调制数据信号中的计算机可读指令、数据结构、程序模块或其他数据,且包含任何传递介质。术语“已调制数据信号”指的是使其一个或多个特性以如在信号中编码信息的方式来被更改或设定的信号。作为示例而非限制,通信介质包括有线介质(诸如有线网络或直接连线连接),以及无线介质(诸如声学、射频(rf)、红外和其他无线介质)。上述的任意组合也应被包括在计算机可读介质的范围内。

作为示例而非限制,计算机存储介质可包括以用于存储诸如计算机可读指令、数据结构、程序模块或其他数据等信息的任何方法或技术实现的易失性和非易失性、可移动和不可移动介质。例如,计算机存储介质包括但不限于,ram、rom、eprom、eeprom、闪存存储器或其他固态存储器技术、cd-rom、数字多功能盘(“dvd”)、hd-dvd、蓝光(blu-ray)或其他光学存储、磁带盒、磁带、磁盘存储或其他磁存储设备、或可被用来储存所需信息且可由处理器102及其他组件访问的任何其他介质。出于权利要求书的目的,短语“计算机存储介质”、“计算机可读存储介质”及其变体不包括波、信号、和/或其他瞬态和/或无形通信介质本身。

在一些配置中,共享存储器104可存储在被处理器102中的一者或多者执行时实现本文中所描述的过程中的一些或所有过程的编程指令、数据结构、程序模块和其他数据。例如,计算设备100可包括(例如,在共享存储器104内)操作系统(os)110,该操作系统(os)110尤其被配置成提供编程指令(或代码)以供驱动器或其他os组件执行,以便实现本文中所描述的“预调度”技术。一般而言,os110可包括基于组件的框架,该基于组件的框架支持组件(包括属性和事件)、对象、继承、多态性、反射,并且提供面向对象的基于组件的应用编程接口(api)。操作系统110可以是基于windows的、基于unix的、基于linux的、或任何其他合适的操作系统类型。

应当领会,本文中所描述的“预调度”技术可通过代码在内核操作模式中的执行来被实现。内核模式指的是计算机的一种操作模式,在该模式中当前正被执行的软件程序被许可来执行处理器102的完整指令集、访问计算机存储器的所有部分以及直接与被附连到计算机(诸如计算设备100)的硬件设备交互。内核模式通常局限于形成计算设备100的os110的一部分的软件模块。内核模式进程的失败可导致os110崩溃和/或破坏用于其他进程的存储器。然而,还应当领会,本文中所描述的“预调度”技术不限于在内核模式中的实现,因为用户模式实现还可受益于如本文中所描述的对替代处理器102的预调度。

图1解说了第一处理器102(1)被配置成接收中断112。这可能归因于第一处理器102(1)被以特定方式布线,使得中断112在处理器102(1)上被递送。在一些配置中,引导代码可指令中断控制器将中断112递送到第一处理器102(1)。各个个体中断112可响应于各种类型的条件而发生,所述各种类型的条件诸如包括以下但不限于以下的条件:当计时器达到预定义值或时间时、当计算设备100上的按钮被按压时、或者当数据要被移动/被复制到另一存储器位置时,等等。当第一处理器102(1)具有足够的能力来处置中断112时(即,第一处理器102(1)没有过载),第一处理器102(1)可利用在第一处理器102(1)上运行的一个或多个线程114(1)来执行对应于所接收的中断112的任务116的执行。例如,(诸)线程114(1)可以在第一处理器102(1)上运行以响应于被递送到处理器102(1)的中断112来创建任务116并执行该任务116。任务116可包括任何合适的任务,所述任何合适的任务诸如包括以下但不限于以下的任务:移动或复制数据、执行计算、发信号给硬件、读取对象(例如,复制或打印对象)、修改对象,等等。

当中断112的数量或频率增加和/或任务116变得相对冗长(即,大量的字节)时,第一处理器102(1)可能变得过载。在该场景中,驱动器和/或内核模式os组件可执行os110中的代码以将一个或多个任务116调度到替代处理器102上,诸如第二处理器102(2)或第n处理器102(n)。在多个处理器102之间调度(或转移)任务116可以根据在对任务116的需要出现(被检测到)时创建该任务116的“生产者”线程以及执行该任务116的“消费者”线程来被制定。消费者线程在本文中也可被称为“工作者”线程。

当中断112被第一处理器102(1)检测到时,os110(例如,经由驱动器或其他os组件)可以“唤醒”或以其他方式调用在第一处理器102(1)上运行的生产者线程114(1)。生产者线程114(1)可接着获取自旋锁118。自旋锁118是一种可被os110采用以避免竞争条件的同步原语类型。竞争条件在多个线程114同时访问和操纵相同的对象或数据结构时发生,这可能导致有缺陷的数据。一般而言,同步原语可实施防止某线程114在另一个线程114完成访问对象之前独占地访问该对象的策略。该策略的实施通过管理线程114的并发交互来同步线程114对对象的访问,由此避免竞争条件。

自旋锁118的数据结构可包括自旋锁参数120(或自旋锁变量120),其可被设置为指示自旋锁118已被获取或释放的多个不同值(或在所述多个不同值之间切换)。在一说明性示例中,生产者线程114(1)可通过例如将自旋锁参数120(例如,通过设置对应数据字段中的某位)设置为特定值(例如,值为“1”的值)来执行对自旋锁118的“独占”获取,该特定值用于通知其他线程114在自旋锁118可被获取之前它们必须等待直到自旋锁118被释放。

在生产者线程114(1)获取自旋锁118之后,生产者线程114(1)可将事件发送到要在第二处理器102(2)上运行的消费者线程114(2),以便“唤醒”该消费者线程114(2)。以这种方式,一旦对任务的需要被第一处理器102(1)检测到,表示“替代”处理器/cpu102的第二处理器102(2)就可被“预调度”。

在将该事件发送到消费者线程114(2)之后,生产者线程114(1)继续进行以创建对应于检测到的中断112的任务116。例如,任务116可包括存储器转移操作,其中数据要从一个存储器位置被复制/移动到另一存储器位置。生产者线程114(1)可通过将任务116储存在共享存储器104中来发布供消费的任务116。“发布”任务116可因此包括将任务116储存在共享存储器104中,使得任务116可由第一处理器102(1)经由生产者线程114(1)且可由第二处理器102(2)经由消费者线程114(2)来访问。在一些配置中,发布任务116包括将任务116放置在要由消费者线程114消费的任务116的队列中。

响应于发布任务116,生产者线程114(1)可通过将自旋锁参数120设置(或切换)回特定值(例如,值为“0”的值)来释放自旋锁118,该特定值用于通知其他线程114该自旋锁118已被释放。

与此同时,一旦消费者线程114(2)从生产者线程114(1)接收到该事件,os110就“唤醒”该消费者线程114(2)。唤醒消费者线程114(2)可涉及要花费一些时间来执行的各种“加载”操作(诸如加载堆栈、加载页面等),从而使消费者线程114(2)准备好执行正由生产者线程114(1)创建的任务116。值得注意的是,“唤醒”消费者线程114(2)的这些“加载”操作是与由生产者线程114(1)执行以创建任务116并发布任务116以供消费的操作并行地执行的,由此最小化或消除归因于将任务转移到第二处理器102(2)时所涉及的固有调度等待时间而造成的任何延迟。

一旦消费者线程114(2)“唤醒”并准备好执行任务116,消费者线程114(2)就获取自旋锁118。在一个场景中,生产者线程114(1)将在消费者线程114(2)获取自旋锁118的时候已经释放自旋锁118,在该情形中,消费者线程114(2)检查自旋锁参数120、看到它被设置为指示自旋锁118被释放的特定值(例如,“0”),并且通过将自旋锁参数120设置/切换到向其他线程114指示自旋锁118被获取的特定值(例如,“1”)来获取自旋锁118。

在另一场景中,生产者线程114(1)在消费者线程114(2)准备好执行任务116并获取自旋锁118时仍将执行操作来创建任务116和/或发布任务116以供消费。在该场景中,消费者线程114(2)在获取自旋锁118时检查自旋锁参数120、看到它被设置为指示自旋锁118尚未被释放的特定值(例如,“1”),并且通过迭代地检查自旋锁参数120的值而迭代地“自旋”(或“旋转”或“循环”),直到该值被切换回指示自旋锁118被释放的特定值(例如,“0”)。在确定自旋锁118被释放之际,消费者线程114(2)退出“循环”并且通过将自旋锁参数120设置/切换到向其他线程114指示自旋锁118被获取的特定值(例如,“1”)来获取自旋锁118。

在任一场景中,在获取自旋锁118之后,消费者线程114(2)可检索现在已被生产者线程114(1)发布的任务116,并且可代表生产者线程114(1)来执行任务116以减轻第一处理器102(1)上的至少一些工作负载负担。os110性能中的改进可通过以下来被实现:以这种方式(即,在对执行任务116的需要在第一处理器102(1)处被检测到之后尽可能早地)“预调度”消费者线程114(2),并且此后使消费者线程114(2)停滞在非优先抢占的自旋锁118中,直到生产者线程114(1)发布任务116以供消费并且释放自旋锁118。下面呈现了用于如本文中所描述的预调度消费者线程114(2)的示例伪代码:

应当领会,虽然自旋锁118在图1中被示为示例同步原语,但是任何其他合适类型的同步原语可被用来代替自旋锁118,诸如等待锁(waitlock)、运行终了(rundown)参考、互斥体,等等。例如,可以将等待锁参数/变量设置为特定值(例如,“0”),使得消费者线程114(2)被放置在“等待”线程114的队列中。当等待锁参数被设置/切换到另一特定值(例如,“1”)时,os110可以向针对等待锁参数注册的消费者线程114(2)发出回调。与使用自旋锁118相比,使用等待锁不向第二处理器102(2)添加任何附加的工作负载,但是等待线程114的队列消耗少量的存储器。此外,与消费者线程114(2)退出自旋锁118循环所花费的时间相比,可能要花费更多时间来从等待锁上下文中“唤醒”消费者线程114(2)。

在一些配置中,os110可基于对除第一处理器102(1)之外的多个可用处理器102上的可用能力的评估来在多个可用处理器102当中选择第二处理器102(2)。例如,os110可确定第二处理器102(2)和第n处理器102(n)两者都是空闲的(即,它们具有能力),确定第二处理器102(2)具有比第n处理器102(n)更大的能力,并且选择第二处理器102(2)以用于执行消费者线程114(2)。

在一些配置中,os110可响应于在第一处理器102(1)处检测到的中断112来提供要在第一处理器102(1)上运行的多个生产者线程114(1)。在该情形中,生产者线程池114(1)中的第一生产者线程114可响应于检测到中断112来获取自旋锁118,并且在获取自旋锁118之后,该第一生产者线程114可发送带有与执行对应于所接收的中断112的多个任务116所需的多个消费者线程114相对应的计数的信号标(semaphore)。例如,如果信号标被设置为count(计数)=3,则os110可唤醒要在另一处理器(诸如第二处理器102(2))上运行的第一消费者线程114,并将信号标计数递减到count=2,并接着唤醒要在另一处理器(诸如第n处理器102(n))上运行的第二消费者线程114,并将信号标计数递减到count=1,并接着唤醒要在另一处理器(诸如第二处理器102(2))上运行的第三消费者线程114,并将信号标计数递减到count=0。消费者线程114可在自旋锁118被第一生产者线程114释放之际获取该自旋锁118,使得消费者线程114的池可以在一个或多个替代处理器102(即,除第一处理器102(1)之外的处理器102)上执行相应的经转移的任务116。因此,使用各池线程114和响应于获取自旋锁118而被发送的信号标可以拓宽消费者线程114用来转移多个任务116的“管道”,以供(诸)替代处理器102上的执行。在该场景中,消费者线程114的池可以以共享方式获取自旋锁118,使得消费者线程114的池可同时保持自旋锁118。当自旋锁118被以共享方式获取时,尝试获得对自旋锁118的独占获取的其他线程114将被阻止这么做。

图2是用于预调度替代cpu的说明性过程200的流程图。过程200被解说为逻辑流程图中的各框的集合,其表示可用硬件、软件或其组合实现的操作的序列。在软件的上下文中,各框表示当由一个或多个处理器执行时执行既定操作的计算机可执行指令。一般而言,计算机可执行指令包括执行特定功能或实现特定抽象数据类型的例程、程序、对象、组件、数据结构,等等。描述操作的次序并不旨在被解释为限制,并且任何数量的所描述的框可以按任何次序和/或并行地组合以实现过程200。

出于讨论目的,参考图1的多处理器计算设备100描述过程200。此外,过程200解说了将任务116从第一处理器102(1)转移到第二处理器102(2)的场景,这样过程200就被分别分解成用于第一处理器102(1)和第二处理器102(2)的子过程200a和200b。

初始地,在子过程200b的202处,第二处理器102(2)可通过在“等待”状态中就坐/闲置来等待接收事件(例如,事件“x”)。在一些配置中,第二处理器102(2)执行“等待事件‘x’”指令以保持在等待状态中,直到事件“x”在第二处理器102(2)处被接收到。202处的等待可以在任何外部中断112在第一处理器102(1)上被递送之前发生。在202处的等待可以在示例伪代码中被表示为:waitfor(sharedevent);//[c1]。

在子过程200a的204处,一个或多个中断112被检测。例如,如果os110确定按钮被按压、计时器达到阈值、或一些其他外部条件被满足(例如,数据准备好要在各存储器位置之间移动),则中断112在第一处理器102(1)上被递送,其“唤醒”要在第一处理器102(1)上运行的生产者线程114(1)。因此,如果生产者线程114(1)响应于在第一处理器102(1)上正被递送的中断112而被调用,则可以说生产者线程114(1)已“检测到”中断112。步骤204是对任务116的需要出现时的点,并且其可以在伪代码中被表示为:task=createtask();//[p1]needforoperationarises。

在一些配置中,os110可确定对应于中断112的任务116是否要被转移(或被卸载)到另一处理器,诸如第二处理器102(2)。该确定可涉及评估第一处理器102(1)的当前工作负载以及确定该当前工作负载是否高于阈值水平。如果当前工作负载低于阈值水平,则对应于在204处检测到的中断112的任务116可以由在第一处理器102(1)上运行的线程114执行,因为第一处理器102(1)可具有执行任务116的能力。在另一方面,如果当前工作负载处于或高于阈值水平,则os110可执行过程200的剩余部分以将任务116转移到替代处理器102(2)。

在206处,在第一处理器102(1)上运行的生产者线程114(1)可通过将自旋锁参数120设置为特定值(例如,“1”)来获取自旋锁118,以向其他线程114指示它们必须等待直到自旋锁118被释放以便获得自旋锁118。在一些配置中,206处的对自旋锁118的获取是“独占”获取的形式,使得生产者线程114(1)是自旋锁118的唯一所有者。应当领会,自旋锁参数120可在默认情况下被设置为“释放”值,使得其可由206处的生产者线程114(1)获取。在206处获取自旋锁118使工作负载转移过程中所涉及的各线程114同步,并且其可以在伪代码中被表示为:spinlock=1;//[p2]acquirespinlock。

在208处,响应于在206处获取自旋锁118,生产者线程114(1)可发送事件(例如,事件“x”)。在210处,事件(例如,事件“x”)由在第二处理器102(2)上运行的消费者线程114(2)接收。相应地,在208处被发送且在210处被接收的事件可有效地“唤醒”要在第二处理器102(2)上运行的消费者线程114(2)。在208处,在第一处理器102(1)上运行的生产者线程114(1)知道将存在要执行的任务116,但是它可能不知道要被创建的任务116的细节;生产者线程114(1)可能只知道消费者线程114(2)应该被“唤醒”以预调度第二处理器102(2),使得该要被创建的任务116一旦被发布用于消费,该任务116就可以被消费者线程114(2)执行。208处的对事件(例如,事件“x”)进行发送可以在伪代码中被表示为:signalevent(sharedevent);//[p3]signaleventforconsumertostartexecution。

在210处的接收到事件(例如,事件“x”)之际,在第二处理器102(2)上运行的消费者线程114(2)通过执行一个或多个“加载”操作而唤醒。这些加载操作要花费时间来执行,这在图2中被示为起始于210处并且在消费者线程114(2)醒来并准备好获取自旋锁118时的212处结束的时间段t。该时间段t可归因于用来执行“加载”操作(比如加载堆栈和加载页面以使消费者线程114(2)准备好执行任务116)的固有调度等待时间。

在子过程200a中——并且与在时间段t期间在子过程200b中所执行的操作并行地,当消费者线程114(2)正唤醒时——在214处生产者线程114(1)可创建任务116。214处所创建的任务116可对应于检测到的中断112并且可表示任何合适的任务,如本文中所描述和/或如本领域普通技术人员已知的。例如,任务116可包括将数据从一个存储器位置移动/复制到另一存储器位置的存储器转移操作。在一些配置中,生产者线程114(1)还可分配其中消费者线程114(2)要将数据复制/移动到的存储器、确定数据要被移动到的地址、执行数学运算,等等。

在216处,生产者线程114(1)可发布任务116以供消费。如本文中所描述,216处的对任务116进行发布可包括将任务116储存在共享存储器104中,由此使得任务116可由在第二处理器102(2)上运行的消费者线程114(2)访问。216处的对任务116进行发布可以在伪代码中被表示为:sharedtaskdescriptor=createtaskdescriptor(task);//[p4]filldescriptorforconsumer。

在218处,生产者线程114(1)可通过将自旋锁参数120设置/切换到向其他线程114指示自旋锁118被释放并且可用于获取的值来释放自旋锁118。在一些配置中,218处的对自旋锁118进行释放可响应于216处的对任务116进行发布而发生。218处的对自旋锁118进行释放可以在伪代码中被表示为:spinlock=0;//[p5]releasespinlock。

同时,在子过程200b中,在时间段t已流逝且消费者线程114(2)准备好执行214处所创建的任务116之后,在212处消费者线程114(2)获取自旋锁118。212处的对自旋锁进行获取可涉及在判定框220处检查自旋锁参数120的值,并且可以在伪代码中被表示为:while(spinlock==1){};//acquirespinlock[c2]。如果自旋锁参数120的值指示自旋锁118尚未被释放(例如,spinlock(自旋锁)=1),则子过程200b通过遵循来自220的“否”路线迭代回212。以这种方式迭代有效地使消费者线程114停滞在“自旋”或“旋转”状态,直到自旋锁118被释放。一旦自旋锁118在子过程200a的218处被释放,则在218处的对自旋锁118的释放之后发生的220处的确定遵循“是”路线,并且消费者线程114(2)退出循环以获取自旋锁118、在222处从共享存储器104检索任务116,并且在224处执行该任务116。步骤222和224处的对任务116进行检索和执行可以在伪代码中被表示为:executetask(shareddescriptor);//[c3]。

过程200可通过以下来被扩展以供与线程114的池一起使用并且用于并行的多个任务116的执行:在运行在一个或多个替代处理器102(即,除第一处理器102(1)之外的在其上递送(诸)中断112的处理器102)上的多个消费者线程114上执行任务116。例如,在204处多个中断112可被检测,在该情形中,在206处自旋锁118被获取,并且在208处信号标被发送,这导致在210处消费者线程114的池被唤醒。在第一处理器102(1)上运行的生产者线程114的池可在214处创建对应于在204处检测到的多个中断112的一组任务116,并且可在216处发布该组任务116。与此同时,消费者线程114的池可通过在“否”路径上从220迭代到212而停滞,直到在218处自旋锁118被释放,并接着消费者线程114的池可以在222处检索它们各自的任务116并且在224处执行各自的任务116。

本文中所描述的环境和各个个体元件当然可包括许多其他逻辑、程序以及物理组件,其中显示在附图中的那些仅仅是与本文中的讨论相关的示例。

可使用其他架构来实现所描述的功能性,这些其他结构也落在本公开的范围内。此外,尽管以上为了讨论的目的描述了具体的职责分布,但可取决于不同情况来以不同方式分布和划分各种功能和职责。

示例一:一种方法,包括:由在第一处理器上运行的生产者线程检测外部中断;由生产者线程获取自旋锁;响应于获取自旋锁,由生产者线程发送事件;由生产者线程创建任务;由生产者线程发布所创建的任务;响应于发布所创建的任务,由生产者线程释放自旋锁;响应于释放自旋锁,由在第二处理器上运行的消费者线程检索所发布的任务;以及由消费者线程执行检索到的任务。

示例二:如示例一的方法,进一步包括:在检索任务之前,由消费者线程接收事件;以及响应于接收到该事件,由消费者线程获取自旋锁。

示例三:前述示例中的单独或组合的任何示例的方法,其中消费者线程在生产者线程释放自旋锁之前获取自旋锁,并且其中由消费者线程获取自旋锁包括由消费者线程迭代地检查与自旋锁相关联的自旋锁参数的值。

示例四:前述示例中的单独或组合的任何示例的方法,其中消费者线程在生产者线程释放自旋锁之后获取自旋锁。

示例五:前述示例中的单独或组合的任何示例的方法,其中:消费者线程是消费者线程池中的多个消费者线程之一;生产者线程是生产者线程池中的多个生产者线程之一;任务是多个任务之一;并且事件包括具有等于消费者线程池中的多个消费者线程的数量的计数的信号标。

示例六:前述示例中的单独或组合的任何示例的方法,其中发布任务包括将被用于执行任务的信息储存在可由第二处理器经由消费者线程访问的共享存储器中。

示例七:前述示例中的单独或组合的任何示例的方法,进一步包括由消费者线程在生产者线程创建任务并发布任务的同时执行加载操作,其中该加载操作:使消费者线程准备好执行任务;并且至少部分地基于消费者线程对事件的接收来被执行。

示例八:一种系统,包括:多个处理器(例如,中央处理单元(cpu)、核、和/或节点,等等),其包括第一处理器和第二处理器;储存计算机可执行指令的存储器(例如,ram、rom、eeprom、闪存存储器,等等),该计算机可执行指令在由多个处理器中的至少一个处理器执行时致使该至少一个处理器执行包括以下的操作:由第二处理器执行致使第二处理器等待事件的指令;至少部分地基于由第一处理器检测到的中断在第一处理器上执行生产者线程;由生产者线程将与同步原语相关联的参数设置为第一值;响应于将参数设置为第一值,由生产者线程将事件发送到第二处理器;至少部分地基于第二处理器接收到事件而在第二处理器上执行消费者线程;由消费者线程在生产者线程创建任务的同时执行加载操作;由生产者线程发布任务以供消费;由生产者线程将参数设置为第二值;响应于将参数设置为第二值,由消费者线程检索任务;以及由消费者线程执行任务。

示例九:如示例八的系统,其中同步原语包括自旋锁。

示例十:前述示例中的单独或组合的任何示例的系统,该操作进一步包括:由消费者线程迭代地检查与自旋锁相关联的参数,以确定参数是否已被设置为第二值;以及响应于生产者线程将参数设置为第二值,由消费者线程获取自旋锁。

示例十一:前述示例中的单独或组合的任何示例的系统,其中:消费者线程是消费者线程池中的多个消费者线程之一;生产者线程是生产者线程池中的多个生产者线程之一;任务是多个任务之一;并且事件包括具有等于消费者线程池中的多个消费者线程的数量的计数的信号标。

示例十二:前述示例中的单独或组合的任何示例的系统,其中同步原语包括自旋锁,该操作进一步包括,响应于生产者线程将参数设置为第二值,由消费者线程池以共享方式获取自旋锁。

示例十三:前述示例中的单独或组合的任何示例的系统,其中:多个处理器包括第三处理器;多个消费者线程的第一子集在第二处理器上执行;并且多个消费者线程的第二子集在第三处理器上执行。

示例十四:储存计算机可执行指令的一个或多个计算机可读存储介质(例如,ram、rom、eeprom、闪存存储器,等等),该计算机可执行指令在由处理器(例如,中央处理单元(cpu)、核、和/或节点,等等)执行时致使该处理器执行包括以下的操作:由在第一处理器上运行的生产者线程检测外部中断;由生产者线程获取自旋锁;响应于获取自旋锁,由生产者线程发送事件;由生产者线程创建任务;由生产者线程发布所创建的任务;响应于发布所创建的任务,由生产者线程释放自旋锁;响应于释放自旋锁,由在第二处理器上运行的消费者线程检索所发布的任务;以及由消费者线程执行检索到的任务。

示例十五:如示例十四的一个或多个计算机可读存储介质,该操作进一步包括:在检索任务之前,由消费者线程接收事件;并且响应于接收到该事件,由消费者线程获取自旋锁。

示例十六:前述示例中的单独或组合的任何示例的一个或多个计算机可读存储介质,其中消费者线程在生产者线程释放自旋锁之前获取自旋锁,并且其中由消费者线程获取自旋锁包括由消费者线程迭代地检查与自旋锁相关联的自旋锁参数的值。

示例十七:前述示例中的单独或组合的任何示例的一个或多个计算机可读存储介质,其中消费者线程在生产者线程释放自旋锁之后获取自旋锁。

示例十八:前述示例中的单独或组合的任何示例的一个或多个计算机可读存储介质,其中:消费者线程是消费者线程池中的多个消费者线程之一;生产者线程是生产者线程池中的多个生产者线程之一;任务是多个任务之一;并且事件包括具有等于消费者线程池中的多个消费者线程的数量的计数的信号标。

示例十九:前述示例中的单独或组合的任何示例的一个或多个计算机可读存储介质,其中发布任务包括将被用于执行任务的信息储存在可由第二处理器经由消费者线程访问的共享存储器中。

示例二十:前述示例中的单独或组合的任何示例的一个或多个计算机可读存储介质,该操作进一步包括由消费者线程在生产者线程创建任务并发布任务的同时执行加载操作,其中该加载操作:使消费者线程准备好执行任务;并且至少部分地基于消费者线程对事件的接收来被执行。

示例二十一:一种方法,包括:由在第一处理器上运行的生产者线程检测外部中断;由生产者线程将与自旋锁相关联的参数设置为第一值;响应于将参数设置为第一值,由生产者线程发送事件;由在第二处理器上运行的消费者线程在生产者线程创建任务的同时执行加载操作;由生产者线程发布所创建的任务;响应于发布所创建的任务,由生产者线程将参数设置为第二值;由消费者线程将参数设置为第一值;由消费者线程检索所发布的任务;以及由消费者线程执行检索到的任务。

示例二十二:如示例二十一的方法,其中消费者线程响应于从生产者线程接收事件来执行加载操作。

示例二十三:前述示例中的单独或组合的任何示例的方法,进一步包括:通过消费者线程并且在生产者线程将参数设置为第二值之前迭代地检查参数以确定参数是否已被设置为第二值,其中响应于确定参数已被设置为第二值消费者线程将参数设置为第一值。

示例二十四:前述示例中的单独或组合的任何示例的方法,其中:消费者线程是消费者线程池中的多个消费者线程之一;生产者线程是生产者线程池中的多个生产者线程之一;任务是多个任务之一;并且事件包括具有等于消费者线程池中的多个消费者线程的数量的计数的信号标。

示例二十五:前述示例中的单独或组合的任何示例的方法,其中:多个消费者线程的第一子集在第二处理器上执行;并且多个消费者线程的第二子集在第三处理器上执行。

示例二十六:前述示例中的单独或组合的任何示例的方法,其中发布任务包括将被用于执行任务的信息储存在可由第二处理器经由消费者线程访问的共享存储器中。

示例二十七:前述示例中的单独或组合的任何示例的方法,其中:将参数设置为第一值获取自旋锁;而将参数设置为第二值释放自旋锁。

示例二十八:一种系统,包括:用于执行计算机可执行指令的多个装置(例如,中央处理单元(cpu)、核、和/或节点,等等),该多个用于执行的装置包括用于执行的第一装置和用于执行的第二装置;用于储存计算机可执行指令的装置(例如,ram、rom、eeprom、闪存,等等),该计算机可执行指令在由用于执行该多个用于执行的装置的至少一个装置执行时,致使该至少一个用于执行的装置执行包括以下的操作:由该用于执行的第二装置执行致使该用于执行的第二装置等待事件的指令;至少部分地基于由该用于执行的第一装置检测到的中断在该用于执行的第一装置上执行生产者线程;由生产者线程将与同步原语相关联的参数设置为第一值;响应于将参数设置为第一值,由生产者线程将事件发送到该用于执行的第二装置;至少部分地基于该用于执行的第二装置接收到事件而在该用于执行的第二装置上执行消费者线程;由消费者线程在生产者线程创建任务的同时执行加载操作;由生产者线程发布任务以供消费;由生产者线程将参数设置为第二值;响应于将参数设置为第二值,由消费者线程检索任务;以及由消费者线程执行任务。

结语

总而言之,虽然已用对结构特征和/或方法动作专用的语言描述了各种配置,但应当理解,所附权利要求书中定义的主题不必限于所描述的具体特征或动作。相反,这些具体特征和动作是作为实现所要求保护的主题内容的示例形式而公开的。

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