linux 2.6内核进程调度,Linux2.6内核进程调度系列--scheduler_tick()函数2.更新实时进程的时间片,...
Linux2.6内核进程调度系列--scheduler_tick()函数2.更新实时进程的时间片,
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把进程重新插入到同一个活动链表的尾部。
http://www.dengb.com/Linuxjc/1151636.htmlwww.dengb.comtruehttp://www.dengb.com/Linuxjc/1151636.htmlTechArticleLinux2.6内核进程调度系列--scheduler_tick()函数2.更新实时进程的时间片, RT /** * 递减当前进程的时间片计数器,并检查是否已经用完时间片。...
linux 2.6内核进程调度,Linux2.6内核进程调度系列--scheduler_tick()函数2.更新实时进程的时间片,...相关推荐
- linux 2.6内核进程调度,linux2.6内核进程调度
Linux2.4内核进程调度的缺陷: Linux2.4 内核的进程调度采用时间片轮转和优先级相结合的调度策略,但存在以下几个致命缺陷: 1>调度算法时间复杂度是 O(n).2.4 内核每次调度都 ...
- linux中initrd的含义,Linux2.6 内核的 Initrd 机制解析
1.什么是 Initrdinitrd 的英文含义是 boot loaderinitialized RAM disk,就是由 boot loader 初始化的内存盘.在 linux内核启动前, boot ...
- linux 2.6内核镜像,Linux2.6内核镜像的构建过程
make menuconfig:修改.添加内核配置选项,最后生成.config配置文件. make all:首先编译.config得到没有压缩的内核核心vmlinux,然后将其压缩生成引导过程使用的内 ...
- linux2.6内核分析,linux2.6内核分析——LRU链表
LRU链表 本文转自http://liurugongzi.blog.sohu.com/153648100.html lru链表是统称,细分为:活动链表.非活动链表.链表中存放的是属于进程用户态地址空间 ...
- linux内核进程调度—scheduler_tick函数解析
本博,我们详细分解每次定时器中断调用的最重要的更新时间片的函数 -- scheduler_tick函数 当每次时钟节拍到来时,即我们提到过的timer_interrupt会调用do_timer_int ...
- linux 2.6内核进程调度,Linux2.4与Linux2.6内核调度器的比较研究
Linux的内核开发是一个漫长的过程,自2001年11月开发出2.5.0以来,Linux内核的发展十分迅速,作了很多重大的改进,性能也有了很大的提高.内核调度器的改进是最主要的进步之一,本文对比研究了 ...
- Linux2.6 内核进程调度分析
Linux2.6 内核进程调度分析 进程的调度时机与引起进程调度的原因和进程调度的方式有关.在 2.6 中,除核心应用 主动调用调度器之外, 核心还在应用不完全感知的情况下在以下三种时机 ...
- linux 2.6.23时钟中断与调度分析,进程调度Linux内核分析ppt课件
<进程调度Linux内核分析ppt课件>由会员分享,可在线阅读,更多相关<进程调度Linux内核分析ppt课件(26页珍藏版)>请在人人文库网上搜索. 1.Linux操作系统分 ...
- linux内核(二)内核移植(DM365-DM368开发攻略——linux-2.6.32的移植)
一.介绍linux-2.6.32: Linux-2.6.32的网上介绍:增添了虚拟化内存 de-duplicacion.重写了 writeback 代码.改进了 Btrfs 文件系统.添加了 ATI ...
最新文章
- 使用flink Table Sql api来构建批量和流式应用(3)Flink Sql 使用
- 刷题≠学好数学,近百位名校名师告诉你,数学是怎么学好的?
- 全面的Spring Boot配置文件详解
- 【java】之常用四大线程池用法以及ThreadPoolExecutor详解
- 前端可视化开发-编辑器
- 吃了核辐射食物怎么办_尿酸过高怎么办?这几种食物,平时可多吃
- docker镜像删除
- python调用caffe环境配置
- Linux下如何查找nginx配置文件的位置
- [转]C++异常处理 4
- java删除文件和文件夹
- 食品工业中HACCP应用现状和未来发展(转载)
- Kubernetes API的流编解码器StreamSerializer
- springboot报错:Use of @OneToMany or @ManyToMany targeting an unmapped class:
- 计算机管理显示磁盘未知,磁盘未知,未初始化或未分配问题的解决方案
- vue项目打包部署到与后台同一服务器上
- 格式化后如何修复损坏的JPEG文件?
- 【Cicadaplayer】播放器的时间戳
- 51单片机实现简易闹钟(包含闹钟功能)
- 书摘—做自己的公关专家