cgroup学习(三)——伪文件 && (四)——mount hierarchy
来源:互联网 发布:手机淘宝联盟购买省钱 编辑:程序博客网 时间:2024/06/03 11:36
伪文件
cgroup是通过VFS与上层进行交互的,它定义了自己的cgroup文件系统,同时也定义了哪些文件,这些文件也是最终影响着cgroup行为,这一节我们介绍一下,每个子系统的伪文件定义在哪里?以及内核如何去操作这些伪文件。下面我们通过一张表来展示这些关系:
Subsys
Files
To_css
locate
cpu_cgroup_subsys
cpu_files
task_cgroup
sched.c
cpuset_subsys
Files
cpuset
cpuset.c
mem_cgroup_subsys
mem_cgroup_files
mem_cgroup
memcontrol.c
blkio_subsys
blkio_files
blkio_cgroup
blk_cgroup.c
freezer_subsys
Files
freezer
cgroup_freezer.c
Subsys表示每个子系统的全局静态变量,该变量定义了该子系统的name,在该子系统上create,destroy,fork,attach cgroup(task)时的相应操作,以及populate生成哪些文件等。生成的文件定义在files全局静态变量里,这个变量是一个数组,包括了该子系统的所有子文件,以及它们的读写操作。我们在前一章介绍了cgroup_subsys_state结构,它是每个子系统的控制体的一个抽象类,to_css字段就是每个子系统控制体的实现类,它也保存了该子系统的下的相应参数(伪文件值),可以说该结构才是cgroup最重要的结构,也是真正对group起作用的结构。除了上面各个子系统files定义的文件外,它们公用的files定义在cgroup.c的files[](同样它也定义了对这些文件的open,write,release,read操作),包括最重要的tasks文件,它保存了该cgroup管理的所有tasks,对该文件的write操作最终将调用相应的subsys的attach操作。
知道了这几个变量及结构就可以很快定位到相应操作的代码位置,对于理解后面的每个子系统的实现也是很有帮助。
====================================
cgroup学习(四)——mount hierarchy
该过程对应于mount -t cgroup -o cpu,cpuset cpuandset /cgroup
首先它解析mount参数-o ***:parse_cgroupfs_option,创建一个新的cgroupfs_root:cgroup_root_from_opts,通过cgroup_test_super判断新的mount subsys是否与已有的hierarchy一样(它们的subsys一样或者name一样),如果一样则使用原来的cgroupfs_root;否则使用新的cgroupfs_root,接着把相应的subsys初始化到该root的top_cgroup里(rebind_subsystems);
然后分配css_set_count(当前所有的css_set个数)个cg_cgroup_link,再建立top_cgrop到所有css_set(css_set_table[]里的所有node)的关系(link_css_set):通过刚才创建的cg_cgroup_link建立css_set与cgroup(这里就是top_cgroup)的关系,把cg_cgroup_link的cg指向当前的css_set,cgrp指向当前 cgroup(top_cgroup),然后再把该cg_cgroup_link分别移到该cgroup->css_sets list,及css_set->cg_links的末尾(其实就是cg_cgroup_link->cg与cg_cgroup_link->cgrp构成该结构的主键,而cg_cgroup_link->cgrp_link_list是css_set的索引,cg_cgroup_link->cg_link_list是cgroup的索引):
- hlist_for_each_entry(cg, node, hhead, hlist)
- link_css_set(&tmp_cg_links, cg, root_cgrp);
- static void link_css_set(struct list_head *tmp_cg_links,
- struct css_set *cg, struct cgroup *cgrp)
- {
- struct cg_cgroup_link *link;
- BUG_ON(list_empty(tmp_cg_links));
- link = list_first_entry(tmp_cg_links, struct cg_cgroup_link,
- cgrp_link_list);
- link->cg = cg;
- link->cgrp = cgrp;
- atomic_inc(&cgrp->count);
- list_move(&link->cgrp_link_list, &cgrp->css_sets);
- /*
- * Always add links to the tail of the list so that the list
- * is sorted by order of hierarchy creation
- */
- list_add_tail(&link->cg_link_list, &cg->cg_links);
- }
最后生成该cgroup相应的文件:cgroup_populate_dir(top_cgroup),首先生成基本文件cgroup_add_files;然后生成每个subsys自己的文件:
- for_each_subsys(cgrp->root, ss) {
- if (ss->populate && (err = ss->populate(ss, cgrp)) < 0)
- return err;
- }
- sudo mount -t cgroup -o memory,cpuset mc /cgroup/memory/
- 46144380 8071 (mount) call trace:
- 0xffffffff81054e60 :cpu_cgroup_populate+0x0/0x30 [kernel]
- 0xffffffff810c007a :cgroup_populate_dir+0x7a/0x110 [kernel]
- 0xffffffff810c0cbb : cgroup_get_sb+0x42b/0x520[kernel]
- 0xffffffff8117aa7b :vfs_kern_mount+0x7b/0x1b0 [kernel]
- 0xffffffff8117ac22 :do_kern_mount+0x52/0x130 [kernel]
- 0xffffffff81199302 : do_mount+0x2d2/0x8d0[kernel]
- 0xffffffff81199990 : sys_mount+0x90/0xe0[kernel]
- 0xffffffff8100b0f2 :system_call_fastpath+0x16/0x1b [kernel]
- cgroup学习(三)——伪文件 && (四)——mount hierarchy
- cgroup学习(四)——mount hierarchy
- cgroup学习(四)——mount hierarchy
- cgroup学习(三)——伪文件
- cgroup学习(三)——伪文件
- cgroup的学习(一)——what cgroup?
- cgroup学习(二)——cgroup框架结构
- cgroup学习(五)——create new cgroup
- cgroup学习(二)——cgroup框架结构
- cgroup的学习(一)——what cgroup?
- cgroup学习(五)——create new cgroup
- cgroup的学习(一)——what cgroup? && (二)——cgroup框架结构
- cgroup学习(五)——create new cgroup && (六)——attach task
- linux cgroup代码学习(1)——cgroup介绍
- cgroup学习(六)——attach task
- cgroup学习(七)——cpu子系统
- cgroup学习(八)——CPUSET子系统
- cgroup学习(六)——attach task
- 更改pushViewController和popViewController的动画效果
- 给超链接(a标签)加onclick事件
- linux vi 命令
- C++之旅开启
- AT指令说明
- cgroup学习(三)——伪文件 && (四)——mount hierarchy
- 接收系统广播消息之监听系统开机
- (Pyhton学习10)Python虚拟机中的控制流
- Duilib第一讲:Duilib结构梳理
- 线性表的链接存储结构(单链表)的实现
- 基于B/S模式的嵌入式视频监控系统的设计
- unix 网络 编程 readv writev
- 黑马程序员_IO流——切割文件split
- 由SQL Server的job出错调查引起的思考