“基础”域的“范围”将构成域层次结构的第一级.在smt情况下,将跨度所有的物理cpu,而每个组将有一个虚拟cpu. 【推荐阅读:XML Server与XML-enabl】
linux2.6版本中的进程调度作了不小的改变.1.引入调度域概念每一个cpu都有一个“基本”的调度域(struct sched_domain).函数cpu_sched_domain(i)与宏this_sched_domain()用来表示可以使用的cpu域.域的层次结构均是通过->parent指针所指向的基础域而构建的.->parent指针要保证以null结束,而且应当为每个cpu分配域结构以便于cpu的增加.在每一个调度域的范围内都拥有几个cpu(存于->span中).调度域的范围意思是:“在各cpu之间达到负载的平衡”.一个域的范围必须不小于它的子域范围,而且cpu i的基础域范围至少为i.位于域层次结构最顶层的域的范围将覆盖系统中的所有cpu.每一个调度域都必须有一个或多个cpu组(struct sched_group),用->groups指针链接成一个环形.而这些组的cpumask在域范围内都必须是相同的.任意的两个组的cpumask交集必须为空集(即不相同).->groups指针所指向的组必须包含这个域所拥有的cpu.而当某些组被建立后,它们可能因为包含一些只读数据而被cpu所分享.在组之间会发生调度域的平衡操作.这个时候,每一个组将被当成一个整体.组的负载将被定义为其每一个cpu的负载总与.所以当组与组的负载不平衡时,将发生调度域的平衡操作,在组与组之间进行平衡.在kernel/sched.c中,rebalance_tick在每一个cpu上周期性的运行.这个函数在cpu的基础调度域内检查是否重新达到了平衡.如果是, 则将在那个域内运行load_balance.而rebalance_tick将接着检查父调度域(如果有的话),进而是父调度域的父调度域,如此下去.
linux 2.6内核为多程序提供了一种不同的途径,即numa(non uniform memory access).这种方法中,内存与处理器是相互连接的,但对于每一个处理器,某些内存是“关闭”的,而某些内存则“更远”.... 下一页