预览加载中,请您耐心等待几秒...
1/5
2/5
3/5
4/5
5/5

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

linux调度过程中调度优先级与时间片算法对象设计与描述:动态优先级的计算主要由effect_prio()函数完成,该函数实现相当简单,从中可见非实时进程的优先级仅决定于静态优先级(static_prio)和进程的sleep_avg值两个因素,而实时进程的优先级实际上是在setscheduler()中设置的(详见"调度系统的实时性能",以下仅考虑非实时进程),且一经设定就不再改变。unsignedlongsleep_avg进程的平均等待时间,单位是纳秒(nanosecond),在0~NS_MAX_SLEEP_AVG范围内。它的实质是进程等待时间和运行时间的差值。当进程处于等待或者睡眠状态时,该值变大;当进程运行时,该值变小。上本次休眠时间sleep_time就达到了如果不是从TASK_UNINTERRUPTIBLE休眠中被唤醒的(p->activated!=-1)sleep_avg是进程的"平均"等待时间,recalc_task_prio()计算了等待时间,如果不是从TASK_UNINTERRUPTIBLE休眠中被唤醒的(p->activated!=-1)系统引入了一个interactive_credit的进程属性(见"改进后的task_struct"),用来表征该进程是否是交互式进程:只要interactive_credit超过了CREDIT_LIMIT的阀值(HIGH_CREDIT()返回真),该进程就被认为是交互式进程。进程本次运行的时间run_time交互式进程的run_time小于实际运行时间,sleep_avg越大,则run_time减小得越多,因此被切换下来的进程最后计算所得的sleep_avg也就越大,动态优先级也随之变大。交互式进程可以借此获得更多被执行的机会。run_time可以用系统当前时间与进程timestamp(上一次被调度运行的时间)的差值表示,但不能超过NS_MAX_SLEEP_AVG用户进程(p->mm!=NULL)等待得越久,sleep_avg越大,进程越容易被调度到;而运行得越久,sleep_avg越小,进程越不容易调度到。在wake_up_forked_process()中,父进程的sleep_avg要乘以PARENT_PENALTY/100,而子进程的sleep_avg则乘以CHILD_PENALTY/100。实际上PARENT_PENALTY为100,CHILD_PENALTY等于95,也就是说父进程的sleep_avg不会变,而子进程从父进程处继承过来的sleep_avg会减小5%,因此子进程最后的优先级会比父进程稍低(但子进程仍然会置于与父进程相同的就绪队列上,位置在父进程之前--也就是"前言"所说"子进程先于父进程运行")。一个进程结束运行时,如果它的交互程度比父进程低(sleep_avg较小),那么核心将在sched_exit()中对其父进程的sleep_avg进行调整,这表明sleep_avg可以表示交互度进程优先级无论什么进程静态优先级固定,实时进程动态优先级也固定利用进程平均等待时间来衡量进程的优先级,使得宏观上相同静态优先级的所有进程的等待时间和运行时间的比值趋向一致,反映了Linux要求各进程分时共享cpu的公平性。另一方面,sleep_avg还是进程交互式程度的衡量标准。effective_prio()函数将进程的sleep_avg映射成范围是-MAX_BONUS/2~MAX_BONUS/2的变量bonus,而MAX_BONUS是等于,可见sleep_avg仅能影响的优先级范围在-5~5之间。具体的映射是由以下规则完成的:那么进程的动态优先级就等于:(当然必须在MAX_RT_PRIO和MAX_PRIO-1之间)。可见,sleep_avg和bonus是一个线性关系。进程的sleep_avg越大,bonus越大,从而进程的动态优先级也就越高。函数recalc_task_prio()先要根据进程被唤醒前的状态(即actived)、interactive_credit等来计算进程的sleep_avginteractive_credit有两处增1的地方,都在函数recalc_task_prio()里面减少interactive_credit只有一处地方减1,在函数schedule()里面。sleep_avg给进程带来的动态优先级上的奖励最大只有5时间片的计算:time_slice完全只与(p)->static_prio有关进程的时间片time_slice是基于进程静态优先级的,静态优先级越高(值越小),时间片就越大。计算时间片是同过函数task_timeslice()(kernel/sched.c)来完成的。该函数也是使用线性映射