# 一、问题 cgroup的层级中都有cgroups.procs与tasks,那么它们有什么区别? 例如: ```bash [yz@yz219 yz]$ pwd /sys/fs/cgroup/cpuset/yz [yz@yz219 yz]$ ll …… -rw-rw-r-- 1 yz yz 0 5月 28 17:24 cgroup.procs …… -rw-rw-r-- 1 yz yz 0 5月 28 18:48 tasks ``` # 二、解释 cgroups的控制单位实际上是线程(轻量级进程)。 **cgroup.procs用来控制线程组的,而tasks是控制线程的。** 所以,如果是单线程进程,两种没有区别。 举个例子: 假设有个进程包含以下线程(轻量级进程): - 主线程的LWPID:10000(实际也是线程组ID); - 子线程1的LWPID:10001; - 子线程2的LWPID:10002; ## cgroup.procs 那么,将上述三个线程中的任意一个加入cgroup.procs,则整个线程组的所有线程将被**自动**加入tasks。 即, ```bash [yz@yz219 yz]$ echo 10001 > cgroup.procs [yz@yz219 yz]$ cat cgroup.procs 10000 [yz@yz219 yz]$ cat tasks 10000 10001 10002 ``` 可见,我们只是将一个子线程(10001)加入cgroup.procs,但是其所在的线程组(10000)的所有子线程被自动加入了tasks。 需要注意的是,那么上述操作,会将该资源组的所有子线程从其它组(如果在其它资源组的话)全部移除。 ## tasks 但是如果我们单独将线程加入tasks,那么只会影响该线程(注意:假设没有加入过cgroup.procs)。 ```bash [yz@yz219 yz]$ echo 10001 > tasks [yz@yz219 yz]$ cat cgroup.procs 10000 [yz@yz219 yz]$ cat tasks 10001 ``` 注意:10001被加入tasks时,cgroup.procs会自动加入该线程所在的线程组ID(TGID, 10000)。 我们可以单独将主线程加入tasks,接上例继续执行: ```bash [yz@yz219 yz]$ echo 10000 > tasks [yz@yz219 yz]$ cat cgroup.procs 10000 [yz@yz219 yz]$ cat tasks 10000 10001 ``` # 三、应用 在多线程的应用程序中,如果需要为不同线程指派不同的cgroup组,那么应该将LWPID写入tasks,而不是cgroup.procs。 # 四、参考 - [linux cgroups 概述](https://xiezhenye.com/2013/10/linux-cgroups-%e6%a6%82%e8%bf%b0.html)