CpuMemSets在Linux操作系统中的实现

http://tech.ddvip.com   2007年03月11日    社区交流

本文详细介绍CpuMemSets在Linux操作系统中的实现

  每个虚拟存储区都拥有各自的vm_mems_allowed位向量。新建虚拟存储区的vm_mems_ allowed通过cms_current_mems_allowed()继承自创建者任务current_cms的mems_allowed。对于被挂接的已存在的虚拟存储区,如mmap的内存对象和共享内存区,则继承自挂接进程current_cms的mems_allowed。cms的mems_allowed位向量由mems_allowed_build(cms)根据cms中的所有内存块列表来构造。

  【include/linux/mm.h】
  45 struct vm_area_struct {
  :
  77 unsigned long vm_mems_allowed; /* cpumemset managed memory placement */
  :
  81 };
  
  【kernel/cpumemset.c】
  1538 static unsigned long
  1539 mems_allowed_build(cpumemset_t *cms)
  1540 {
  1541     int i;
  1542     unsigned long mems_allowed = 0;
  1543
  1544     for (i = 0; i < cms->nr_mems; i++)
  1545         mems_allowed |= mems_allowed_value(cms, cms->mems + i);
  1546     return mems_allowed;
  1547 }

  3.2 进程调度及内存分配

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

  【kernel/cpumemset.c】
  585 void
  586 update_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 }

作者:Maker    责编:豆豆技术应用

正在加载评论...