Linux源码cgroup_init_early

阅读数:185 评论数:0

跳转到新版页面

分类

Linux

正文

cgroup

实现进程组,分配或限制进程组使用的资源(这部分主要由各个subsystem完成)。

另一个角度,在研究代码的时候,我们更愿意将cgroup理解为一种控制资源的行为。比如:我想控制进程的CPU使用率为20%,那么我可以创建一个cgroup,这个cgroup的作用就是控制指定进程的cpu使用率为20%。

cgroup是有层次结构的,所有的cgroup以树状分层(hierarchy)的形式被组织在一起。

subsystem

cpu subsystem:指定进程组能使用的CPU;
memmory subsystem:指定进程组能使用的内存量,并编写内存使用量报告;
cpuset subsystem:指定进程组能使用的各CPU和节点集;
freezer subsystem:可停止进程组状态或启动;
cpuacct subsystem:对进程组使用的CPU资源编写报告;
blkio:设置对模块设备的输入输出限制;
devices:设置进程组能使用的设备;

数据结构

进程需要与cgroup以subsystem建立联系,关键在于css_set结构体。首先,每个进程都可以对应一个css_set结构体,进程对应一个task_struct结构体,每个task_struct结构体中有一个css_set类型的成员指针cgroups

//Control Groups
#ifdef CONFIG_CGROUPS
/* Control Group info protected by css_set_lock: */
struct css_set __rcu *cgroups;
/* cg_list protected by css_set_lock and tsk->alloc_lock: */
struct list_head cg_list;
#endif

cgroups指针指进程对应的css_set结构体css_set结构体定义在/linux/include/cgroup-defs.h中,每个进程可以有自己的css_set结构体(由进程的.cgroup指向),css_set结构体中有对应的cgroup_subsys_state指针数组,通过cgroup_subsys_state可以找到对应的cgroup_subsys。如此进程与cgroup_subsys的联系就建立了。

所以定义了一个结构体叫做cgrp_cset_link

/*
* A cgroup can be associated with multiple css_sets as different tasks may
* belong to different cgroups on different hierarchies. In the other
* direction, a css_set is naturally associated with multiple cgroups.
* This M:N relationship is represented by the following link structure
* which exists for each association and allows traversing the associations
* from both sides.
*/
struct cgrp_cset_link {
/* the cgroup and css_set this link associates */
struct cgroup *cgrp;
struct css_set *cset;

/* list of cgrp_cset_links anchored at cgrp->cset_links */
struct list_head cset_link;

/* list of cgrp_cset_links anchored at css_set->cgrp_links */
struct list_head cgrp_link;
};

一个cgroup可能关联多个css_sets(即对不同的进程可能使用了相同的控制行为),另一方面,一个css_set通常关联多个cgroup(即对一进程使用多个控制行为)。cgroup和css_set的这种M:N的对应关系可以用struct cgrp_cset_link结构体表示,该结构体用于连接css_set与cgroup的架构。

初始化代码

start_kernel函数中会调用cgroup_init_early函数进行cgroup的初始化。其实对cgroup的初始化分两次,分别是cgroup_init_early和cgroup_init。这么做的原因,系统初始化阶段需要使用一些subsystem,先对这一部分进行初始化。




相关推荐

一、概述 1、为什么Linus不使用GPLv3 在 PC 上,只要你得到了某个程序的源代码,就可以自行编译生成二进制程序,然后替换掉原有的二进制程序,你的程序自由很容易得到保证。然而 iPod、iPh

说明:这种方式只是用于方便阅读代码,因为可以在源代间快速索引跳跃。但是最后可能会有一些warning,可以不必关心,如果是强迫症,可以使用下面这种方式来去掉。

一、概述 在Linux系统中,/usr/bin和/usr/local/bin是两个常见的目录,用于存放可执行文件(二进制文件)。 很多应用都安装在/usr/local下面,先看一下automake工具

  一、概述 vmstat命令是最常见的Linux/Unix监控工具,可以监控给定时间间隔服务器的CPU使用率、内存使用、IO情况。相比top命令,可以查看到整个机器的CPU、内存、IO的使用情况,而

一、概述 sar,System Activity Reporter。是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁

一、简介 简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。 二、使用方法 1、基本语法  awk '条件类型1 {动作1} 条件类型2{动作2} ...

一、概述 列出目标目录中所有的子目录和文件。 二、 语法 ls [选项] [目录名] -a, –all 列出目录下的所有文件,包括以 . 开头的隐含文件 -A 同-a,但不列出“.”(表示当前目录)

一、概述 cd全称是change directory,用于切换当前工作目录。 注意的是,cd命令是一个内建命令,它是由 shell 提供的。因此,不同的 shell 可能会有一些差异,但基本的用法和功

一、概述 全称为print working directory,查看”当前工作目录“的完整路径,一般情况下不带任何参数 二、语法 pwd [选项] -L 即logical,逻辑路径 -P 即

一、概述 通过 mkdir 命令可以实现在指定位置创建以 DirName(指定的文件名)命名的文件夹或目录。要创建文件夹或目录的用户必须对所创建的文件夹的父文件夹具有写权限。并且,所创建的文件夹(目录