linux进程调度条件 剥夺,Linux进程调度算法分析.doc

Linux进程调度算法分析

摘要 :基于X86平台Linux2.6.26内核进程调度部分代码,刨析Linux进程调度算法,对算法的原理,实现和复杂度进行了分析并提出了算法改进措施。

关键字:Linux内核 进程调度 算法

1. Linux进程调度概述

Linux系统支持用户态进程和内核线程,需要说明的是,Linux没有提供用户态线程支持,实现用户态线程需要引入第三方线程库。

操作系统进程调度是整个操作系统理论的核心,在设计进程调动机制需要考虑的具体问题主要有:

1)调度的时机:在什么情况下,什么时候进行调度。

2)调度的“政策”(policy):根据什么准则挑选下一个进入运行的进程。

3)调度的方式:是“可剥夺”(preemptive)还是“不可剥夺”(nonpreemptive)。

图1.2.1给出了Linux进程状态转换关系:

图1 Linux进程状态转换图

Linux进程调度分为自愿调度和强制调度两种。1)在内核空间,一个进程可以通过schedule()启动一次调度,也可以在调用schedule()之前,将本进程状态设置为TASK_INTERRUPTIBLE或TASK_UNINTERRUPTIBLE,暂时放弃运行而进入睡眠。这通常发生在来自用户空间的系统调用被阻塞。在用户空间,用户进程可以通过系统调用nanosleep()达到目的。2)调度还可以是非自愿的。在一定条件下,内核会强制性剥夺当前进程运行而调度其他进程进入运行。

Linux调度政策基础是时间片轮转+优先级抢占的结合,为了满足不同应用的需要,内核提供了三种调度方法: 1)SCHED_FIFO实时调度策略,先到先服务2)SCHED_RR实时调度策略,时间片轮转3)SCHED_NORMAL 分时调度策略(在2.6内核以前为SCHED_OTHER)。用户进程可以通过系统调用sched_setscheduler()设定自己的调度策略。SCHED_FIFO和SCHED_RR的区别是,前者只有在就绪队列中有优先级更高的进程,或进程被阻塞,或自愿调用阻塞原语(如sleep_on_interruptible)的情况下,才会放弃CPU,而如果调度策略是后者,当前进程与就绪队列里其他进程按Round Robin方式共享CPU。

2. Linux进程调度原理

基本的操作系统进程调度算法包括先来先服务(first come first serve),时间片轮转(round robin),多级反馈轮转法(round robin with multiple feedback),优先级法(静态优先级法/动态优先级法),短作业优先法(shortest job first),最高响应比优先法(highest response_ratio next)。不同调度算法应用场合不同,某些调度算法可能仅具有研究价值,实际中鲜有应用;而某些调度算法需要互补以完成设计需求。但是,无论哪种进程调度算法,都要面对以下实际问题:

1)调度器对实时进程的响应;

2)调度器的调度开销,以及系统进程负载对调度的影响;

3)在SMP环境下,当前CPU调度对其他CPU的影响;

Linux2.6.x内核进程调度算法为解决上述问题,设计了全新的数据结构和调度算法,但其基本策路仍是以优先级为基础的抢占式调度,与2.6以前内核版本不同,内核抢占可能发生在内核态(因此,2.6版本的内核代码必须考虑到重入问题)。

2.6版本的内核调度也是几度变迁,其基本思想是1)提高实时进程调度相应比2)普通进程调度体现“完全公平这个思想The Rotating Staircase Deadline Schedule)Linux2.4内核维护双向循环队列runqueue,一旦调度时机触发,内核重新计算当前队列中所有进程运行权值,并从中挑选出权值最高的进程作为当前进程投入运行。其弊端是显而易见的:

1)调度时机触发,重新计算runqueue中每个进程运行权值,复杂度为O(n), 且调度性能与内核负载相关。

2)runqueue同时管理着实时进程与非实时进程(普通进程),内核通过进程属性,如实时或非实时、实时进程优先级、用户进程或内核线程相关因素来计算运行权值count,灵活性低,且不便于理解和维护。

从Linux2.6早期版本开始,内核进程对实时进程调度重新设计了O(1)调度器——SD/RSDL,RSDL调度器是在SD调度器基础上的改进。Linux2.6.26内核在早期2.6内核基础上简化了RSDL调度器,把就绪进程队列和过期进程队列合并为就绪队列。下面结合内核代码,给与实时进程O(1)调度器的实现(限于篇幅,本文给出核心数据结构关键成员的注释)。

1)就绪进程队列struct rq

struct rq {

/* ...... */

/* run

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值