CpuMemSets在Linux操作系统中的实现(4)

文章作者 100test 发表时间 2007:03:14 16:28:58
来源 100Test.Com百考试题网


3.2 进程调度及内存分配

内核调用0update_cpus_allowed(struct task_struct *p)根据任务的current_cms的处理器列表更改它的cpus_allowed位向量,从而影响该任务的处理器调度。

  【kernel/cpumemset.c】

  585 void

  586 0update_cpus_allowed(struct task_struct *p)

  587 {

  588 #ifdef CONFIG_SMP

  589     int i.

  590     cpumemset_t *cms = p->current_cms.

  591     cpumask_t cpus_allowed = CPU_MASK_NONE.

  592

  593     for (i = 0. i < cms->nr_cpus. i  )

  594         __set_bit(cms->cmm->cpus[cms->cpus[i]], &.cpus_allowed).

  595     if (any_online_cpu((cpumask_t*)&.cpu_online_map) < NR_CPUS) {

  :

  609         set_cpus_allowed(p, &.cpus_allowed).

  610     }

  611 #endif

  612 }
  

内核根据虚拟存储区的vm_mems_allowed位向量为任务分配内存,如果是在中断上下文中,虚拟存储区的内存分配则依赖于kernel_cms的mems_allowed。宏CHECK_MEMS_ALLOWED(mems_allowed, zone)负责检查zone所在的节点是否落在mems_allowed设定的内存块集合内。

  【mm/memory.c】

  1383 int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct * vma,

  1384     unsigned long address, int write_access)

  1385 {

  :

  1390     /*

  1391     * We set the mems_allowed field of the current task as

  1392     * the one pointed by the faulting vma. The current

  1393     * process will then use the correct mems_allowed mask

  1394     * if a new page has to be allocated.

  1395     */

  1396     if(!in_interrupt())

  1397    current->mems_allowed = vma->vm_mems_allowed.:

  1417 }

  

  【mm/page_alloc.c】

  334 struct page * __alloc_pages(..)

  :

  343     if (in_interrupt())

  344         mems_allowed = kernel_cms->mems_allowed.

  345     else

  346         mems_allowed = current->mems_allowed.

  347     if (mems_allowed == 0) {

  348         printk(KERN_DEBUG workaround zero mems_allowed in alloc_pages\\n).

  349         mems_allowed = -1UL.

  350     }

  :

  if(!CHECK_MEMS_ALLOWED(mems_allowed, z))

  continue.

  :

  450 }

  

  【include/linux/cpumemset.h】

  194 /* Used in __alloc_pages() to see if we can allocate from a node */

  195 #define CHECK_MEMS_ALLOWED(mems_allowed, zone) 

    196 ((1UL << (zone)->zone_pgdat->node_id) &. (mems_allowed))
  

为虚拟存储区分配页时,如果当前执行该任务的处理器包含在该虚拟存储区的cms中,则从该处理器的内存块列表中分配,否则从该虚拟存储区的cms定义的CMS_DEFAULT_CPU的内存块列表中分配。



相关文章


CpuMemSets在Linux操作系统中的实现(5)
CpuMemSets在Linux操作系统中的实现(4)
CpuMemSets在Linux操作系统中的实现(3)
CpuMemSets在Linux操作系统中的实现(1)
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛