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

网站301检测石龙仿做网站

网站301检测,石龙仿做网站,朝阳港网站建设方案,太姥山镇建设的网站目录 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.pierceye.com/news/615792/

相关文章:

  • 小说章节收费网站建设东莞网络营销网站建设
  • 找工作网站如何设计一款软件
  • 贵金属企业网站源码手机端网站加盟
  • 大连企业网站排名优化平面设计和网页设计
  • 广州网站建设工作室招聘文创产品设计分析
  • 产品是做网站seo网站设计费用
  • 公司网站的搭建方案做海报图片的网站
  • 纯文本网站建设小米发布会最新
  • 定制版网站建设费用网站服务器干啥
  • 漂亮的网站是什么建设出来的弄一个小程序要多少钱
  • 房地产网站模板 下载免费空间和域名
  • 通付盾 建设网站公司最新永久地域自动跳转
  • 宁波建网站选哪家好一点wordpress手机全部显示
  • 如何注册属于自己的网站做列表的网站
  • 网站公司seo杭州网站建设模板
  • 网站内链如何布局优化大师下载
  • 如何做网站需求表格清单电影购买网站怎么设计
  • 有口碑的常州网站建设家政公司网站建设方案
  • 用户体验设计师吉林网站seo
  • 便宜营销型网站建设优化建站多网站绑定域名
  • 什么网站教人做3d效果图网站建设电话销售不被挂断
  • 村级网站建设 不断增强免费logo设计图案创意
  • 做网站优化有什么途径什么类型的公司需要做建设网站的
  • 计算机毕设代做网站深圳自适应网站开发
  • 万网主机建设网站流程idc 网站备案
  • 收费用的网站怎么做珠海网站关键词推广
  • 学技巧网站制作网站建设税率多少
  • 高端网站设计平台网页设计模板的网站
  • 万网云服务器网站上线网站开发开票税率
  • 西安高端网站制作公司网站开发需要哪些知识