一种感知微体系结构信息的操作系统线程调度方法

文档序号:6353906阅读:154来源:国知局
专利名称:一种感知微体系结构信息的操作系统线程调度方法
技术领域
本发明主要涉及操作系统中的线程调度设计领域,特别是针对共享Cache片上多 核处理器(CMP)结点内以及由多片组成的分布式共享存储结构系统结点间的线程调度设 计。特指一种感知微体系结构信息的操作系统线程调度方法。
背景技术
当前的多核处理器技术在一定程度上缓解了处理器性能快速增长与存储器性能 增长缓慢之间的矛盾,但存储器的存储速度仍然是制约处理器性能提升的关键因素。现代 计算机系统通过硬件的方式实现了乱序执行、多指令发射、循环展开等功能,大大隐藏了处 理器访存延迟。在操作系统层面,也可以根据线程的阻塞特点来进行优先级的调整,但就整 体而言还缺乏解决这种矛盾的有效手段。造成系统延迟的主要因素有IO延迟、内存延迟和CPU延迟。在商业数据库应用中, 处理器近一半的执行时间花在了阻塞延迟上。在总的延迟中,存储访问延迟大约占到75%, Cache访问延迟约占存储访问延迟的31 %,内存延迟占69%,并且存储延迟主要是由最后 一级共享Cache失效所致。这一现象的出现不仅源于存储器速度的相对缓慢,也与当前商 业应用及科学计算领域普遍采用的系统体系结构有很大关系。由CMP结点组成的ccNUMA 处理器结构(下面有时也称为多片多核)中的每个结点有多个处理器核,每个核有自己独 立的Cache (有时还区分为指令和数据Cache),每个片上有一个较大容量且为片上的多个 核所共享的Cache (这个Cache有时也称为LLC,Last Level Cache)。内存储器通常采用 分布式结构,各CMP结点带有局部存储,这样,每个CMP中的线程访问本地结点的内存速度 较快,而访问远程结点的内存速度较慢,与访问本地结点内存的时间可以相差1到2个数量 级。最新的操作系统一般都支持多片组成的ccNUMA处理器结构,Linux操作系统将同 一进程的子进程优先分配到父进程所在结点、以减少进程对远程结点内存的访问。在CMP 结点内部,同时运行于各个核上的线程共享LLC,这些并行线程可能对共享Cache产生争 用,当某个线程将数据读入到LLC中后,马上被运行在另一核上的其他线程的数据所覆盖 (多数情况下使用LRU淘汰算法),接着前一线程又再次将数据读入,这种相互的干扰不仅 会导致单个进程的运行速度下降,也严重影响到系统的吞吐率。在结点间,虽然刚产生的线 程默认在本地结点上执行,但由于负载平衡或线程读取内存区的改变,使得某些线程频繁 访问远程内存,进一步加剧访存延迟,感知底层体系结构信息和针对ccNUMA的结点规模进 行可扩展性设计成为操作系统线程设计所面临的新挑战。当然,为提高单个进程运行速度的多线程处理技术和为获得更高吞吐量的事务处 理、Web应用等不尽相同,对事务处理应用而言,应当关注的底层体系结构主要表现在LLC 失效方面,而不是每个核的专有Cache。考虑到线程调度算法必须简单和高效的特点,在没 有硬件支持的情况下,往往难以进行Cache失效率以及访存地址分析处理。现代处理器一 般都提供了 PMU,它是一组可以统计处理器底层事件的计数器,虽然目前大多数处理器的计数器都是体系结构相关的,没有给用户提供一个统一的接口,但大多能提供如Cache失效率以及访存地址分析这些基本信息的统计,如何充分利用PMU实时感知底层的信息并为操 作系统进行进(线)程调度提供指导已受到学术界越来越多的关注。在本发明中,假定PMU为操作系统提供LLC失效率获取和线程数据地址抽样及事 件计数器功能,为调度器高效获取底层信息提供帮助。

发明内容
本发明要解决的问题就在于在以片上多处理器(CMP,Chip Multi Processor)为 结点组成的ccNUMA多处理器结构中,现有调度方法只是根据线程的优先级进行调度,而优 先级没有反映运行时系统内部的资源竞争和使用情况,无法对同时运行的线程是否存在严 重的资源冲突等情况进行感知,而一旦出现上述现象,将会严重影响到单个线程的执行速 度以及系统的整体吞吐量。另一方面,基于线程队列中线程多寡的负载均衡机制不能反映 出线程对内存区域的亲和特征,将与本地访存亲和度大的线程迁移到远程结点上会导致远 程内存访问增加,不能很好地适应ccNUMA结构的分布式内存结构。为解决上述问题,本发明提出的解决方案为一种感知微体系结构信息的操作系 统线程调度方法 MSTS (Micro-Architecture Sensitive Threads Scheduling),该方法能 很好地适应以片上多处理器(CMP,Chip Multi Processor)为结点组成的ccNUMA多处理器 结构,它包含两个层面上的调度策略。在结点内部,针对CMP结构特点,通过实时获取缓存 失效的相关信息,使相互过度竞争共享缓存资源的线程在时间和空间维度上错开运行,使 相互间能进行有效数据共享的线程得到同时或者相继运行。在具体实现方式上,采用修改 权值的方法达到与Linux操作系统现有完全公平调度算法(CFS)的有效结合,使之成为实 际可用的调度方法。在结点间层面,抽样线程频繁访问的内存数据区,尽量将线程绑定到数 据所在结点以减少对远程内存的访问,同时降低片间通信量,该方法在调度的负载均衡和 任务迁移过程中使用。上述调度方法充分利用硬件性能监测单元提供的底层信息,使操作 系统调度器在较小的微信息感知开销下,在两个层面上对线程调度方法进行优化,在保持 相对公平的情况下提高系统吞吐率。现代操作系统通常将用户进程(线程)根据其响应时间的要求不同划分为实时、 交互式以及普通三种类型,实时线程的优先级比交互式线程高,交互式线程的优先级比普 通线程高,现有的调度算法正是基于优先级来进行线程调度的,对于实时线程,操作系统实 现的实时调度是软实时调度,一般采用先来先服及轮循法,这种进程对实时性有较高的要 求,通常不能随意改变其优先级,首次运行后也不能随意进行迁移操作。本发明对这一类线 程的调度不作优化。对后两类而言,其处理方法相同。比如在Linux早期版本的调度器中, 通过动态获取进程运行特征进行优先级修改,这个过程非常复杂,并且使用了许多经验公 式,在后来的公平调度算法中,统一对待,根据线程权值的不同分配不同大小的时间,并通 过特殊的计算方法使得他们运行相同的虚拟时间。本发明适用上述线程类型。如果一个片上有N个核,LLC的大小为T。该N个核可以有单独的运行队列,因而 可以在空间上同时运行N个线程,如图3所示,因为共享内存地址空间的原因,这N个线程 可以访问相同的地址空间,也可以访问完全不同的地址空间,在不考虑不同地址空间映射 到同一 Cahce行(也称为Cache Line)的情况下,如果这些地址空间之和(共享时只计算一次)小于LLC的大小,则各线程可以使用自己在LLC上的空间。如果访问的数据范围之 和大于T字节,或虽然总的访存范围不超过T,但多个线程访存区域频繁发生因组相联(现 在的LLC多为N路组相联结构)映射到相同缓存线而产生交叉覆盖,如图4所示,则表明 各线程之间产生了缓存争用(以下有时也将因组相联映射冲突而导致多个线程产生缓存 交叉覆盖视为缓存空间不够)。另一方面,对同一核上的多个线程而言,由于并发执行的原 因,也会产生同样的LLC访问冲突情况,这是因为一个线程的运行,会将它的工作集调入到 Cache中,而这个过程在Cache空间不足的情况下,就会使用某种替换算法(通常为LRU算 法)淘汰掉一些Cahce行,如果淘汰的Cahce行为后续线程所使用,就需要重新读入。访存 频繁且工作集大的线程将会增加其它核上线程的LLC失效率,从而降低其它线程的运行速 度,特别是当一个片上同时并行运行多个这种特性的线程时,这种相互干扰表现得更为强 烈,如果把一个这样的线程与多个访存相对较少或组映射冲突较小的线程搭配在一起并发 运行,如图3所示,在tick2时刻如果推迟core3以及core4当前的线程,而将它们的下一 个线程提前运行,则四个核所需的访存空间将小于LLC的大小,这样就可以降低线程相互 之间的影响。现有的完全公平调度算法只是简单地依据进程的权重来决定进程应该运行的 时间多少,但没有考虑不同线程运行时对共享Cache的争用所带来的访存延迟。如果支持CCNUMA结构的操作系统将同一进程内的线程放在同一 CMP结点上运行, 在多数情况下,同一进程的多个线程访存范围具有一定的相关性,如果能很好地发挥和利 用这种相关性,则可以提高Cache的利用率。但由于同一结点上运行的进程可能多于一个, 或多个线程虽然都来源于同一进程,但部分线程访存空间存在重叠,而与另一些线程访存 空间相关性不强,在这种情况下,如果前一个线程和随后的线程访存范围都较大,而且空间 没有任何关联,则同样会产生交叉污染,降低了 Cache的利用率。当结点中某一核上发生线程切换后,如果在下一个时间片(以下有时也称为 tick)运行时缓存失效率相比于前一线程比较高,则有以下几种可能性一是因为同一结 点上其它核上的线程访问数据的方式发生了改变,与本核内的线程产生了缓存争用;二是 该线程访存范围较前一线程增大;三是该线程与同核上前一线程访存空间关联很小,大部 分数据需要重新调入缓存。上述情况都要求将这些线程错开运行。理想的情况下,应该在 保持相对公平的前提下,尽可能让访存空间有重叠的线程聚在一起执行,而增大访存空间 毫无关联的线程在运行队列中的距离。感知微体系结构信息的操作系统线程调度方法,即MSTS方法为每个逻辑处理器 (或者核心)准备一个就绪线程运行队列,以一个CMP中所有运行队列为一个虚拟的调度 域,针对每个调度队列的调度方法为 利用现代微处理器中的性能监视寄存器,获取运行线程的LLC(Last Level Cache)失效率,当线程运行完它本次分得的时间进行下一轮调度时,将判断该线程的LLC 失效率情况,看它是否与同时运行的其他线程相容,或者与相同核上的前一线程相容,发现 不相容产生严重冲突时,据此适当调整线程优先级,来改变该线程在调度队列中的位置,使 得下次运行时与这次同时运行的线程错开运行,或者在下次运行时不安排在这次运行的前 一线程之后运行,使得对缓存争用或干扰较大的线程错开运行,缓解Cache抖动和相互覆 盖,从而提高Cache命中率,减少访存延迟,达到提高线程运行速度和改善系统吞吐量的目 的。
在不显式提供线程运行特性的情况下,操作系统线程调度器只能通过运行时的底 层信息获取,如LLC失效率、线程访存空间(通过抽样和分析)信息来改善后续调度。调度 器必须简单和高效,本方法主要依靠硬件PMU (Performance Monitoring Units)单元进行 微信息获取。上述思想可以和完全公平调度算法(CFS,Complete Fair Schedule)进行有机结 合(其他基于优先级进行排队的算法也可),通过在每个运行队列和线程结构中增加LLC失 效 率记录项,以记录本队列所在核的LLC失效率历史信息及线程在上次运行时间片内产生 的LLC失效率。在CFS算法中,线程根据其优先级、已运行时间等转化而来的权重进行排序, 那么调整其nice值(优先级)就可能改变它在运行队列中的排列次序。当某一个核发生了线程切换,并且由于新线程的运行造成同片上多个核LLC失效 率的明显升高,则可以认为该新运行的线程与当前其它核上的线程存在共享Cache争用, 此时对线程的权值(Linux上表现为nice值)修正不同的因子,以降低多个访存集中线程 同时运行的机会,降低它们之间的相互干扰。为了在空间上错开同时运行的线程,在调整 时,还将逻辑处理器号也考虑在内部,不同逻辑处理器号的处理器上线程的调整幅度有变, 这样,也就可以让空间上同时运行的竞争线程通过在各自的运行队列中的不同力度的调 整,达到错开的目的。在结点内,线程迁移可以按照原有运行线程数的方式进行,而在结点间,由于涉及 到远程内存访问的问题,本发明提出了新的解决方法。在跨结点进行线程迁移和负载均衡时考虑访存亲和度。基于CMP结点的ccNUMA 结构通常是一种统一编址的分布式存储结构,内存分布配置在各个CMP结点上,CMP结点内 部集成访存部件,结点上由快速互联网络进行连接。当一个线程访问数据时,首先在本地结 点上的Cache中查找,如果本地结点的LLC缓存失效,则根据此次访存的物理地址到该地址 所属的节点查找,然后通过快速互联传到本地节点的缓存中。如果频繁进行这种远程访存 操作将会大大降低单线程的运行速度及系统吞吐率。结点间负载均衡和线程迁移方法为利用现代处理器提供的数据地址抽样单元及事件计数器提取处理器运行中的底 层信息,在线程运行的每个tick中发生的前M次(M和下面提到的N可以设置)LLC失效 时利用物理地址抽样单元记录其物理地址,并根据物理地址查找该物理地址所对应的结点 号,在M次LLC失效时的结点中,如果其中某一结点号出现的次数超过N,那么就将该线程 标识为迁移线程,在进行负载均衡时,首先考察该线程在本节点上的LLC失效率,如果失效 率不高,暂不作迁移,避免因负载平衡的需要而盲目地将与本地结点访存亲和度大的线程 调度到其它结点上运行。反之,进行线程迁移。如图4所示,通过访存地址抽样得知,线程 Tl及T6的访存区域都不在本地内存上,线程T2及T5对两个结点内存都有访存操作,但访 问本地结点上的内存频率要高于远程访问的频率,线程T3及T4访存区域都在本地结点上。 因此,在下一个时刻,将线程Tl迁移到结点2上,将线程T6迁移到结点1上,可以大大减小 它们远程访存的延迟,并且有效地降低了片间的通信量。与现有技术相比,本发明的优点就在于1、本发明在原有调度算法的基础上,增强对处理器底层访存信息的感知能力,通 过获取LLC失效信息,用于指导调度器进行线程调度,减少因对共享缓存争用较大的多个线程同时运行产生的访存延迟,提高了线程的运行速度和系统吞吐率;通过为每个逻辑处 理器(核心)设计单独的运行管理队列,负载均衡和迁移时考虑线程与结点的亲和度,可以 减少远程数据访问延迟,增强了系统的扩展性。2、本发明利用现代大多数处理器已有的硬件性能监测单元来获取信息,没有增加 额外的硬件,并且由于硬件性能监测单元在统计信息时与处理器其它单元是并行的,操作 系统也只需要花费较小的代价便可获知这些信息。如果在编译内核时关闭该优化功能,其 代码即与原调度器完全一样,因此不会对没有实现本发明所需的硬件性能监测单元的处理 器造成任何不利影响。3、本发明可以和现有调度方法可以有效集成,如对操作系统内核中的CFS调度类 进行局部修改就可实现,对任何运行于内核之上的程序没有任何影响。所获取的额外信息 量小,对不同的硬件实现,仅需实现读取所需信息的接口即可,向上兼容性好,平台间可移 植性好。


图1是一种以2个CMP结点组成的ccNUMA系统结构示意2是加入底层信息感知后的调度器结构示意3是共享缓存争用优化方法示意4是共享缓存组相联映射冲突5是同一队列内各线程Cache交叉污染示意图6是未根据访存亲和度调整前效果7是根据访存亲和度迁移后效果图
具体实施例方式以下将结合附图和具体实施方法对本发明做进一步详细说明。传统的单处理器由于无法克服存储墙及功耗墙等障碍,已无法适应现代商业及科 学计算领域的需求,为了降低功耗,提高处理器访存的速度及带宽,目前的中高端服务器大 多采用由CMP结点组成的ccNUMA并行处理器结构,图1所示的就是一个以两个CMP结点组 成的并行处理器结构。每个核有自己的局部Cache,CMP结点上的各个核共享最后一级容量 较大的全局Cache,并内带存储器控制器,以提高访存速度,通过高速互连机制与其他CMP 相连,实现高速数据传输。为了提高系统的扩展性,内存储器采用分布式结构。虽然现有的Linux操作系统针对ccNUMA体系结构,在进程调度上采取了诸如同 一进程的子进程优先分配到父进程所在结点、设置多层次的调度域以及尽量推迟负载平衡 的方式来降低访存延迟,但在负载平衡时没有考虑线程的访存特性以及CMP结点内多核间 LLC争用带来的影响。据此,本发明提出一种优化的调度方法,即利用线程运行中的动态信 息来指导调度器进行线程调度,改进后的调度器工作方式如图2所示。这里的信息收集由 现代处理器已有的性能监测单元提供,虽然不同的处理器性能监测单元结构并不相同,但 我们在这里要收集的信息主要是最后一级缓存失效率以及访存物理地址抽样,大多数现代 处理器均已提供这种功能,可以通过设置一个统一的接口来屏蔽不同微处理器的差异性。对每个调度队列而言,通过实时获取缓存失效的相关信息,使相互过度竞争共享缓存资源的线程在时间和空间维度上都得以错开运行,也间接地使得相互间能进行有效数 据共享的线程得到同时或者相继运行。为每个逻辑处理器都建立了一个运行队列,包括实 时进程队列以及普通进程队列,可以有效保证其可扩展性。在进行负载平衡和线程迁移时 各结点需要相互配合,其他情况下,各逻辑处理器线程调度队列是相互独立的,互相之间没 有干扰。当某一时刻同一结点内多个核上运行的线程访问数据范围远远大于共享缓存的 容量时,如图3的tick2时刻,四个核所需的LLC容量之和远远大于片上共享缓存的容量, 需要采用页面淘汰算法为新进入的Cahce行腾地方,如目前普遍采取的LRU页面置换算法, 这样,线程间相互干扰将必然导致失效率的提升,线程运行效率下降。而在另一时刻,由于 各线程访存范围均较小,共享缓存没有被完全利用导致浪费,如在图3的tick3时的情况。 理想状态应该是在考虑相对公平的情况下,尽量选择对缓存争用较小且能充分利用缓存 空间的线程并发运行,这样可以大大降低因最后一级缓存失效带来的访存延迟。如在图3 的tick2时刻所示,如果尽快切换core3及core4上的线程,则在下一个时刻,当core3及 core4上运行下一个线程时,则四个线程对共享缓存的访问将如片中共享缓存中所示,不会 发生争用。同样如图4所示,对于因组相联映射冲突而产生交叉污染的多个线程也应该尽 快将它们错开运行。在同一队列内部,因各线程访存相关性不同,也会带来交叉污染的情况。如图5所 示,由进程1产生的线程1及线程3访存区域有重叠,进程2产生的线程2及线程4访存 区域有重叠,如果按照线程T1->T2->T3->T4的顺序调度运行,则每次调度一个新线程运行 时,都必须重新将需要访问的数据读入到Cache中,致使Cache利用率降低,在第一轮循环 时,通过观察各线程的Cache失效率可以发现,四个线程都将产生较高的失效率,在这里, 也可以简单理解为后一线程与前一线程访存区域相关度低,此时我们通过改变后一线程的 Mce值来调整该线程在队列中的位置,也即降低相关度低的线程在以后再次相继运行的可 能性,如图5所示,当发现线程2、3、4的缓存失效率都高的情况下,我们间隔一个线程执行 一次提升Nice值的操作,即将线程2、4的Nice值提升,在下一轮或以后循环执行时,就有 可能变为T1->T3->T2->T4的顺序,此时减少了两个产生大范围Cache失效的可能。因此, 同一结点内各个核在进行进程调度时还应该考虑线程访存的特点,避免出现严重的共享缓 存争用及交叉污染的情况。 上述两种情况都导致一种现象的发生,那就是线程LLC失效率的增高。其解决方 法就是使得相互竞争共享Cache资源的线程错开运行。另外,在ccNUMA结构下,由于采用分 布式内存结构,如果线程对远程内存访问频繁,也会带来线程运行速度和系统吞吐量的降 低。其解决办法是抽样地址访问范围,将线程迁移到访存亲和度最高的CMP结点上进行运 行。为此,本发明是将线程在运行过程中表现出来的动态行为信息收集起来,以指导调度器 更加合理地在CMP结点内及CMP结点间进行线程调度。在结点内,线程迁移相对简单,可以 根据每个核上的运行队列中的线程多寡进行,而对每个调度队列而言,需要观察线程的LLC Cache失效率,将不相容的线程错开运行。结点间的负载均衡和线程迁移将考虑线程的访存 亲和度,利用现代处理器提供的数据地址抽样单元及事件计数器提取处线程运行中的访存 信息,为迁移决策提供帮助。上述调度方法,可以在目前的实际系统中加以实现。为讨论的 方便,下面主要以如何与Linux中的CFS调度器进行增强实现来加以说明。
由于ccNUMA结构的内存是分布式的,内存编址的某一部分必定对应一个结点。为 了描述内存地址范围与结点之间的对应关系,在CFS调度类中增加数据结构Struct mem_plot{int mem_start ;//结点本地内存起止地址int mem_end ;//结点本地内存结束地址int nodejd;//结点的标识符};当CMP结点数量大于1个时,则在CFS调度类中设置该结构的数组,数组项个数与 结点数量相同,以上数据的初始化均可以在系统初始化时完成,系统正常运行期间无需变更。在调度实体schecLentity结构(每个线程一个)中增加变量int node_hit_count [] ;//N维数值,每个对应一个CMP结点,记录LLC失效时访 问该结点内存的次数int LLC_miss_history //线程的历史 LLC 失效次数int access_count_history ;//线程访存的次数int LLC_miss ;//tick期间线程的LLC失效次数int access_count ;//tick 期间线程访存的次数node_hit_count数组中的每一项对应一个CMP结点,用来记录线程访问该结点内 存的次数,目的是为了确定afTinity_id的值,也就是线程数据访问亲和度最高的结点。当新的线程产生后,affinity_id通常被初始化为产生该线程的结点号,在随后的 运行过程中,在数据地址抽样单元记录下其访存的物理地址时,根据mem_pl0t实例查找该 地址所在的CMP处理器结点号,并使n0de_hit_C0Unt数组中的对应项加1。当调度器进行 负载均衡和线程迁移时,可以利用该信息进行有针对性的迁移,避免将本地结点访存亲和 度高的线程迁移到远程结点。在线程运行过程中,每一个tick中断发生时都更新LLC_miss和access_count这 两个变量,LLC_miss记录该线程在该tick运行期间的LLC失效次数,access_count记录该 线程的访存次数,它说明该线程访存的频度,数值越大,访存的频度越高,同时据此,也可以 看出线程属于访存密集型还是计算密集型。LLC_miSS_hiSt0ry用于记录某线程的历史LLC失效次数,该值表明线程运行以来 发生的LLC失效次数,access_c0imt_hist0ry记录线程总的访存次数。这两个值反映了该 线程在运行过程中经历的访存和失效情况。各运行队列的调度方法被修改为(1)在tick中断时,通过访问PMU中的LLC失效率及本次tick期间的访问次数;(2)计算该线程的历史LLC失效率M_his ;(3)计算本次tick期间线程的LLC失效率M ;(4) IF (M < (l+F)*M_his)// 判断线程间 LLC 竞争正常{修改 LLC_miss_history 禾口 access_count_history ;退出错开过程,进行其余操作;}
ELSEIF(线程与当前结点的亲和度+AfT >线程与其他结点的亲和度){if (nice > 0) nice = (nice+processor_id+S)mod 20;else nice = -(-nice+processor_id+S)mod 20 ;退出nice修改过程,进行其余操作;}ELSE {将该线程放入被迁移队列;启动迁移过程}需要指出的是,上述nice值的修改过程中考虑了线程所在处理器号的影响,这是 因为当多个队列分别修改各个线程的nice值时,在各个线程队列长度接近的情况下,如果 修正同样的比率,则他们在各个队列中被调整的位置也可能相同,这样,若干时间后,它们 又有可能再次同时被调度执行,就达不到在空间上不让它们同时执行,需要进行错开的效^ ο上面过程中的F和S均是可以设定参数,F表明高出的比例,比如0. 25,而S是表 示增加nice值的幅度。因为在CFS中,nice值的取值范围是_20到20之间,所以进行了 上述处理。Aff同样是一个经验参数,主要考虑迁移的代价,当本地结点的访存次数与其他某 个结点的访存次数相同时,还不考虑迁移,只有低于对其他某个结点的访问次数时才进行。线程访问地址抽样的方式可以按照以下方法完成(1)设定LLC失效次数中断寄存器;(2)在发生设定值次数的LLC失效时,发生中断;(3)在中断处理程序中读取发生中断时的内存访问地址;(4)根据mem_pl0t信息,判断上述内存地址所在的结点号;(5)修改n0de_hit_C0unt,使得对应结点的数字元素加一。通过上述方法,就可以将获取到访存信息记录到n0de_hit_C0imt,以用于负载均 衡和线程迁移。原有负载均衡过程变成(1) IF (负载均衡仅在CMP结点内进)then按照原有方法进行;(2) ELSE//要进行跨结点的负载均衡{根据各个n0de_hit_C0Unt信息,选取和迁移结点亲和度高的线程进行}可以看到,本发明中感知LLC失效和远程内存访问的方法可以与现在的调度方法 有效集成,通过感知LLC失效率信息,可以使对底层资源过度竞争的线程在核上和核间两 个维度上错开运行,也可以将过度进行远程访问的线程迁移到访存亲和度最好的结点,加 快线程执行速度,增加系统的吞吐量。
权利要求
1.一种感知微体系结构信息的操作系统线程调度方法,其特征在于,该方法包含两个 层面上的调度策略在结点内部,针对CMP结构特点,通过实时获取缓存失效的相关信息, 使相互过度竞争共享缓存资源的线程在时间和空间维度上错开运行,使相互间能进行有效 数据共享的线程得到同时或者相继运行;在结点间层面,抽样线程频繁访问的内存数据区, 尽量将线程绑定到数据所在结点以减少对远程内存的访问,同时降低片间通信量。
2.根据权利要求1所述的一种感知微体系结构信息的操作系统线程调度方法,其特征 在于该方法为每个逻辑处理器准备一个就绪线程运行队列,以一个CMP中所有运行队列 为一个虚拟的调度域。
3.根据权利要求1所述的一种感知微体系结构信息的操作系统线程调度方法,其特征 在于,针对每个调度队列的调度方法为利用现代微处理器中的性能监视寄存器,获取运行线程的LLC,即Last Level Cache, 失效率,当线程运行完它本次分得的时间进行下一轮调度时,将判断该线程的LLC失效率 情况,看它是否与同时运行的其他线程相容,或者与相同核上的前一线程相容,发现不相容 产生严重冲突时,据此适当调整线程优先级,来改变该线程在调度队列中的位置,使得下次 运行时与这次同时运行的线程错开运行,或者在下次运行时不安排在这次运行的前一线程 之后运行,使得对缓存争用或干扰较大的线程错开运行。
4.根据权利要求1所述的一种感知微体系结构信息的操作系统线程调度方法,其特征 在于,将线程在运行过程中表现出来的动态行为信息收集起来,以指导调度器更加合理地 在CMP结点内及CMP结点间进行线程调度。
全文摘要
本发明涉及一种感知微体系结构信息的操作系统线程调度方法。该方法包含两个层面上的调度策略在结点内部,针对CMP结构特点,通过实时获取缓存失效的相关信息,使相互过度竞争共享缓存资源的线程在时间和空间维度上错开运行,使相互间能进行有效数据共享的线程得到同时或者相继运行;在结点间层面,抽样线程频繁访问的内存数据区,尽量将线程绑定到数据所在结点以减少对远程内存的访问,同时降低片间通信量。减少因对共享缓存争用较大的多个线程同时运行产生的访存延迟,提高了线程的运行速度和系统吞吐率。
文档编号G06F9/46GK102081551SQ201110030739
公开日2011年6月1日 申请日期2011年1月28日 优先权日2011年1月28日
发明者余飞, 姜波, 阳国贵 申请人:中国人民解放军国防科学技术大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1