linux中core调度器

背景

开始把core调度器当成了linux的主调度器,导致查找网上资料时总觉得对不上,最后从linux的rust文档中明白了,core调度器是为了解决超线程场景下缓存漏洞(如mds、L1HF)而存在的。简单来说就是一个cpu上同时运行两个线程时,线程1预加载到缓存的数据可以被线程2看到。

网上只找到了公开熔断(Meltdown)和幽灵(Spectre)漏洞的代码(可以参考这个:侧信道攻击实践 - 知乎),没找到mds和L1HF的POC代码,不太理解超线程的漏洞具体怎么实现,只能找到非超线程的漏洞原理。

这两种非超线程的漏洞原理是这样:都是刷掉所有缓存,再通过分支预测和缺页异常访问预先加载出一个字节非法地址的数据,将这个数据乘一个cacheline大小,作为地址访问,从而触发缓存把,以这字节数据为index位置的缓存行load上来,由于其它cache都刷掉了,访问速度肯定没这个快。所以只要访问合法的(0~256)*cache_line地址数据,统计触发每个cacheline访问时间中最快的那个index,就能知道最初的数据(cacheline的index)是多少,从而窃取一个字节的数据。

linux解决超线程缓存漏洞的方式是让同一个cpu的多个超线程,在同一时间段内只能跑一个trust组中的多个task。

实现

在支持超线程时,每个超线程存了一个smt_mask (cpu_sibling_map),标记与此超线程相同cpu的其它超线程编号,每个超线程有个runqueues,其中rq->core绑定了leader(同一cpu的第一个编号位置的)超线程的runqueue。

用户可以为几个线程指定相同的cookie值(sched_core_share_pid),从而将它们归为一个trust组,同一时间同一个cpu的超线程上只能跑一个trust组的线程。

core调度器的runqueue是以cookie值为key的红黑树,用于找相同cookie的task。

当同一trust组中task数比一个cpu的超线程数少时,会有一部分超线程强制置为idle状态,运行超线程数与idle超线程数分别用core_forceidle_occupation和core_forceidle_count表示,force idle的超线程可以偷取其它同cpu的force idle超线程的同一trust组的task(sched_core_balance)。

在一个调度周期内,每个超线程都可能触发调度pick 下一个task,但如果没有发生过新的enqueue或dequeue,则不需要重新pick,只需要第一个触发的人pick一次,然后每个超线程用它pick的结果就可以了。这需要维护三个sequence来实现:core->core_task_seq(开始选task时的seq),core->core_pick_seq(成功选出的task时的seq),core_sched_seq(当前超线程的seq)。当一次pick完成时,所有其它超线程在pick时,只需要core_sched_seq赶上leader的core_pick_seq即可,不用重选(有点像简化版本的Paxos协议,但不是多者赢而是先者赢)。

启动入口是 migration_init,要看完整细节可以从这个地方开始看,但与调度相关的函数最重要的是 pick_next_task,另外有sched_core_balance让force idle超线程做任务偷取,sched_core_tick做统计。

pick_next_task

代码为逻辑代码,非真实代码。linux版本:v6.6

pick_next_task():// 其它超线程已经pick过任务,在这个超线程上还没调度过if (rq->core->core_pick_seq == rq->core->core_task_seq &&rq->core->core_pick_seq != rq->core_sched_seq &&rq->core_pick) {put_prev_task(rq, prev);set_next_task(rq, next);goto out}// 从上一个task的级别调度类到最低级别调度类分别调一次balance的hookput_prev_task_balance();// rq->core指向leader的queue, 开始选 taskrq->core->core_task_seq++;// 从同cpu所有超线程选出最高优先级的taskfor_each_cpu_wrap(smt_mask) {rq_i->core_pick = pick_task(rq_i);if (!max || prio_less(max, p, fi_before))max = p;}// 以这个最高优先级task为准,找出其它同cpu超线程上可以跑的同一trust组的task。for_each_cpu(i, smt_mask) {p = sched_core_find(rq_i, cookie);if (p) {rq->core->core_forceidle_occupation++;} else {p = idle_sched_class.pick_task(rq_i);rq->core->core_forceidle_count++;}}// 选task成功rq->core->core_pick_seq = rq->core->core_task_seq;// 标记当前超线程在本轮已经选过了taskrq->core_sched_seq = rq->core->core_pick_seq;// 为有cfs类任务的超线程更新vruntime与forceidle_seq,// 并对需要切任务的超线程触发调度for_each_cpu(smt_mask) {task_vruntime_update(rq_i, rq_i->core_pick, !!rq->core->core_forceidle_count);resched_curr(rq_i);}// 如果有超线程被forceidle了,则在调度时尝试偷一个同cpu其它超线程的同trust组任务执行// 下一个任务与上一个一样,则在__schedule->__balance_callbacks处触发// 下一个任务与上一个不一样,则在切之后finish_task_switch时触发queue_core_balance();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/225305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

翻译: 为什么需要微调大模型 Why Fine-tuning LLM

虽然RAG提供了一种方式来给大型语言模型提供额外的信息,但还有另一种叫做微调(fine-tuning)的技术,也是给它更多信息的一种方式。特别是,如果你有的上下文比大型语言模型的输入长度或上下文窗口长度更大,那…

如何使用ArcGIS Pro拼接影像

为了方便数据的存储和传输,我们在网上获取到的影像一般都是分块的,正式使用之前需要对这些影像进行拼接,这里为大家介绍一下ArcGIS Pro中拼接影像的方法,希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的…

ArcGIS Pro SDK文件选择对话框

文件保存对话框 // 获取默认数据库var gdbPath Project.Current.DefaultGeodatabasePath;//设置文件的保存路径SaveItemDialog saveLayerFileDialog new SaveItemDialog(){Title "Save Layer File",OverwritePrompt true,//获取或设置当同名文件已存在时是否出现…

PPT插件-好用的插件-PPT 素材该怎么积累-大珩助手

PPT 素材该怎么积累? 使用大珩助手中的素材库功能,将Word中的,或系统中的文本文件、图片、其他word文档、pdf,所有见到的好素材,一键收纳。 步骤:选中文件,按住鼠标左键拖到素材库界面中&…

微服务架构之争:Quarkus VS Spring Boot

在容器时代(“Docker时代”),无论如何,Java仍然活着。Java在性能方面一直很有名,主要是因为代码和真实机器之间的抽象层,多平台的成本(一次编写,随处运行——还记得吗?&a…

轻松入门:Python 中的 Scipy 库初探

写在开头 Python在科学计算领域中的强大地位得益于其丰富的库和工具,而Scipy库则是这个生态系统中的一颗璀璨明珠。本文将带你轻松入门Scipy库,深入探索其基本用途和功能。 1.scipy库的简介 Scipy库是Scientific Python的缩写,是建立在Num…

虚拟电厂 能源物联新方向

今年有多热?据上海市气象局官微消息,5月29日13时09分,徐家汇站气温达36.1℃,打破了百年来的当地5月份气温*高纪录。不仅如此,北京、四川、江西、湖南、广东、广西等地也频频发布高温预警。 伴随着居民用电急剧攀升&am…

什么是PSR标准?有哪些常见的PSR标准?

PSR 是 PHP Standard Recommendation(PHP 标准推荐)的缩写,是由 PHP-FIG(PHP Framework Interop Group)组织提出并维护的一系列 PHP 编程规范。这些规范旨在促进 PHP 生态系统中各种项目的互操作性和可维护性。以下是一…

Gitee:远程仓库步骤

第一步:新建仓库 第二步:初始化本地仓库,git init 创建分支 git branch 新分支名 第三步:git add . :添加到暂存区 第四步:git config –global user.email关联邮箱,user.name用户名 第…

LeetCode137. Single Number II

文章目录 一、题目二、题解 一、题目 Given an integer array nums where every element appears three times except for one, which appears exactly once. Find the single element and return it. You must implement a solution with a linear runtime complexity and u…

用python编写九九乘法表

1 问题 我们在学习一门语言的过程中,都会练习到编写九九乘法表这个代码,下面介绍如何编写九九乘法表的流程。 2 方法 (1)打开pycharm集成开发环境,创建一个python文件,并编写第一行代码,主要构建…

WX小程序案例(一):弹幕列表

WXML内容 <!--pages/formCase/formCase.wxml--> <!-- <text>pages/formCase/formCase.wxml</text> --> <view class"bk bkimg"><!-- <image src"/static/imgs/ceeb653ely1g9na2k0k6ug206o06oaa8.gif" mode"scal…

coffee:使用AI构建和迭代React UI速度提高10

该项目的目的不仅仅是一个漂亮的演示&#xff0c;而是一个可以编写生产质量代码并与之交互的人体工学工具。 特征 适用于任何 React 代码库&#xff0c;包括 Next.js、Remix 等。对于大多数标准 UI 组件来说足够可靠支持最简单的 prop 类型&#xff08;数据、回调等&#xff…

使用opencv的Canny算子实现图像边缘检测

1 边缘检测介绍 图像边缘检测技术是图像处理和计算机视觉等领域最基本的问题&#xff0c;也是经典的技术难题之一。如何快速、精确地提取图像边缘信息&#xff0c;一直是国内外的研究热点&#xff0c;同时边缘的检测也是图像处理中的一个难题。早期的经典算法包括边缘算子方法…

【论文阅读】Uncertainty-aware Self-training for Text Classification with Few Label

论文下载 GitHub bib: INPROCEEDINGS{mukherjee-awadallah-2020-ust,title "Uncertainty-aware Self-training for Few-shot Text Classification",author "Subhabrata Mukherjee and Ahmed Hassan Awadallah",booktitle "NeurIPS",yea…

目标检测YOLO实战应用案例100讲-自动驾驶复杂场景下目标检测

目录 前言 研究背景与意义 研究背景 研究意义 国内外研究现状

【Hadoop】WordCount源码分析

MapReduceWordCount单词统计WordCount源码分析参考 MapReduce MapReduce是一种可用于数据处理的编程模型。它的任务过程分为两个处理阶段&#xff1a; map 阶段和 reduce 阶段。每阶段都以 键-值对 作为输入和输出&#xff0c;其类型由我们按需选择。我们还需要写两个函数&…

关于嵌入式开发的一些信息汇总:C标准、芯片架构、编译器、MISRA-C

关于嵌入式开发的一些信息汇总&#xff1a;C标准、芯片架构、编译器、MISRA-C 关于C标准芯片架构是什么&#xff1f;架构对芯片有什么作用&#xff1f;arm架构X86架构mips架构小结 编译器LLVM是什么&#xff1f;前端在干什么&#xff1f;后端在干什么&#xff1f; MISRA C的诞生…

​LeetCode解法汇总1631. 最小体力消耗路径

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 你准备参…

计算机网络中的通信子网主要有哪些功能?

计算机网络中的通信子网主要具有以下功能&#xff1a; 负责全网的数据通信&#xff1a;通信子网通过使用各种通信协议和传输控制功能&#xff0c;能够确保数据从一台主机安全、准确地传输到另一台主机。这包括数据的封装、解封装、传输控制、差错控制等过程。 完成各种网络数据…