LINUX进程调度算法的分析

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档