周期性调度器scheduler_tick
周期性调度器由中断实现,系统定时产生一个中断,然后启动周期性调度器,周期性调度器执行过程中要关闭中断, 周期性调度器执行完毕后再打开中断(handle_IRQ_event, IRQF_DISABLED)
周期性调度器主要做两个工作:
a)更新相关统计量
b)检查进程执行的时间是否超过了它对应的ideal_runtime,如果超过了,则告诉系统,需要启动主调度器(schedule)进行进程切换。(注意thread_info:preempt_count、thread_info:flags (TIF_NEED_RESCHED))
周期性调度器
|---->do_timer() 更新jiffies_64
|---->update_process_times()
|---->scheduler_tick()
|---->update_rq_clock() 更新当前调度队列rq的clock
|---->curr->sched_class->task_tick()
| 对于普通进程,即task_tick_fair()
| task_struct: struct sched_class *sched_class
update_rq_clock()----delta = sched_clock_cpu(cpu_of(rq)) - rq->clock
|-----两次相邻两次周期性调度器运行的时间差
|----rq->clock += delta; 更新运行队列上的时钟
|---->update_rq_clock_task(rq, delta)
| 即rq->clock_task += delta
普通进程
task_tick_fair()---->entity_tick() 没有考虑组调度
|---->update_curr() 更新相关统计量
|---->check_preempt_tick()
| 检查进程本次获得CPU使用权的执行时间是否超过了
| 它对应的ideal_runtime值,如果超过了,则将当前进
| 程的TIF_NEED_RESCHED标志位置位 update_curr()
|----delta_exec = (unsigned long)(now - curr->exec_start);
| exec_start当前进程开始获得
| cpu使用权时的时间戳;
| 进程本次所获得的CPU执行权的时间;
|---->__update_curr(cfs_rq, curr, delta_exec);
|---->curr->sum_exec_runtime += delta_exec;
| 更新该进程获得CPU执行权总时间
|
|---->curr->vruntime += delta_exec_weighted;
| 更新该进程获得CPU执行权的虚拟时间
|
|---->update_min_vruntime()
| 更新cfs_rq->min_vruntime
|
|---->curr->exec_start = now
| 更新进程下次运行起始时间
| (如果被抢占,下次被调度时将会更新) check_preempt_tick()
|----ideal_runtime = sched_slice(cfs_rq, curr);
|----delta_exec = curr->sum_exec_runtime
| - curr->prev_sum_exec_runtime;
|----if(delta_exec > ideal_runtime)
| resched_task(rq_of(cfs_rq)->curr);
| 把当前进程的TIF_NEED_RESCHED标志位置位
|----else
| delta = curr->vruntime - se->vruntime; //这是什么?
| if (delta > ideal_runtime)
| resched_task(rq_of(cfs_rq)->curr);
| 把当前进程的TIF_NEED_RESCHED标志位置位
实时进程
task_tick_rt()
|---->update_curr_rt();
|---->if (p->policy != SCHED_RR) return; SCHED_FIFO只有主动放弃CPU使用权
|---->rt.timeslice值减一,若没有运行完时间则直接返回,
| 否则再次分配时间片,加入队列尾部,设置TIF_NEED_RESCHED update_curr_rt()
|----delta_exec = rq->clock - curr->se.exec_start; //本次运行时间
|----curr->se.sum_exec_runtime += delta_exec; //更新总得运行时间
|----curr->se.exec_start = rq->clock; //更新下次进程运行的起始时间
|----if (sched_rt_runtime(rt_rq) != RUNTIME_INF)
|-------{
| rt_rq->rt_time += delta_exec;
| if (sched_rt_runtime_exceeded(rt_rq))
| resched_task(curr);
| }
周期性调度器scheduler_tick的更多相关文章
- Linux CFS调度器之task_tick_fair处理周期性调度器--Linux进程的管理与调度(二十九)
1. CFS如何处理周期性调度器 周期性调度器的工作由scheduler_tick函数完成(定义在kernel/sched/core.c, line 2910), 在scheduler_tick中周期 ...
- Linux核心调度器之周期性调度器scheduler_tick--Linux进程的管理与调度(十八)
我们前面提到linux有两种方法激活调度器:核心调度器和 周期调度器 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测是否有必要 因 ...
- 调度器的实现、schedule、switch_context、switch_to
根据<深入Linux内核架构>和Linux-3.10.1内核源码,记一些调度过程的主体工作. 调度器任务:CPU数目比要运行的进程数目少,需要程序之间共享CPU时间,创造并行执行的错觉.分 ...
- Linux进程核心调度器之主调度器schedule--Linux进程的管理与调度(十九)
主调度器 在内核中的许多地方, 如果要将CPU分配给与当前活动进程不同的另一个进程, 都会直接调用主调度器函数schedule, 从系统调用返回后, 内核也会检查当前进程是否设置了重调度标志TLF_N ...
- linux cfs调度器
在抽象模型中vruntime决定了进程被调度的先后顺序,在真实模型中决定被调度的先后顺序的参数是由函数entity_key决定的. static inline s64 entity_key(str ...
- linux cfs调度器_模型实现
调度器真实模型的主要成员变量及与抽象模型的对应关系 I.cfs_rq结构体 a) struct sched_entity *curr 指向当前正在执行的可调度实体.调度器的调度单位 ...
- linux cfs调度器_理论模型
参考资料:<调度器笔记>Kevin.Liu <Linux kernel development> <深入Linux内核架构> version: 2.6.32.9 下 ...
- 第一次作业:基于Linux 4.5的进程模型与调度器分析
1.操作系统是怎么组织进程的? 1.1什么是线程,什么是进程: 刚接触时可能经常会将这两个东西搞混.简单一点的说,进程是一个大工程,线程则是这个大工程中每个小地方需要做的东西(在linux下看作&qu ...
- Linux进程管理 (2)CFS调度器
关键词: 目录: Linux进程管理 (1)进程的诞生 Linux进程管理 (2)CFS调度器 Linux进程管理 (3)SMP负载均衡 Linux进程管理 (4)HMP调度器 Linux进程管理 ( ...
随机推荐
- C#学习笔记(6)——大项目增删改查
说明(2017-5-28 11:35:39): 1. 需要注意的地方很多 2. 首先是连接字符串str要直接写在类里面,不然每个按钮里面都要写一遍. 3. 查询用到sqlDataReader等三个方法 ...
- C#防止内存泄露的方法
一般程序员()都会这样认为:用C#这样的语言编程的一个好处就是无需再考虑内存的分配和释放.你只需创建对象,然后通过一种叫做垃圾收集的机制来处理这 些对象,也就是说:当它们不再被应用程序需要的时候来自动 ...
- 我的zsh简单设置
bash用久了,有些地方开始觉得不爽,于是想看看有没有更好的选择.原来在网上瞎逛时,已经很多次看到有人推荐zsh了,加上zsh高度兼容bash,于是就来折腾这个. 不过试验了一下oh-my-zsh,感 ...
- [转]oracle在删除表\表空间\用户时,如何释放磁盘空间
一.drop表 执行drop table xx 语句 drop后的表被放在回收站(user_recyclebin)里,而不是直接删除掉.这样,回收站里的表信息就可以被恢复,或彻底清除. 通过查询回收站 ...
- HTTP 响应头信息(Http Response Header) Content-Length 和 Transfer-Encoding
Tomcat 中响应头信息(Http Response Header) Content-Length 和 Transfer-Encoding 客户端(PC浏览器或者手机浏览器)在接受到Tomcat的响 ...
- OpenCV颜色空间——HLS颜色空间
引自:http://blog.csdn.net/zhangping1987/article/details/73699335 HLS颜色模型 HLS颜色空间,三个分量分别是色相(H).亮度(L).饱和 ...
- Drupal 开发必备利器
http://drupalchina.cn/node/3436 转自 测试模块.主题.发行版的网站: http://simplytest.me/ Drupal API: https://api.dru ...
- 编写.info文件
概述 drupal用.info文件来存储主题和模块的metadata. 对于模块来说,.info文件用于: 为Drupal站点管理界面解析信息: 为模块的激活和卸载提供标准和需求: 提醒drupal一 ...
- python 输出当前行号
import sys print sys._getframe().f_lineno ---------------------------------------------------------- ...
- 微信小程序 --- e.currentTarget.dataset.id 获取不到值
直接代码 wxml代码片段 <view class='ranksList' wx:for="{{ranksLb}}"> <view class='ranksLis ...