LINUX进程调度算法的分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LINUX进程调度算法的分析
何 翔,顾 新
(西安电子科技大学,陕西西安 710071)
摘 要进程调度对一个操作系统来说是至关重要的,它起着非常关键的作用。本文针对Linux操作系统中的普通进程调度算法进行了分析,对以进程为CPU时间分配单位和以用户为CPU时间分配单位的两种算法进行了分析和对比。对它们在不同环境下对进程调度效率和公平性的影响进行了探讨,并总结出它们各自适用的环境。
最后为了进一步提高进程调度的效率和公平性,提出了混合算法的思想。
关键词进程调度;普通进程;动态优先级
中图分类号 TP316
1 前 言
在Linux操作系统中,有两种常用的普通进程
调度算法。它们分别以进程和用户为调度单位来进
行CPU时间的分配。这两种算法分别体现了多进程
环境下系统运行的高效性和多用户环境下的公平
性。但是这两种算法都有各自的适用环境,因此它
们各自都有优缺点。本文从多用户的公平性和多进
程的高效性出发对这两种算法进行了分析和比较,
最后提出了混合算法的思想,使进程调度更加高效
和公平。
2 进程调度
进程调度要满足高效率,公平性,响应时间快,周转时间短和吞吐量大等要求。Linux操作系统的内核根据进程响应时间的情况把进程分为3大类:交互进程;批处理进程;实时进程。内核在此基础上实现了3种不同的调度策略:SCHED_ FIFO(即先进现出策略);SCHED_RR(即轮转策略);SCHED_OTHER(适合交互分时的程序)。
进程调度时机,即调度器何时开始启动。可以在以下几个时刻进行进程调度:
(1)进程状态转换的时刻;
(2)可运行队列中新增加一个进程时;
(3)当前进程的时间片用完时;
(4)进程从系统返回到用户态时;
(5)内核处理完中断后,进程返回到用户态时。
在以上几种情况下进程调度可以解释为在下面几
个状态中进行切换。
进程调度的流程如图1所示。
图1 进程调度的流程图
图1的转换条件如下:
(1)调度;(2)时间片用完;(3)跟踪并调度;
(4)退出;(5)收到信号并醒来;(6)等待资源
到位再调度;(7)等待资源到位再调度;(8)等待
资源到位;(9)资源到位或收到信号。
3 普通进程调度算法的分析
3.1 按进程调度的算法分析
Schedulue()是按进程调度算法的主要函数,
是系统的核心函数。它的核心代码如下:
next=idle_task(this_cpu);
电子科技 2005年第9期(总第192期)
21
LINUX 进程调度算法的分析
IT Age/ Sep. 15, 2005
22c=-1000;
list_for_each(tmp,&runqueue_head)
{
p=list_entry(tmp, struct task_struct, run_list);
if(can_schedule(p, this_cpu))
{
int weight =
goodness(p , this_cpu, prev->active_mm);
if(weight>c)
c=weight, next=p;
}
}
这种算法是对可运行队列中的进程进行一次遍历,拿当前进程的权值和其余进程的权值进行比较。初始的权值为c =-1000,这只有在可运行队列为空时才成立,其他进程的权值(weight )是由goodness()函数计算出来的。当队列中某个进程的权值最大且大于当前进程的权值时,系统就把CPU 的占有权让给这个进程,否则当前进程继续占有CPU 。
这种算法在用户拥有的进程数相差不大时,可以提高系统效率。但在各用户进程数相差悬殊时,就会产生某些拥有很少进程的用户的“饥饿感”并
加大进程调度的不公平性。举个例子——例如A ,B 两个用户,A 用户开了99个进程,B 用户只开了1个进程,根据按进程的调度算法,CPU 的时间是平均分配给每个进程的,因此系统将大部分的CPU 时间分配给了A 用户,而B 用户得到的CPU 时间只有1%。所以B 用户一定感到很不公平。 3.2 按用户调度的算法分析
算法流程如图2所示。图中标号含义如下: (1)遍历所有用户结构,并把move_task 置空; (2)访问每一个进程;
(3)判断进程所属用户的CPU 时间是否为0; (4)重新计算该进程的counter 值; (5)判断是否遍历完了所有的进程; (6)访问每一个用户;
(7)判断此用户的CPU 时间是否为0; (8)把该用户放到可运行队列尾部; (9)重新计算该用户的CPU 时间; (10)判断是否遍历完了所有用户; (11)结束算法。
图2 算法流程图
算法中的用户结构如下: struct user_struct {
atomic_t count; atomic_t processes; atomic_t files; struct user_struct *next, **pprev; uid_t uid; struct user_struct *our_next ,*our_prev; //遍历用户结构时所需的两个指针 struct task_struct *move_task; //保存当前进程信息的指针
long cpu_ticks; //用户实际拥有CPU 时间的变量 }
这种算法是以用户为单位来分配CPU 的占用时间在用户拥有进程数相差很大时,可以有效的提高调度的公平性。但在用户拥有的进程数相差不大时,就会因为多余的循环而使系统效率下降。
我们假设有两个用户分别拥有M 和N 个进程,对以上两种算法进行了,如表1。
表1 两种算法比较
运行状态两用户瞬时CPU 占用之比
进程瞬时占用率之比
进程占用CPU 时间之比
按进程调度算法 M 个进程M :N 1:1 1:1 按用户调度算法
N 个进程
1:1
N :M 1:1