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

装修网站平台有哪些历下区住房和城市建设局网站

装修网站平台有哪些,历下区住房和城市建设局网站,网站开发答辩难点,第一次开票网站建设怎么开目录 2.6 CFS调度类 2.6.1 数据结构 2.6.2 CFS操作 2.6.3 队列操作 2.6.4 选择下一个进程 2.6.5 处理周期性调度器 2.6.6 唤醒抢占 2.6 CFS调度类 即完全公平调度类#xff0c;用于调度普通进程。 2.6.1 数据结构 struct sched_class fair_sched_class {.next 用于调度普通进程。 2.6.1 数据结构 struct sched_class fair_sched_class {.next idle_sched_class, 连接其他调度器类.enqueue_task enqueue_task_fair, 将进程se插入到红黑树.dequeue_task dequeue_task_fair,.yield_task yield_task_fair,.check_preempt_curr check_preempt_wakeup,.pick_next_task pick_next_task_fair, 从红黑树中选择下一个运行的进程.put_prev_task put_prev_task_fair,.set_next_task set_next_task_fair,#ifdef CONFIG_SMP.balance balance_fair,.select_task_rq select_task_rq_fair,.migrate_task_rq migrate_task_rq_fair,.rq_online rq_online_fair,.rq_offline rq_offline_fair,.set_cpus_allowed set_cpus_allowed_common,#endif.task_tick task_tick_fair, 由周期性调度器来调用.update_curr update_curr_fair,} CPU的就绪队列每个CPU都有一个该结构 struct rq {struct cfs_rq cfs; CFS调度类的运行队列struct rt_rq rt; RT调度类的运行队列}//CFS运行队列 struct cfs_rq {struct load_weight load; 该队列进程的权重总和unsigned int nr_running; 该队列就绪进程数u64 exec_clock; 该队列总共占用的cpu时间u64 min_vruntime; 该队列进程中最小的vruntimestruct sched_entity *curr; 当前正执行进程的调度实体struct rb_root tasks_timeline; 红黑树struct rb_node *rb_leftmost; 因为经常访问用于缓存红黑树最左节点。}; struct cfs_rq中min_vruntime作用 如果一个进程sleep太久则它的vruntime很小。 如果进程se-vruntime太小则 se-vruntime CFS-min_vruntime 2.6.2 CFS操作 enqueue_entity()、dequeue_entity()、task_tick()都会调用update_curr() 更新各种时间统计量 void update_curr(struct cfs_rq *cfs_rq) {struct sched_entity *curr cfs_rq-curr;u64 now rq_clock_task(rq_of(cfs_rq));u64 delta_exec;delta_exec now - curr-exec_start; //delta_exec进程此次调度的执行时间curr-exec_start now;curr-sum_exec_runtime delta_exec; 当前进程累计运行时间delta_exec_weighted calc_delta_fair(delta_exec, curr); weighted方式计算如下图curr-vruntime delta_exec_weighted; 更新当前进程vruntimeupdate_min_vruntime(cfs_rq); 更新cfs队列的min_vruntime} nice值越大prio优先级越高查看prio_to_weight数组可知weight越大根据上面公式可知delta_exec_weighted越小这样进程curr-vruntime增长较慢值越小进程se越靠近红黑树左边越先被调度。 最终nice越大越先被调用。 进程休眠时 se-vruntime不增长而就绪队列cfs_rq-min_vruntime会递增唤醒后会se往红黑树左边靠近越先被调度。 进程运行时 se-vruntime增长会往红黑树右边靠近越后被调度。 如此就实现了CFS的公平性。 2.6.3 队列操作 enqueue_task_fair 把当前进程加入到CFS就绪队列。 void enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags){update_curr(cfs_rq); 更新统计量place_entity(cfs_rq, se, 0); 更新vruntimeif (se ! cfs_rq-curr)__enqueue_entity(cfs_rq, se);} __enqueue_entity 遍历红黑数比较进程和树上进程的vruntime值若值小在树的左节点值大在树的右节点找到插入位置后将进程se插入到红黑树。 cfs会调度红黑树最左节点的进程。所以struct cfs_rq会缓存最左节点即 struct cfs_rq {struct rb_node *rb_leftmost;} 如何判断一个进程se是否已经在CPU就绪队列 struct sched_entity { unsigned int on_rq;        答通过该成员值 } 2.6.4 选择下一个进程 pick_next_task_fair 选择下一个执行进程。 static struct task_struct *pick_next_task_fair(struct rq *rq){struct task_struct *p;struct cfs_rq *cfs_rq rq-cfs;struct sched_entity *se;if (!cfs_rq-nr_running) 该CFS队列没有进程return NULL;se pick_next_entity(cfs_rq); 取出红黑树最左节点对应进程的se实现如下set_next_entity(cfs_rq, se); 从红黑树中删除选中的进程se并更新统计}pick_next_entity - __pick_first_entitystruct sched_entity *__pick_first_entity(struct cfs_rq *cfs_rq){struct rb_node *left cfs_rq-rb_leftmost; 缓存的红黑树最左节点return rb_entry(left, struct sched_entity, run_node);//使用container_of宏根据rb_node得到对应se} 2.6.5 处理周期性调度器 每次时钟中断会调用task_tick_fair() void task_tick_fair(struct rq *rq, struct task_struct *curr, int queued){struct cfs_rq *cfs_rq;for_each_sched_entity(curr-se) {cfs_rq cfs_rq_of(se);entity_tick(cfs_rq, se, queued); //如下图}} update_curr()周期更新统计量。 check_preempt_tick: 如果进程运行时间大于期望时间间隔 调用resched_task来设置当前进程的TIF_NEED_RESCHED标志让出CPU。 设置TIF_NEED_RESCHED 标志后等到抢占时机时检查标志并实施抢占操作。 CFS调度类fair_sched_class可用的policy SCHED_NORMAL SCHED_BATCH SCHED_ILDE RT调度类rt_sched_class可用的policy SCHED_RR SCHED_FHFO 2.6.6 唤醒抢占 当do_fork()新进程会调用wake_up_new_task唤醒新进程然后调用check_preempt_curr。 void check_preempt_curr(struct rq *rq, struct task_struct *p, int flags){const struct sched_class *class;rq-curr-sched_class-check_preempt_curr(rq, p, flags);} CFS中check_preempt_curr定义如下 const struct sched_class fair_sched_class {.check_preempt_curr check_preempt_wakeup,} check_preempt_wakeup 检查当前新进程是否需要被抢占以唤醒更高优先级的进程运行。 若需要让出CPU让高优先级进程先运行则调用resched_task resched_task设置当前进程TIF_NEED_RESCHED标记。 应确保se被抢占前至少运行时间大于最小时间限额避免频繁切换。 注意设置完进程的TIF_NEED_RESCHED标志不代表当前进程立马被切换出去而是等到抢占时机点再来检查TIF_NEED_RESCHED标记标志执行切换进程工作。 TIF_NEED_RESCHED存储在进程thread_info的flag成员中。 抢占时机点 1. 中断返回内核态时。 2. 退出临界区如释放自旋锁。
http://www.zqtcl.cn/news/344512/

相关文章:

  • 佛山制作手机网站莆田自助建站软件
  • 建邺做网站价格网站做换肤
  • 佛山有什么网站室内装饰设计怎么样
  • 智能建站与正常的网站购买 做网站 客户
  • 哪个是网络营销导向网站建设的基础微信商城开店需要费用吗
  • 宁波住房和建设局网站首页福州有做网站引流的吗
  • 国外科技类网站戴尔网站建设
  • 视频播放网站模板洞泾做网站公司
  • 深圳大学网站建设中美军事最新消息
  • gta5可用手机网站大全佛山网站建设服务
  • 智能建站软件哪个好智慧城市建设评价网站
  • 做网站用什么配资电脑织梦做的网站织梦修改网页模板
  • 手机网站制作吧网店营销策略
  • 管理员修改网站的参数会对网站的搜效果产生什么影响?网站建设新闻+常识
  • WordPress主题没有删除网站优化 工具
  • 建设外贸商城网站制作外国网站域名在哪查
  • 青浦练塘网站建设关键词优化的策略有哪些
  • 做网站链接怎么弄上海万户网络技术有限公司
  • 嵌入字体的网站网站结构和布局区别
  • 莆田网站建设五维网络有限公司零基础网站开发要学多久
  • 重庆官方网站查询系统2020最近的新闻大事10条
  • 中国网站建设公司排行榜成都彩票网站建设
  • 网站域名解析失败个人推广网站
  • 东莞网站建设网络公司排名卓业网站建设
  • 建立自己的网站平台的好处高校英文网站建设
  • 大力推进网站集约化建设兰州优秀网站推广
  • 手机wap网站怎样从微信公众号打开辽宁省住房和城乡建设厅网站上不去
  • 网站建设备案 优帮云四川建设设计公司网站
  • dede网站搬家 空间转移的方法网站建设多少钱一个平台
  • 山东济南网站开发互联网创业项目哪家好平台