cgroup学习(八)——CPUSET子系统
对于CPUSET子系统我们主要解释对cpuset.cpus的操作。Read操作根据《cgroup学习(三)——伪文件》可以很容易的跟踪到代码,并解读,所以我们这里就不赘述,直接解释write及attach操作。首先我们看一下write操作的bt(使用systemtap见《使用systemtap获得内核函数的局部变量》):
- sudo sh -c "echo 0-3 > cpuset.cpus"
- 13219 (sh) cpuset_change_cpumask call trace:
- 0xffffffff810c2fc0 :cpuset_change_cpumask+0x0/0x20 [kernel]
- 0xffffffff810bfc6b :cgroup_scan_tasks+0x17b/0x270 [kernel]
- 0xffffffff810c4c2c :cpuset_write_resmask+0x17c/0x350 [kernel]
- 0xffffffff810be14f :cgroup_file_write+0x16f/0x320 [kernel]
- 0xffffffff81177e68 :vfs_write+0xb8/0x1a0 [kernel]
- 0xffffffff81178871 : sys_write+0x51/0x90[kernel]
- 0xffffffff8100b0f2 :system_call_fastpath+0x16/0x1b [kernel]
注:cpuset在attach之前要求先设置cpus及mems的值,如果tasks里没有task的话,也不会调用到cpuset_change_cpumask,会在前面返回。
因为代码被优化的原因所有在cpuset_write_resmask与cgroup_scan_tasks之间的update_cpumask及update_tasks_cpumask函数被优化掉了,其中前者主要完成参数的解析,验证(validate_change这个新的值必须是它的parent的子集,并且它的所有children还必须是新值的子集,以及exclusive的排除),然后才将新的值cpumask_copy(cs->cpus_allowed,trialcs->cpus_allowed);最后才更新它下面的所有进程的cpus_allowed(这里只是更新它这级的进程,并没有更新它下级的cgroup里面的进程,因为这些进程由这个子cgroup自己管理,它们也还是新值的一个子集)update_tasks_cpumask(该函数主要初始化一个cgroup_scanner结构,cgroup用它来遍历cgroup管理的每个进程,并定义对每个进程的test及process操作),然后就到了cgroup_scan_tasks函数,它就是扫描cgroup_scanner(即cgroup下的每个进程,使用cgroup_iter_{start,next,end}三个接口),这里使用了一个大顶堆(key为进程的create_time)来缓存需要更新的进程,这样做的原因是:保证在更新的过程中新创建的进程也会被更新到,所以这里有一个goto语句,直到heap->size=0才跳出,这样就可以减少在fork的代码里加锁。最后就是对heap里面的所有进程进行process处理cpuset_change_cpumask,该函数最终就把cgroup的cpus_allowed复制到task->cpus_allowed,并且判断这个进程是否从旧的CPU运行队列,迁移到新的CPUSET的运行队列(该过程由migrate_task完成)。
注:这里用到了cgroup最重要的几结构之间的转换,所以我们再画一张简易的图来表示一下:
cgroup学习(八)——CPUSET子系统相关推荐
- 关于cgroup 学习
一.前言 cgroup在K8S中有重要应用,K8S参考书籍: kubernetes权威指南第5版 公司一个项目用linux 的 cgroup 技术来限制进场cpu和内存使用,具有非常好的学习意义,所以 ...
- 方差 标准差_方差与标准差——杭州市初中数学核心组寒假微课学习八年级第38课...
国家正值非常时期,开学已经推迟,为响应"在推迟开学时段,指导各地各校充分利用'互联网+'的模式共享优质教育资源,开展远程教育教学活动和学生课业辅导,努力实现我市广大中小学校学'停课不停学', ...
- OpenCV与图像处理学习八——图像边缘提取(Canny检测代码)
OpenCV与图像处理学习八--图像边缘提取(Canny检测代码) 一.图像梯度 1.1 梯度 1.2 图像梯度 二.梯度图与梯度算子 2.1模板卷积 2.2 梯度图 2.3 梯度算子 2.3.1 R ...
- PyTorch框架学习八——PyTorch数据读取机制(简述)
PyTorch框架学习八--PyTorch数据读取机制(简述) 一.数据 二.DataLoader与Dataset 1.torch.utils.data.DataLoader 2.torch.util ...
- JMS学习八(ActiveMQ消息持久化)
JMS学习八(ActiveMQ消息持久化) ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,还有一种内存存储的方式,由于内存不属于持久化范畴,而且如果使用内存队列,可 ...
- 推荐系统遇上深度学习(八十七)-[阿里]基于搜索的用户终身行为序列建模
本文介绍的论文是<Search-based User Interest Modeling with Lifelong Sequential Behavior Data for Click-Thr ...
- [Java并发包学习八]深度剖析ConcurrentHashMap
转载----http://qifuguang.me/2015/09/10/[Java并发包学习八]深度剖析ConcurrentHashMap/ HashMap是非线程安全的,并发情况下使用,可能会导致 ...
- C1认证学习八(域名解析)
C1认证学习八(域名解析) 任务背景 为了可以准确的访问某台计算机上的服务,在OSI七层模型中的网络层,通过IP地址进行唯一的标记每一台计算机的位置了啦. 但是由于纯数字难以记忆,所以说,出现了域名使 ...
- IM通讯协议专题学习(八):金蝶随手记团队的Protobuf应用实践(原理篇)
本文由金蝶随手记技术团队丁同舟分享. 1.引言 跟移动端IM中追求数据传输效率.网络流量消耗等需求一样,随手记客户端与服务端交互的过程中,对部分数据的传输大小和效率也有较高的要求,普通的数据格式如 J ...
- linux cgroup学习总结
linux-cgroup使用 大纲 概念 安装与使用 概念 基础知识 cgroups 是Linux内核提供的一种可以限制,隔离单个进程或者多个进程组 (process groups)所使用物理资源的机 ...
最新文章
- 【全文】Libra回应质疑:Facebook将放弃控制权,不与主权货币竞争
- Oracle安装ORA-12154和ORA-12169问题的解决
- Eclipse 报java.lang.OutOfMemoryError: PermGen space
- 计算机网络-RIP协议
- 基于采购订单的MIRO校验过程
- CorelDRAW中将矩形变圆角的方法
- JAVA——基于HttpClient的通过单点登录方式(统一身份认证平台)登录正方教务系统[1999-2020]基本解决方案
- C语言之strstr函数类似Java字符串的contain函数
- mysql时间段以后_mysql时间段查询
- 去大公司和小公司实习对比
- (十七)Java springcloud B2B2C o2o多用户商城 springcloud架构-消息驱动 Spring Cloud Stream...
- 离别海润光伏:杨怀进的“轮回怪圈”
- js插件编写常用工具函数及格式
- 【数据库实验】《小型MIS的开发》PyQt5 开发 民航票务管理系统
- github 搜索_如何通过GitHub快速的搜索资源?
- 贺利坚老师汇编课程46笔记:操作符offset取得标号的偏移地址
- crc可以检出奇数个错误_计算机网络学习笔记 3.3 差错控制
- 电力电子技术复习笔记1(简要版)
- 苹果手机设置信任软件
- JavaScript之切换背景图片(并使)背景栏保持和背景色调相似