控制组分析——初始化与任务分组

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 08:42 点击:

前言
前面介绍了控制组主要数据结构和控制组文件系统的设计,本文继续对控制组进行介绍,内容主要包括:控制组的初始化、任务分组、遍历控制组中任务以及其他相关实现.有了前面文章介绍的基础,本文的内容很容易理解.

1. 初始化控制组

内核会在系统启动时对各个系统模块进行初始化,控制组作为内核的功能模块之一当然也不例外.控制组的初始化分为两个阶段:系统刚刚进入start_kernel()后立刻进行初始化,另外是其他模块建立后进行初始化.为此控制组的初始化主要由两个函数实现cgroup_init_early()和cgroup_init().内核在两个不同位置上对控制组进行初始化的原因在于子系统管理系统中的某些资源,而有些子系统需在系统初始化相应资源(比如内存管理模块)模块之前初始化,此外系统默认控制组rootnode以及init_css_set等数据结构最好也提前初始化,这样在初始化系统其他模块时就能方便使用了.

1.1 cgroup_init_early()实现

系统启动早期(几乎在所有系统模块初始化之前)控制组初始化工作主要包括:初始化rootnode(默认控制组根结构),init_css_set,init_cg_cgrp_link等结构,并将init进程添加到dumptop(默认控制组rootnode.top_cgroup),以及初始化需早期初始化的子系统.该函数代码比较简单,主要工作是初始化各个数据结构并将数据结构关联起来,代码如下:
C代码 
int __init cgroup_init_early(void){ 
    int i; 
    //设定init_css_set的引用计数为1 
    atomic_set(&init_css_set.refcount,1); 
    //初始化和init_css_set结构中的链表头指针(cg_links,tasks)和链表节点 
    INIT_LIST_HEAD(&init_css_set.cg_links); 
    INIT_LIST_HEAD(&init_css_set.tasks); 
    INIT_HLIST_NODE(&init_css_set.hlist); 
    //css_set_count全局变量维护当前系统中css_set结构的数量, 
    //当系统需要创建新的层次结构时,需要将所有任务连接到该层次结构, 
    //此时需要分配的css_set的最大个数为css_set_count个,保存该变量, 
    //使得将所有任务链接到层次结构更加方便,事实上将系统中所有任务关联到 
    //层次结构中只需复制所有的css_set结构(需要一定的修改)并关联到层次结构. 
    css_set_count = 1; 
    //初始化层次结构(rootnode) 
    init_cgroup_root(&rootnode); 
    root_count = 1;//设定系统中层次结构的个数为1 
    //将init_css_set,init_cg_cgrp_link,dumptop(&rootnode.top_cgroup)链接起来 
    //并将init任务关联到init_css_set从而关联到默认层次结构(rootnode)中. 
    init_task.cgroup = &init_css_set; 
    init_css_set_link.cg = &init_css_set; 
    init_css_set_link.cgrp = dumptop; 
    //将init_cg_cgrp_link添加到默认控制组css_sets双向链表中 
    list_add(&init_css_set_link.cgrp_link_list,&rootnode.top_cgroup.css_sets); 
    //将init_cg_cgrp_link添加到init_css_set.cg_links双向链表中 
    //到这里就已经将init任务关联到默认层次结构中了,并属于唯一的控制组rootnode.top_cgroup 
    list_add(&init_css_set_link.cg_link_list,&init_css_set.cg_links); 
    //初始化全局css_set哈希数组,通过和css_set关联的cgroup_subsys_state结构的地址计算其哈希值, 
    //设定该哈希数组是为便于查找满足某些条件的css_set结构,比如在需要创建新的css_set时,查找 
    //是否存在可重用的css_set结构. 
    for(i=0;i<CSS_SET_TABLE_SIZE;i++) 
        INIT_HLIST_HEAD(&css_set_table[i]); 
    //检查子系统参数是否合法,并对需提前初始化的子系统进行初始化. 
    //在系统启动阶段只有内嵌子系统. 
    for(i=0;i<CGROUP_BUILTIN_SUBSYS_COUNT;i++){ 
        str

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • /etc/fstab 详解
      • nginx主主集群
      •  LVS-NAT和LVS-DR模式的实现详解
      •  RHCE考试之磁盘配额
      • 学习笔记:ACL详解
      • suse linux双网卡双网关配置
      •  LVM逻辑卷管理器
      •  Nginx主主负载均衡架构
      • ubuntu学习Mysql

      快速直达

      操作系统导航

      LinuxWindows虚拟机
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1