首页 > 编程知识 正文

the personality potion中文概括,CG技术

时间:2023-05-04 21:20:00 阅读:155155 作者:4090

控制组(cgroup )是一种以分组形式管理和控制进程使用系统资源的行为的机制。 也就是说,用户在cgroup中将所有进程分组,并对该组整体进行资源的分配和控制。

1 Cgroup的结构cgroup中的每个组都称为进程组,包含多个进程。 最初,系统中所有进程形成一个进程组(根进程组),根据系统对资源的要求,该根进程组被进一步细分为子进程组,子进程组中的进程是规则的这些子过程组很可能继续被进一步细分,最终形成系统中所有过程组具有层次关系的过程组树。 下图:

由于进程组可以进一步划分,因此一个进程可以属于多个进程组,但这些进程组不必位于同一级别。

此外,如果进程组中的进程创建了子进程,则默认情况下该子进程与父进程位于同一进程组中。 也就是说,通过cgroup控制进程组的资源同样也作用于子进程。

2 subsystem cgroup是过程资源管理与控制的统一框架,提供机制(mechanism ),具体策略(policy )由子系统)完成,子系统由cgroup由过程组完成机制和策略是Linux操作系统中典型的设计思想,机制是“提供什么功能”,策略是“如何实现该功能”。

cgroup中的每个子系统具体代表以下类型的资源:

1 ) cpu子系统)此子系统为每个进程组设置使用cpu的权重值,并管理进程对cpu的访问。

2 ) cpuset子系统)对于多核cpu,此子系统可以设置进程组只在指定的内核上运行,也可以设置进程组在指定的内存节点请求内存。

3 ) cpuacct子系统:此子系统仅用于生成当前进程组中的进程使用cpu的报告。

4 )存储器子系统)该子系统可以提供逐页存储器访问,包括对进程组的存储器使用上限设置,并同时生成存储器资源报告

5 ) blkio子系统:此子系统用于限制每个块设备的输入和输出。 首先,与CPU子系统一样,该系统通过为每个进程组设置权重来控制块设备的输入和输出时间。 子系统还可以限制进程组的I/O带宽和IOPS。

6 ) devices子系统)此子系统允许您限制对进程组设备的访问。 这意味着您可以允许或禁止访问进程组设备。

7 ) freezer子系统)该子系统能够挂起进程组中的所有进程。

8 ) net-cls子系统)该子系统提供对网络带宽的访问限制、例如发射带宽、接收带宽的过程限制。

在实现子系统对所属进程组的资源控制时,实现子系统对应的挂钩函数。 该关系与虚拟文件系统相似,VFS提供了统一的用户界面,具体的文件操作通过文件系统(如ext3 )实现挂接函数。 具体关系如下图所示。

从图中可以看出,cgroup在用户状态下提供统一的用户界面,各子系统对资源的控制功能通过其挂接函数实现。 由此,cgroup在上层是统一的框架,在下层可以控制各种各样的资源。 每个子系统的挂钩函数为以下:

1 struct cgroup _ subsys {2struct cgroup _ subsys _ state * (CSS _ alloc ) ) structcgroup *cgrp; 3int(CSS_online ) ) structcgroup *

cgrp); 4        void(*css_offline)(structcgroup *cgrp); 5        void(*css_free)(structcgroup *cgrp); 6  7        int(*can_attach)(structcgroup *cgrp, structcgroup_taskset *tset); 8        void(*cancel_attach)(structcgroup *cgrp, structcgroup_taskset *tset); 9        void(*attach)(structcgroup *cgrp, structcgroup_taskset *tset); 10        void(*fork)(structtask_struct *task); 11        void(*exit)(structcgroup *cgrp, structcgroup *old_cgrp, 12                     structtask_struct *task); 13        void(*bind)(structcgroup *root); 14        …… …… 15} 3 cgroup文件系统

cgroup在Linux内核中是以文件系统的形式存在的,不过cgroup对应的这种文件系统与proc文件系统类似,都是只存在于内存中的“虚拟”文件系统。既然如此,就可以通过mount命令创建一个cgroup实例。

1$ sudo mount -t cgroup -o memory memory_cgroup /dev/cgroup/

即在/dev/cgroup/下创建了一个memory子系统。接下来就可以通过:

1$ cat /proc/filesystems | grep cgroup

可看到系统有了cgroup类型的文件系统。

当创建了一个cgroup实例后,对应的挂载点下会有一些文件,这些文件是用户与cgroup进行交互的接口。由于cgroup位于VFS层之下,因此用户可以通过统一的文件操作接口去读取或设置子系统的参数,当然也可以直接使用echo或者cat等命令。

参考:

1.Linux内核文档:

https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt


原文链接:http://edsionte.com/techblog/archives/4314

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。