返璞归真的Linux BFS调度器(5)

展示一些代码BFS调度器思想很简单:集中精力做好一件事,适应一种场景,代码同样十分简单,因此即使贴上代码整个文章也不会显得过于冗长,你再也看不到诸如load_balance或者for_each_domain之类的东西了,至于CPU cache的亲和力智能判断,如果你非要做,那么就自己调用sched_setaffinity系统调用设置吧,把一个线程或者一组相关的进程设置到一个或者一组共享Cache的CPU上,让内核这些,在进程不那么多,CPU个数不那么多,没有NUMA的系统上,真的太累了。
a.进程插入当有一个进程要插入运行队列的时候,调度器要遍历所有的CPU,看一下是否能抢占某个CPU上正在运行的进程,这种策略是十分合理的。BFS调度器将所有的CPU作为一个执行者,其执行的资源就是唯一的运行队列。如果不能抢占任何进程,那就将唤醒的进程相插入到相应队列的末尾位置,等待deadline的调度:

static inline void enqueue_task(struct task_struct *p)   {       if (idleprio_task(p) && !rt_task(p)) {           if (idleprio_suitable(p))               p->prio = p->normal_prio;           else               p->prio = NORMAL_PRIO;       }       if (iso_task(p) && !rt_task(p)) {           if (isoprio_suitable())               p->prio = p->normal_prio;           else           p->prio = NORMAL_PRIO;       }       __set_bit(p->prio, grq.prio_bitmap);       list_add_tail(&p->run_list, grq.queue + p->prio);       sched_info_queued(p);   }  

b.进程唤醒BFS省略了复杂的负载均衡机制,因此try_to_wake_up瘦身了很多很多。BFS不做调度域负载均衡,其理由是“在决定将进程投入运行的时候,消耗一点点计算来让其自选CPU”。全局的看待整个CPU集合才是王道,所谓的负载均衡并不是说每个CPU上排队待运行进程数量的均衡,而是让每个CPU都动起来。因此唯一需要均衡的地方就是抢占,如果不能抢占任何CPU上的当前进程,那么就排入到全局的BFS队列中,这是个全局的队列而不是每CPU队列,因此对各个CPU机会是均等的,当CPU需要运行一个进程的时候,让其自己来这个全局队列中挑选一个最值得运行的,而在这里,所有的CPU的挑选策略是相同的!

static int try_to_wake_up(struct task_struct *p, unsigned int state)   {       unsigned long flags;       int success = 0;       long old_state;       struct rq *rq;       rq = time_task_grq_lock(p, &flags);       old_state = p->state;       if (!(old_state & state))           goto out_unlock;       if (queued_or_running(p))           goto out_running;       activate_task(p, rq);  //调用enqueue_task       try_preempt(p, rq); //这里有一个O(m)时间复杂度的计算,m为cpu的个数       success = 1;   out_running:       trace_sched_wakeup(rq, p, success);       p->state = TASK_RUNNING;   out_unlock:       task_grq_unlock(&flags);       return success;   }  

我们没有看到关于任何关于CPU亲和力的“小手段”,在不多于16个CPU的系统上,完全没有必要考虑CPU亲和力带来的巨大性能影响,如今的处理器都是微封装的,大多数的桌面处理器都使用共享Cache,因此为了榨取那么一点点“一级缓存命中”所带来的性能提升而增加如此复杂的针对于CPU亲和力的负载均衡代码,得不偿失!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/22177.html