当前位置: 首页 > news >正文

deadline调度学习

本篇通过几个方面来看deadline调度器1、deadline的设置2、deadline的任务的添加3、deadline的任务的调度deadline的设置deadline调度器不允许直接通过kernel_clone的方式创建需要通过sched_setattr的方式将指定pid task修改为deadline调度器并进行必要参加的赋值,大体流程图如下首先通过系统调用sched_setattr主动来设置指定pid task的优先级别SYSCALL_DEFINE3(sched_setattr,pid_t,pid,structsched_attr__user*,uattr,unsignedint,flags){structsched_attrattr;structtask_struct*p;intretval;if(!uattr||pid0||flags)return-EINVAL;retvalsched_copy_attr(uattr,attr);if(retval)returnretval;if((int)attr.sched_policy0)return-EINVAL;if(attr.sched_flagsSCHED_FLAG_KEEP_POLICY)attr.sched_policySETPARAM_POLICY;rcu_read_lock();retval-ESRCH;pfind_process_by_pid(pid);if(likely(p))get_task_struct(p);rcu_read_unlock();if(likely(p)){if(attr.sched_flagsSCHED_FLAG_KEEP_PARAMS)get_params(p,attr);retvalsched_setattr(p,attr);put_task_struct(p);}returnretval;}__setscheduler_params:void__setparam_dl(structtask_struct*p,conststructsched_attr*attr){structsched_dl_entity*dl_sep-dl;dl_se-dl_runtimeattr-sched_runtime;dl_se-dl_deadlineattr-sched_deadline;dl_se-dl_periodattr-sched_period?:dl_se-dl_deadline;dl_se-flagsattr-sched_flagsSCHED_DL_FLAGS;dl_se-dl_bwto_ratio(dl_se-dl_period,dl_se-dl_runtime);dl_se-dl_densityto_ratio(dl_se-dl_deadline,dl_se-dl_runtime);}__setscheduler_prio:staticvoid__setscheduler_prio(structtask_struct*p,intprio){//根据优先级设定调度策略if(dl_prio(prio))p-sched_classdl_sched_class;elseif(rt_prio(prio))p-sched_classrt_sched_class;elsep-sched_classfair_sched_class;p-prioprio;}上述动作做完后就将task加到指定的调度器任务中staticinlinevoidenqueue_task(structrq*rq,structtask_struct*p,intflags){if(!(flagsENQUEUE_NOCLOCK))update_rq_clock(rq);if(!(flagsENQUEUE_RESTORE)){sched_info_enqueue(rq,p);psi_enqueue(p,(flagsENQUEUE_WAKEUP)!(flagsENQUEUE_MIGRATED));}uclamp_rq_inc(rq,p);p-sched_class-enqueue_task(rq,p,flags);if(sched_core_enabled(rq))sched_core_enqueue(rq,p);}deadline的任务的添加大概调用流程如下enqueue_task_dl - enqueue_dl_entity - __enqueue_dl_entity- rb_add_cached这里对调用细节不作论述只关注几个重要点一、deadline的设置在上面已经有相关的配置了但是相对值。还需要转化成需要数据这里需要把设置的相对时间变成绝对截止时间二、deadline核心的任务添加过程从上面可知deadline调用器。使用的红黑二叉树左子树优先级最高。根据deadline值大小进行插入。插入完成后需要对二叉树作相关处理 以满足红黑二叉树特性。deadline的任务的调度在进行任务调度时候如果deadline调度器有任务可供调度则会调用其pick_next_task_dl的回调函数staticstructtask_struct*pick_next_task_dl(structrq*rq){structtask_struct*p;ppick_task_dl(rq);//获取一个优化级最高的task就是上面所说的rb_leftmost//#define rb_first_cached(root) (root)-rb_leftmostif(p)set_next_task_dl(rq,p,true);returnp;}staticvoidset_next_task_dl(structrq*rq,structtask_struct*p,bool first){structsched_dl_entity*dl_sep-dl;structdl_rq*dl_rqrq-dl;p-se.exec_startrq_clock_task(rq);//记录开始执行的时间if(on_dl_rq(p-dl))update_stats_wait_end_dl(dl_rq,dl_se);/* You cant push away the running task */dequeue_pushable_dl_task(rq,p);//将此task从二叉树上移除不能老是占位if(!first)return;if(hrtick_enabled_dl(rq))start_hrtick_dl(rq,p);//启动高精度定时器if(rq-curr-sched_class!dl_sched_class)update_dl_rq_load_avg(rq_clock_pelt(rq),rq,0);deadline_queue_push_tasks(rq);}#ifdefCONFIG_SCHED_HRTICKstaticvoidstart_hrtick_dl(structrq*rq,structtask_struct*p){//定时器的超时时间为runtime也就是说task运行时间为runtime大小hrtick_start(rq,p-dl.runtime);}#else/* !CONFIG_SCHED_HRTICK */staticvoidstart_hrtick_dl(structrq*rq,structtask_struct*p){}#endif下面来看看定时器超时的处理一、定时器的初始化staticvoidhrtick_rq_init(structrq*rq){#ifdefCONFIG_SMPINIT_CSD(rq-hrtick_csd,__hrtick_start,rq);#endifhrtimer_init(rq-hrtick_timer,CLOCK_MONOTONIC,HRTIMER_MODE_REL_HARD);rq-hrtick_timer.functionhrtick;//超时回调函数}staticenumhrtimer_restarthrtick(structhrtimer*timer){structrq*rqcontainer_of(timer,structrq,hrtick_timer);structrq_flagsrf;WARN_ON_ONCE(cpu_of(rq)!smp_processor_id());rq_lock(rq,rf);update_rq_clock(rq);//调用到了调度器的task_tick回调函数rq-curr-sched_class-task_tick(rq,rq-curr,1);rq_unlock(rq,rf);returnHRTIMER_NORESTART;}这里需要注意的是 task_tick这个函数在系统的tick 定时器里面也会调用二、定时器超时处理staticvoidtask_tick_dl(structrq*rq,structtask_struct*p,intqueued){//更新当前状态并修改runtime值大小为剩下时间update_curr_dl(rq);update_dl_rq_load_avg(rq_clock_pelt(rq),rq,1);/* * Even when we have runtime, update_curr_dl() might have resulted in us * not being the leftmost task anymore. In that case NEED_RESCHED will * be set and schedule() will start a new hrtick for the next task. */if(hrtick_enabled_dl(rq)queuedp-dl.runtime0is_leftmost(p,rq-dl))//如果runtime时间大于0则会restart此定时器并使用最新的超时时间start_hrtick_dl(rq,p);}上面的处理比较清晰由于tick定时器会不断触发这里的runtime值为持续减少。如果runtime小于等于0或者调用yield_task_dl回调函数都会将当前处理的task移除二叉树。并重新进行任务调度。deadline任务调度器核心是任务的添加、移除、调度。这里的二叉树的使用策略搞清楚大体就能明白deadline的调度器使用逻辑了
http://www.rkmt.cn/news/1410135.html

相关文章:

  • 2026年 EPS/EPP源头厂家最新推荐榜:东莞EPS颗粒、阻燃EPS板材、EPP保温箱及EPP托盘与周转箱专业实力深度解析 - 品牌企业推荐师(官方)
  • 深度解析ResNet-50 v1.5架构:为什么它比原始版本更准确?
  • 基于Python的数据画像解析工具:从平台数据到个人数字画像
  • 江西不锈钢水表箱怎么选?认准源头工厂!江西泗方水处理是专业批发厂家,可定制加工,靠谱厂家推荐看这里 - 栗子测评
  • 书法笔法就3种!学会平动、提按、绞转,你也能写出专业线条
  • 临沂批发必看!旭阳电器商行精选扬子骆驼、熊猫、米小可电风扇,冷风机、商务扇优质货源,本地靠谱供货商一站式推荐 - 栗子测评
  • 2026年 饰品回收推荐榜单:东莞卡地亚/梵克雅宝/宝格丽/蒂芙尼/香奈儿等大牌饰品高价上门回收与专业收购指南 - 品牌企业推荐师(官方)
  • 首次使用 Taotoken 从注册到发出第一个 API 请求的全记录
  • 【几何 矢量证明】三角形的中线、及重心性质、多边形的质心(面心)
  • Edge浏览器太占内存?微软AI和游戏助手竟是罪魁祸首
  • 避坑指南:STM32WLE5CCU6移植LoRaWAN_AT_Slave工程时,那些CubeMX和BSP包的常见问题
  • MiMo API开放平台体验:MiMo V2.5 降价后太香了
  • tmux不止是后台挂起:5个提升终端效率的进阶玩法(分屏、会话管理、窗口同步)
  • 2026年宝钢HC820/1180QPD+Z/ZF吉帕钢厂商推荐榜:超高强度与轻量化技术的深度解析与选购指南 - 品牌企业推荐师(官方)
  • 变分量子算法在HPC环境中的模拟优化与实践
  • 2026年工程测量与监测服务推荐榜:覆盖不动产测绘、海洋测绘、地下管网及自动化智能化监测、桥梁隧道矿山监测实力品牌解析! - 品牌企业推荐师(官方)
  • Kibana 仪表板即代码:在 Elastic 9.4 中用于 Kibana 仪表板的 GitOps、漂移检测与 Terraform
  • 《大象——thinking in UML》书籍导读
  • 别再为导线误差头疼了!手把手教你用LM385和KTA2333搭建三线制PT100测温电路(附完整代码)
  • 6种字重+双格式:PingFangSC苹方字体跨平台部署终极指南
  • Arduino项目效率优化:巧用PWM口与模拟口,让你的CPU时间不再被循环delay占用
  • 如何在电脑上畅玩任天堂3DS游戏:Citra模拟器完整指南
  • PowerDesigner画UML图总是不好看?这5个隐藏的样式配置技巧(含箭头文字显示修复)
  • lambda如何读写dynamedb数据
  • 我的tmux日常使用
  • 智能驾驶的“眼睛”:车辆检测技术全景解读与实战指南
  • Cartographer无里程计建图实战:室内外效果对比与参数调优心得
  • 面试高频:Spring AI 统一聊天入口怎么设计,这次把路由和降级讲具体
  • LightRAG 入门指南:手把手教你用图增强 RAG 系统
  • 别再拍脑袋定样本量了!用Excel手把手教你搞定市场调研问卷的样本容量(附置信区间计算模板)