RT

	/**
* 递减当前进程的时间片计数器,并检查是否已经用完时间片。
* 由于进程的调度类型不同,函数所执行的操作也有很大差别。
*/
/* 如果是实时进程,就进一步根据是FIFO还是RR类型的实时进程 */
if (rt_task(p)) { /**
* 对SCHED_RR类型(时间片轮转)的实时进程,需要递减它的时间片。
* 对SCHED_FIFO类型(先进先出)的实时进程,什么都不做,
* 退出。在这种情况下,
* current进程不可能被比其优先级低或其优先级相等的进程所抢占,
* 因此维持当前进程的最新时间片计数器是没有意义的。
*/
if ((p->policy == SCHED_RR) && !--p->time_slice) {
/**
* 对SCHED_RR类型的实时进程,如果它的时间片已经用完,
* 就执行此下动作,以达到抢占当前进程的目的。
* 如果必要的话,就尽快抢占。
*/
/* 重新计算它的时间片,它根据进程的静态优先级来计算它的时间片。 */
p->time_slice = task_timeslice(p);
/**
* 该标志被fork例程中的copy_process设置,
* 直到这里,说明进程一定不是第一次运行了,
* 它已经用完了一次它的时间片,将first_time_slice置为0.
* 这样,它即使退出,也不会将剩余的时间片还给父进程了。
*/
p->first_time_slice = 0;
/**
* 设置调度标志,以达到尽快抢占的目的。
* 该标志强制调用schedule函数,以便current指向的进程能
* 被另外一个有相同优先级(或更高优先级)的实时进程(如果有)所取代。
*/
set_tsk_need_resched(p); /* put it at the end of the queue: */
/**
* 将实时进程放到队列末尾。这样,如此链表中还有其他同优先级
* 的RR进程,其他进程就能够得到运行了。
*/
requeue_task(p, rq->active);
}
goto out_unlock;
}

1.这里解释几个主要的子函数,首先是task_timeslice,重新计算时间片。首先介绍一下基本时间片的概念。

静态优先级本质上决定了进程的基本时间片,即进程用完了以前的时间片时,系统分配给进程的时间片长度。静态优先级和基本时间片的关系用下列公式确定:

如你所见,静态优先级越高(其值越小),基本时间片就越长。其结果是,与优先级低的进程相比,通常优先级较高的进程获得更长的CPU时间片。

#define NICE_TO_PRIO(nice)	(MAX_RT_PRIO + (nice) + 20)
#define SCALE_PRIO(x, prio) \
max(x * (MAX_PRIO - prio) / (MAX_USER_PRIO/2), MIN_TIMESLICE) static unsigned int task_timeslice(task_t *p)
{
if (p->static_prio < NICE_TO_PRIO(0))
return SCALE_PRIO(DEF_TIMESLICE*4, p->static_prio);
else
return SCALE_PRIO(DEF_TIMESLICE, p->static_prio);
}

2.requeue_task函数把进程描述符移到与当前进程优先级相应的运行队列活动链表的尾部。把current指向的进程放到链表的尾部,可以保证在每个优先级与它相同的可运行实时进程获得CPU时间片以前,它不会再次被选择来执行。

这是基于时间片轮转的调度策略。进程描述符的移动通过两个步骤完成:先调用list_del把进程从运行队列的活动链表中删除,然后调用list_add_tail把进程重新插入到同一个活动链表的尾部。

Linux2.6内核进程调度系列--scheduler_tick()函数2.更新实时进程的时间片的更多相关文章

  1. Linux2.6内核进程调度系列--scheduler_tick()函数3.更新普通进程的时间片

    RT /** * 运行到此,说明进程是普通进程.现在开始更新普通进程的时间片. */ /* 首先递减普通进程的时间片计数器.如果用完,继续执行以下操作 */ if (!--p->time_sli ...

  2. Linux2.6内核进程调度系列--scheduler_tick()函数1.总体思想

    参考的是ULK第三版,Linux2.6.11.12内核版本. 调度程序依靠几个函数来完成调度工作,其中最重要的第一个函数是scheduler_tick函数,主要步骤如下: /** * 维持当前最新的t ...

  3. Linux2.6内核--进程调度理论

    从1991年Linux的第1版到后来的2.4内核系列,Linux的调度程序都相当简陋,设计近乎原始,见0.11版内核进程调度.当然它很容易理解,但是它在众多可运行进程或者多处理器的环境下都难以胜任. ...

  4. Linux2.6内核协议栈系列--TCP协议2.接收

    1.排队机制 接收输入TCP报文时,有三个队列: ● 待处理队列 ● 预排队队列 ● 接收队列 接收队列包含了处理过的TCP数据段,也就是说,去除了全部的协议头,正准备将数据复制到用户应用程序.接收队 ...

  5. Linux2.6内核协议栈系列--TCP协议1.发送

    在介绍tcp发送函数之前得先介绍很关键的一个结构sk_buff,在linux中,sk_buff结构代表了一个报文: 然后见发送函数源码,这里不关注硬件支持的分散-聚集: /* sendmsg系统调用在 ...

  6. Linux2.6内核实现的是NPTL

    NPTL是一个1×1的线程模型,即一个线程对于一个操作系统的调度进程,优点是非常简单.而其他一些操作系统比如Solaris则是MxN的,M对应创建的线程数,N对应操作系统可以运行的实体.(N<M ...

  7. linux2.6内核compat_ioctl函数

    一.内核原型(linux2.6.28-7) long (*compat_ioctl)(struct tty_struct *tty, struct file * file,               ...

  8. Linux2.6内核--抢占

    [摘要]本文首先介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核(Preemptive Kernel)的区别.接着分析Linux下有两种抢占:用户态抢占(User Pree ...

  9. Linux0.11内核--进程调度分析之2.调度

    [版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5596830.html ] 上一篇说到进程调度归根结底是调用timer_interrupt函数, ...

随机推荐

  1. 2DToolkit官方文档中文版打地鼠教程(三):Sprite Collections 精灵集合

    这是2DToolkit官方文档中 Whack a Mole 打地鼠教程的译文,为了减少文中过多重复操作的翻译,以及一些无必要的句子,这里我假设你有Unity的基础知识(例如了解如何新建Sprite等) ...

  2. 一年之计在于春,2015开篇:PDF.NET SOD Ver 5.1完全开源

    前言: 自从我2014年下半年到现在的某电商公司工作后,工作太忙,一直没有写过一篇博客,甚至连14年股票市场的牛市都错过了,现在马上要过年了,而今天又是立春节气,如果再不动手,那么明年这个无春的年,也 ...

  3. 一步步开发自己的博客 .NET版(4、文章发布功能)百度编辑器

    前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做个插件,任何网站上的技术 ...

  4. 前端构建大法 Gulp 系列 (一):为什么需要前端构建

    系列目录 前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gul ...

  5. (临时)C#中,exe 单例运行

    Mutex mutex = new Mutex(false, ""); , false)) { MessageBox.Show("程序已经启动"); retur ...

  6. 对jquery操作复选框

    摘要:jquery操作复选框.使用更简洁易懂,思路清晰,逻辑更明了,很实用 <!DOCTYPE html> <html> <head> <meta chars ...

  7. 空中网招聘Java架构师、数据库开发等各类人才

    爱好网络游戏吗?爱好网站开发技术吗? 有没有想过可以成为史诗级MMO RPG<激战2>运营团队中的一员? 如果下面的职位有合适你的,加入我们吧! http://gw2.kongzhong. ...

  8. zookeeper集群搭建

    1.由于是第一次搭建zk的集群,过程中遇到些问题,给自己也给遇到问题的人提供一种可能解决问题的方法. 第一步:下载zk的最新版,我下的是3.4.9,在zk的官网,下载后解压到/usr/local ta ...

  9. 巧用javascript对象属性,向事件绑定的匿名函数内传递循环控制变量的值

    遇到一个需要向匿名函数传递循环控制变量的问题,我受到园子里这篇文章的启发[笔记]js获取当前点击元素的索引,解决了这个问题.现在把代码贴出来,以防止自己忘记. if ($('#labModal').l ...

  10. HTML5移动开发学习笔记之Canvas基础

    1.第一个Canvas程序 看的是HTML5移动开发即学即用这本书,首先学习Canvas基础,废话不多说,直接看第一个例子. 效果图为: 代码如下: <!DOCTYPE html> < ...