一种面向SMP调度***的优化方法
技术领域
本发明涉及处理器技术领域,具体地说是一种实用性强、面向SMP调度***的优化方法。
背景技术
随着技术的发展,计算机科学也在不断前进,而 CPU 作为计算机最昂贵的资源,发展的速度很快,体积骤减和频率剧增,但是单核处理器的架构越来越繁琐、复杂,不仅给设计带来了相当大的困难,而且还使得 CPU 得不到最大化的使用,再加上体积变小,功耗却没有降下来,散热也成了问题,很难使得处理器的设计与实现以及频率的提升能够顺利的进行下去。
所以转向多核处理器是发展的需要。片上多核处理器CMP(Chip Multi-Processor)就是在那个关键的时刻被提出的,它在一个处理器芯片上封装了多个核心,各个核心能并行地运行各自的任务,非常接近传统的对称多处理器***(SymmetricMultiprocessors,SMP)。多核处理器中的每个核都可视为一个独立的单元,并且它的实现起来相对容易,对以后的研发也便于扩展,并且发热也没有比单核处理器少。多核处理器在频率不变的情况下通过并行运行多个任务来实现性能的提升,也使得CPU得到了充分的利用。
但***中的处理器增多了,在多处理器环境进行任务调度,使得***的性能最大化变成非常关键的问题。原先,***中只有一个处理器,进程的分配不用考虑处理器的环节,只要根据其他的标准作出判断既可,但是现在又有一个非常重要的因素加入,原先的标准就必须作出调整以适应新的架构。并且在处理器间出现某些CPU闲着、某些超载时,要进行适当的调整,让整个***的CPU利用率最大化,使得Cache得到更多的利用。基于此,现提供一种从调度上使***的性能最优、面向SMP调度***的优化方法。
发明内容
本发明的技术任务是针对以上不足之处,提供一种实用性强、面向SMP调度***的优化方法。
一种面向SMP调度***的优化方法,其具体实现过程为:
当第一个获得转移指标的进程使用完之后,在释放转移指标的同时获取它所在的CPU编号,所述转移指标用于保护进程间共享资源;
当存在等待此转移指标的队列时,就让队列中的任务记录当前CPU的编号,唤醒同样持有该转移指标的进程并将其呼唤到该处理器上来,使持有相同转移指标的进程运行在同一个处理器上,其具体呼唤转移过程为:
进程收到输入的唤醒信号,该进程对应执行的cpu的编号为n,并将被唤醒进程的进程控制块中的属性字段赋值为n;
当本地CPU编号为n时,进程继续执行;
当本地CPU编号不为n时,在进行下次负载平衡时,把该进程转移到编号为n的CPU运行队列中,然后进程继续执行。
所述转移指标、转移进程所需要的转移函数、进程与CPU匹配时的转移阀值共同组成转移因子,其中
转移指标,用于保护进程间共享资源,并把若干个耦合度高的进程关联起来;
转移函数,用来确定任务转移的目的端,确认第一个持有转移指标的进程具体执行时的处理器,并对征用该转移指标的进程进行标记赋值,记录下要转移到的处理器;
转移阀值,用于对进程和CPU进行最佳匹配,即当要进行任务的转移时,转移函数得到的结果等于某个阀值时,就把该任务优先转移到与该转移阀值对应的CPU上执行。
所述属性字段为一个整型的属性字段cpuindex,其用于表示进程最适合运行的cpu编号,并添加到进程控制块中。
在创建进程时,cpuindex属性初始化成-1;当***运行到某个进程,并发现该进程需要申请使用完转移指标后,释放该转移指标时,如果发现有竞争存在,就通过函数接口来获得当前的CPU编号并记录在它的cpuindex中,再把它作为参数传递给唤醒函数,让它在唤醒进程的同时把CPU的编号也一起传过去,并把被唤醒的进程的cpuindex字段设置为传递的CPU编号,释放转移指标并唤醒等待该转移指标的进程,此时,如果被唤醒的进程所在的CPU等于它的 进程控制块中的cpuindex变量,则不需要进行转移操作;否则,就把被唤醒的进程转移到编号为cpuindex的CPU上去。
当调度***查看当前的负载状况时,如果发现有负载不平衡时,通过调用 函数进行负载平衡,该负载平衡的过程为:找到调度域中最忙的一个组,再从最忙的组中找到负载最忙的处理器,并选择其中的负载,把它们转移到本地处理器上来。
本发明的一种面向SMP调度***的优化方法,具有以下优点:
该发明的一种面向SMP调度***的优化方法
提出一种面向SMP调度***的优化方法,以 Linux 内核为基础进行了源码修改和实现,通过做实验得出的结果来验证方案的正确性,能够有效提高***性能,提高高速缓存利用率;有效提高***性能,损耗小,对应用透明,实用性强,易于推广。
附图说明
附图1为本发明的采样流程图。
附图2为本发明的唤醒进程处理流程图。
具体实施方式
下面结合附图和具体实施例对本发明作进一步说明。
***中的处理器增多了,在多处理器环境进行任务调度,使得***的性能最大化变成非常关键的问题。本发明提出了一种面向SMP调度***的优化方法,能够有效的提高高速缓存的利用率。
本发明的目的是这样实现的,为了提高***的资源利用率和整体性能,充分利用高速缓存,在进行任务的转移时,要考虑多种要素,而标准的 Linux 内核中的 SMP在进行任务的转移时,没有对运行队列中的任务属性的不同进行区别的对待,所以要想进一步提升高速缓存的利用率,主要是通过对转移的任务进行选择,让共享资源多的进程尽量分配到同一个处理器上执行。
一种面向SMP调度***的优化方法,在原有的内核基础上,借助FUTEX锁机制,对优化方案进行了设计,针对SMP调度***的优化,设计了基于唤醒信号的优化方案,进一步的提升高速缓存的利用率。通过对转移的任务进行选择,让共享资源多的进程尽量分配到同一个处理器上执行。本发明设计了利用唤醒信号的反馈模块,当第一个进程获得该锁并使用完之后,在唤醒的同时也把持有该锁的其他进程呼唤到它的处理器上来。
如附图1、图2所示,其具体实现过程为:
首先对Linux内核的负载均衡调度模型进行了改进,使用四维向量<P,T,M,S>表示。其中:
P(Processor):指的是***中的处理器;
T(Task):指的是***的任务集;
M(Migrate):指的是***进行转移的依据,即转移因子;
S(Strategy):指的是***的负载均衡策略。
在选择转移的对象时,针对提升Cache利用率,需添加一个转移因子,该转移因子包括转移指标、转移函数和转移阀值,其中:
转移指标:要想让共享资源多的进程分配到一起执行,即特征是共享资源,而为了保护共享资源的安全性,在访问这些资源时要先取得保护该资源的锁,所以可以通过利用该锁来把多个耦合度高的进程关联起来,所以转移指标设置为保护进程间共享资源的锁。
转移函数:该函数的功能主要是用来确定任务转移的目的端,既然想让共享同一把锁的进程运行在同一个处理单元上,那么需要首先知道第一个持有锁的进程在哪个处理器上执行,并对征用该锁的进程进行标记赋值,记录下要转移到的处理器。
转移阀值:
结合原有调度***的基础上,对某些进程和CPU进行最佳匹配,当要进行任务的转移时,利用各个CPU的编号作为阀值,当转移函数得到的结果等于某个阀值时,就把该任务优先转移到对应的CPU上执行。
Linux的调度***在分配任务时没有考虑到各个任务之间的联系,如果将两个需要经常进行通信的进程分配到不同的CPU上,就在一定程度上降低了高速缓冲区的利用率,而且在进行负载平衡进行任务转移时,也需要考虑这方面的影响。
为了让持有相同锁的进程运行在同一个处理器上,当第一个获得该锁并使用完之后,在唤醒的同时也把持有该锁的进程呼唤到它的处理器上来,如附图1所示,利用唤醒信号反馈的优化方法架构图中,调度***在第一次执行时按照原来的调度***流程进行,但在调度完成后,开始采集一些信息,反馈模块对这些信息进行处理后,反馈给调度***,进而影响调度***的执行流程,从而达到优化的目的。
当第一个征用该锁的进程运行完成后,在释放锁的同时获取它所在的CPU编号,当存在等待此锁的队列时,就让队列中的任务记录当前CPU的编号,以便于将来对把该任务转移到此处理器上去执行。 因为SMP***中的CPU是维护在一个数组中,所以只要知道数组的下标就能唯一确定该 CPU。而要标示一个进程最合适运行的 CPU,需要添加一个整型的属性字段cpuindex。因为它是标示进程的属性,所以将它添加到进程控制块task_struct中。
如附图2所示,在创建进程时,就把cpuindex属性初始化成-1。当***运行到进程a,并发现它需要申请使用完futex锁后,当释放该锁时,如果发现有竞争存在,就通过函数接口task_cpu()来获得当前的CPU编号(数组的下标值)并记录在它的cpuindex中,再把它作为参数传递给唤醒函数,让它在唤醒进程的同时把CPU的编号也一起传过去,并把被唤醒的进程的cpuindex字段设置为传递的CPU编号,释放futex锁并唤醒等待该锁的进程。
此时,如果被唤醒的进程所在的CPU等于它的task_struct中的cpuindex 变量,则不需要进行转移操作;否则,就尽量把被唤醒的进程转移到编号为cpuindex的CPU上去。当调度***查看当前的负载状况时,如果发现有负载不平衡时,会通过调用load_balance()进行负载平衡。首先它会找到调度域中最忙的一个组,再从最忙的组中找到负载最忙的处理器,并选择其中的一些负载,把它们转移到本地处理器上来。
上述具体实施方式仅是本发明的具体个案,本发明的专利保护范围包括但不限于上述具体实施方式,任何符合本发明的一种面向SMP调度***的优化方法的权利要求书的且任何所述技术领域的普通技术人员对其所做的适当变化或替换,皆应落入本发明的专利保护范围。