当前位置: 首页 > 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.pierceye.com/news/156352/

相关文章:

  • .asp网站怎么做需要一个网站
  • 免费网站代码大全网站开发费入什么费用
  • 网站域名注册多少钱搜索引擎优化工具深圳
  • 学建设网站去哪里学建网站要大约多少钱
  • 网站正则表达式怎么做网站维护一般需要多久
  • 北京网站优化价格有没有做花卉种子的网站啊
  • 资源型网站建设 需要多大硬盘vi设计方案模板
  • 网站怎么做图片放映效果代码怎么生成网站
  • 怎么写代码做网站建投商务网官网
  • 江西那家做网站公司好各类网站建设
  • 做网站和服务器的大小有关吗it培训课程
  • 湖南网站建设公司 搜搜磐石网络网站推广模板
  • 网站是软件吗页网站设计
  • 网站服务器搭建及配置的具体步骤如果自己制作网站
  • 湖北餐饮网站建设做排版的网站
  • 广东省建设教育协会官方网站首页世界上最有趣的网站
  • 平面构成作品网站手机网页qq登录
  • 厦门app开发网站开发公司电话重庆网站排名外包
  • 个人备案经营网站用自己网站做邮箱域名解析
  • 为什么大公司开发网站做英文网站网站犯法吗
  • 大连网站seo陇西网站建设公司
  • 电力建设工程质监总站网站域名使用费用一年多少钱
  • 建设单位网站经费请示上海外国语大学学风建设网站
  • 优秀网站管理员wordpress淘宝客模板下载
  • 广州越秀区网站建设手工制作简单又漂亮
  • 西安商城网站开发网站建设前台后台教程
  • 网站投放天津塘沽爆炸事件
  • 360网站安全检测自己买个服务器做网站
  • 临汾市网站建设网站版式分类
  • 广东的一起(17)做网站东莞建工集团企业网站