二:cgroup中的概念
在深入到cgroup的代码分析之前.先来了解一下cgroup中涉及到的几个概念:
1:cgroup: 它的全称为control group.即一组进程的行为控制.比如,我们限制进程/bin/sh的CPU使用为20%.我们就可以建一个cpu占用为20%的cgroup.然后将/bin/sh进程添加到这个cgroup中.当然,一个cgroup可以有多个进程.
2:subsystem: 它类似于我们在netfilter中的过滤hook.比如上面的CPU占用率就是一个subsystem.简而言之.subsystem就是cgroup中可添加删除的模块.在cgroup架构的封装下为cgroup提供多种行为控制.subsystem在下文中简写成subsys.
3: hierarchy: 它是cgroup的集合.可以把它理解成cgroup的根.cgroup是hierarchy的结点.还是拿上面的例子: 整个cpu占用为100%.这就是根,也就是hierarchy.然后,cgroup A设置cpu占用20%,cgroup B点用50%,cgroup A和cgroup B就是它下面的子层cgroup.
三:cgroup中的重要数据结构
我们先来看cgroup的使用.有三面一个例子:
[root@localhost cgroups]# mount -t cgroup cgroup -o debug /dev/cgroup
[root@localhost cgroups]# mkdir /dev/cgroup/eric_test
如上所示,用debug subsystem做的一个测试. /dev/cgroup是debug subsys的挂载点.也就是我们在上面所分析的hierarchy.然后在hierarchy下又创建了一个名为eric_test的cgroup.
在kernel的源代码中.挂载目录,也就是cgroup的根目录用数据结构struct cgroupfs_root表示.而cgroup用struct cgroup表示.

cgroup的框架,下面来分析cpuset子系统.所谓cpuset,就是在用户空间中操作cgroup文件系统来执行进程与cpu和进程与内存结点之间的绑定.有关cpuset

Cpuset是一个在大系统上常用的功能.这部份涉及到进程调度和内存分配方面的东西,如果对这些周边知识有不了解的地方.可以参阅本站的其它文档.

/* The default css_set - used by init and its children prior to any
* hierarchies being mounted. It contains a pointer to the root state
* for each subsystem. Also used to anchor the list of css_sets. Not
* reference-counted, to improve performance when child cgroups
* haven't been created.
*/
static struct css_set init_css_set;
static struct cg_cgroup_link init_css_set_link;

系统所有的subsystem都在这里:

static struct cgroup_subsys *subsys[] = {
#include <linux/cgroup_subsys.h>
};

cgroup_init_early:初始化init_css_set, init_css_set_link这两个全局结构,设置init进程的cgroups指针,为init_css_set

cgroup_init:调用cgroup_init_subsys初始化subsys数组里所有剩下的的subsystem(没有在cgroup_init_early中初始化的subsys),为init_css_set设置hlist指向的hash list,最后调用register_filesystem注册一个类型为cgroup的伪文件系统,并创建/proc/cgroups。其中cgroup_init会调用cgroup_init_subsys

cgroup_init_subsys:对于每一个subsystem,都要添加到rootnode(系统最高的唯一cgroupfs_root),rootnode保存了一个subsys_list里面是所有subsystem的列表,这些group_subsys互相保存在cgroup_subsys->sibling的列表中。这里出现了一个struct cgroup dummytop,用来表示hierarchy最高层的cgroup。

进程启动时会调用如下三个函数,

cgroup_fork:该函数执行 child->cgroups = current->cgroups,即把父进程指向的css_set 赋值给子进程,同时增加该css_set 的引用计数。

cgroup_fork_callbacks:对于cgroup里的所有subsystem(cgroup_subsys),调用sys->fork(sys, task_struct *)

cgroup_post_fork:更新task_struct->cg_list

进程退出是会调用:

cgroup_exit:如果run_callbacks为1,对于每一个subsystem,调用sys->exit(sys, task_struct* ),把自己从 css_set 的task列表中删除,然后把原来的css_set 结构保存在cg中,把自己的 css_set 设为 init_css_set。最后调用 put_css_set_taskexit (cg),里面判断css_set的引用计数,如果为0就释放掉了。释放的同时,清理掉css_set_table哈希表,cg_cgroup_link里相应项,如果对应的cgroup已经没有进程了,设置一个标志位 CGRP_RELEASABLE

我们注意到了每个subsystem有个need_forkexit_callback标志位,如果cgroup_subsys->fork,cgroup_subsys->exit 任意一个函数指针不为空,该位被置上,因此每次进程fork或者exit的时候,都会调用subsystem相应的fork, exit函数。

另外还有一个dummytop,用于无主的cgroup,比如把某个子系统移除cgroup之后就会把其对应的cgroup更改为dummytop

cgroup的文件系统这里不多说了,请参考这篇文章 http://blog.csdn.net/ustc_dylan/article/details/4030824

其实cgroup的文件系统就是通过文件系统的inode, dentry, file操作函数提供了一个控制的接口,用于设置QoS控制参数,和把进程和cgroup关联起来。每个子系统都会通过cgropu文件系统来关联自己的接口,获取需要控制的进程,从而和cgroup机制完美对接。

 二、dentry与inode
  inode(可理解为ext2 inode)对应于物理磁盘上的具体对象,dentry是一个内存实体,其中的d_inode成员指向对应的inode。也就是说,一个inode可以在运行的时候链接多个dentry,而d_count记录了这个链接的数量。

按照d_count的值,dentry分为以下三种状态:

1、未使用(unused)状态:该dentry对象的引用计数d_count的值为0,但其d_inode指针仍然指向相关的的索引节点。该目录项仍然包含有效的信息,只是当前没有人引用他。这种dentry对象在回收内存时可能会被释放。

2、正在使用(inuse)状态:处于该状态下的dentry对象的引用计数d_count大于0,且其d_inode指向相关的inode对象。这种dentry对象不能被释放。

3、负(negative)状态:与目录项相关的inode对象不复存在(相应的磁盘索引节点可能已经被删除),dentry对象的d_inode指针为NULL。但这种dentry对象仍然保存在dcache中,以便后续对同一文件名的查找能够快速完成。这种dentry对象在回收内存时将首先被释放。
  三、dentry与dentry_cache
  dentry_cache简称dcache,中文名称是目录项高速缓存,是Linux为了提高目录项对象的处理效率而设计的。它主要由两个数据结构组成:

1、哈希链表dentry_hashtable:dcache中的所有dentry对象都通过d_hash指针域链到相应的dentry哈希链表中。

2、未使用的dentry对象链表dentry_unused:dcache中所有处于unused状态和negative状态的dentry对象都通过其d_lru指针域链入dentry_unused链表中。该链表也称为LRU链表。

目录项高速缓存dcache是索引节点缓存icache的主控器(master),也即 dcache中的dentry对象控制着icache中的inode对象的生命期转换。无论何时,只要一个目录项对象存在于dcache中(非 negative状态),则相应的inode就将总是存在,因为 inode的引用计数i_count总是大于0。当dcache中的一个dentry被释放时,针对相应inode对象的iput()方法就会被调用。

CGROUP的更多相关文章

  1. [原] Cgroup CPU, Blkio 测试

    关于Cgroup的简单测试 [toc] 简单介绍Cgroup (如果对cgroup熟悉可以忽略) 一般情况下,cgroup挂载到一个虚拟文件目录,然后可以通过文件系统的API对其操作. ># m ...

  2. Linux CGroup之freezer分析与应用

    Linux Kernel:4.4.17 CGroup的freezer子系统对于成批作业管理系统很有用,可以成批启动/停止任务,以达到及其资源的调度. freezer子系统也有助于针对运行一组任务设置检 ...

  3. Android中基于CGroup的memory子系统HAL层分析-lmkd

    Android在内存管理上于Linux有些小的区别,其中一个就是引入了lowmemorykiller.从lowmemorykiller.c位于drivers/staging/android也可知道,属 ...

  4. Android/Linux下CGroup框架分析及其使用

    1 cgroup介绍 CGroup是control group的简称,它为Linux kernel提供一种任务聚集和划分的机制,可以限制.记录.隔离进程组(process groups)所使用的资源( ...

  5. linux源码分析(四)-start_kernel-cgroup

    前置:这里使用的linux版本是4.8,x86体系. cgroup_init_early(); 聊这个函数就需要先了解cgroup. cgroup概念 这个函数就是初始化cgroup所需要的参数的.c ...

  6. Linux的Cgroup

    为什么要有cgroup Linux系统中经常有个需求就是希望能限制某个或者某些进程的分配资源.也就是能完成一组容器的概念,在这个容器中,有分配好的特定比例的cpu时间,IO时间,可用内存大小等.于是就 ...

  7. linux的cgroup控制

    cgroup:control group-控制群组:将用户(的进程)加入某个群组(又叫控制器controller), 通过 指定群组对资源-cpu 内存 network等的使用,来限制用户对计算机资源 ...

  8. Linux的Cgroup<实例详解>

    为什么要有cgroup Linux系统中经常有个需求就是希望能限制某个或者某些进程的分配资源.也就是能完成一组容器的概念,在这个容器中,有分配好的特定比例的cpu时间,IO时间,可用内存大小等.于是就 ...

  9. linix container & cgroup note

    1,Containers can run instructions native to the core CPU without any special interpretation mechanis ...

随机推荐

  1. http://www.111cn.net/jsp/Jsp-Servlet/45158.htm

    http://www.111cn.net/jsp/Jsp-Servlet/45158.htm

  2. json学习系列(7)JSONBuilder的用法

    JSONBuilder可以向文件中写入写入json字符串.如下面的例子: public class Test { public static void main(String args[]) thro ...

  3. Codeforces Round #208 (Div. 2) B Dima and Text Messages

    #include <iostream> #include <algorithm> #include <string> using namespace std; in ...

  4. COJ968 WZJ的数据结构(负三十二)

    WZJ的数据结构(负三十二) 难度级别:D: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,边上均有权值,每个点上有 ...

  5. HDNOIP201404最短路径

    HDNOIP201404最短路径 难度级别: A: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 a.b.c是3个互不相等的1 ...

  6. GetSystemMetrics()

    GetSystemMetrics()函数的用法 可以用GetSystemMetrics函数可以获取系统分辨率,但这只是其功能之一,GetSystemMetrics函数只有一个参数,称之为「索引」,这个 ...

  7. PHP wget 增强脱裤脚本(PDO MYSQL)

    脚本参考了 LCX Gavin2位前辈的帖子.在此表示非常的感谢. https://www.t00ls.net/thread-26740-1-1.html https://www.t00ls.net/ ...

  8. javascript获取随机rgb颜色和十六进制颜色的方法

    <div id="console">在线交易平台的成功秘诀:从 Ebay 到 Yelp 到 Uber</div> <script type=" ...

  9. discuz怎么根据连接知道调用的是什么模板页面

    其实不怎么难,基本都可以看出discuz是怎么样调用模板页面的 这个是论坛的帖子的列表页,看到url就可以看出是forum目录下的forumdisplay这个模板,forumdisplay.html这 ...

  10. svchost.exe是什么?为什么一直在运行

    原文:http://www.howtogeek.com/howto/windows-vista/what-is-svchostexe-and-why-is-it-running/ 自己简单翻译了下,图 ...