小林Coding阅读笔记:操作系统篇之硬件结构,伪共享问题及CPU的任务执行

news2025/2/7 2:31:11

前言

  1. 参考/导流:
    小林coding - 2.5 CPU 是如何执行任务的?
  2. 学习意义
  • 底层基础知识,了解CPU执行过程,让上层编码有效
  • 并发问题处理、思考理解
  • 调度策略、思想借鉴分析
  1. 相关说明
    该篇博文是个人阅读的重要梳理,仅做简单参考,详细请阅读小林coding的原文!

五、CPU如何执行任务的?

前置知识

  • CPU读数据的过程
  • CacheLine的理解以及CPU存储架构设计

读数据过程

CPU 从内存中读取数据到 Cache 的时候,并不是一个字节一个字节读取,而是一块一块的方式来读取数据的,这一块一块的数据被称为 CPU Cache Line(缓存块),所以 CPU Cache Line 是 CPU 从内存读取数据到 Cache 的单位。
【而这一块是连续地址空间的一块,为什么这样设计呢?因为连续的地址空间,在下次使用到的概念就极大,例如数组遍历;有点预测未来,提前写入缓存,提升效率的思想,对比指令分支预测设计】

  • 对于数组来说,顺序去访问极大提升性能
  • 对于单个变量,例如Int、long一般都是小于CacheLine大小(一般为64字节),则会存在一定的伪共享问题(对于多核来说)

伪共享问题

在这里插入图片描述

根据小林的这图,极其容易理解伪共享。在多核之间去协调缓存一致性(MESI)是根据的CacheLine去标记的【因为CPU从内存的读取单位是CacheLine】,而非细粒度的单个变量。因此,虽然表面上 A、B互不干扰的两个变量,却更好因为 物理上 的连续,又更好 被在不同核心的两个线程 去读取到 CacheLine。那么A线程去修改A变量,会改变Cacheline的[状态],此时B线程再去修改则会导致CacheLine写回内存,在读取。这样来 本来独立的变量 并没有很好利用到 缓存的优势,反而增大了开销。【这样也好理解 为什么叫 共享了】

具体过程

跟着小林的步骤,再过一遍具体过程,回顾一下MESI

①. 最开始变量 A 和 B 都还不在 Cache 里面,假设 1 号核心绑定了线程 A,2 号核心绑定了线程 B,线程 A 只会读写变量 A,线程 B 只会读写变量 B。

②. 1 号核心读取变量 A,由于 CPU 从内存读取数据到 Cache 的单位是 Cache Line,也正好变量 A 和 变量 B 的数据归属于同一个 Cache Line,所以 A 和 B 的数据都会被加载到 Cache,并将此 Cache Line 标记为**「独占」**状态。

③. 接着,2 号核心开始从内存里读取变量 B,同样的也是读取 Cache Line 大小的数据到 Cache 中,此 Cache Line 中的数据也包含了变量 A 和 变量 B【本应该独立的变量不能同时在CacheLine,这也是后续解决的伪共享的突破口】,此时 1 号和 2 号核心的 Cache Line 状态变为「共享」状态。【对于 数组来说是否也存在? ,刚好控制不同数组 连续 在CacheLine范围内】

④. 1 号核心需要修改变量 A,发现此 Cache Line 的状态是「共享」状态,所以先需要通过总线发送消息给 2 号核心,通知 2 号核心把 Cache 中对应的 Cache Line 标记为**「已失效」状态,然后 1 号核心对应的 Cache Line 状态变成「已修改」**状态,并且修改变量 A。

对于修改者会将共享态 → 已修改;而其他共享者则将 共享态→已失效【被其他人修改了,该数据已非最新数据了】

⑤. 之后,2 号核心需要修改变量 B,此时 2 号核心的 Cache 中对应的 Cache Line 是已失效状态,另外由于 1 号核心的 Cache 也有此相同的数据,且状态为「已修改」状态,所以要先把 1 号核心的 Cache 对应的 Cache Line 写回到内存,然后 2 号核心再从内存读取 Cache Line 大小的数据到 Cache 中,最后把变量 B 修改到 2 号核心的 Cache 中,并将状态标记为「已修改」状态。

如何避免

  • 对于C\C++,通过如果在多核(MP)系统里,该宏定义是 __cacheline_aligned
    【Linux内核定义】,也就是 Cache Line 的大小
  • 对于Java,「字节填充 + 继承」

关于Java的避免方式:https://blog.csdn.net/qq_37284798/article/details/126641566

CPU执行任务

在 Linux 内核中,进程和线程都是用 task_struct结构体表示的,区别在于线程的 task_struct 结构体里部分资源是共享了进程已创建的资源,比如内存地址空间、代码段、文件描述符等,所以 Linux 中的线程也被称为轻量级进程,因为线程的 task_struct 相比进程的 task_struct 承载的 资源比较少,因此以「轻」得名。

Linux 内核里的调度器,调度的对象就是 task_struct,接下来我们就把这个数据结构统称为任务

在 Linux 系统中,根据任务的优先级以及响应要求,主要分为两种,其中优先级的数值越小,优先级越高

  • 实时任务,对系统的响应时间要求很高,也就是要尽可能快的执行实时任务,优先级在 0~99 范围内的就算实时任务;
  • 普通任务,响应时间没有很高的要求,优先级在 100~139 范围内都是普通任务级别;

为了更好地执行任务,需要使用调度类进行调度执行。
在这里插入图片描述

  • SCHED_DEADLINE:是按照 deadline 进行调度的,距离当前时间点最近的 deadline 的任务会被优先调度;
  • SCHED_FIFO:对于相同优先级的任务,按先来先服务的原则,但是优先级更高的任务,可以抢占低优先级的任务,也就是优先级高的可以「插队」;
  • SCHED_RR:对于相同优先级的任务,轮流着运行,每个任务都有一定的时间片,当用完时间片的任务会被放到队列尾部,以保证相同优先级任务的公平性,但是高优先级的任务依然可以抢占低优先级的任务;

可以看出实时任务,都是抢占式的,实时任务需要及时性,因此需要抢占式设计。

  • SCHED_NORMAL普通任务使用的调度策略;【
  • SCHED_BATCH后台任务的调度策略,不和终端进行交互,因此在不影响其他需要交互的任务,可以适当降低它的优先级。

而对于普通任务【平时主要的都是该种】来说,公平性最重要,在 Linux 里面,实现了一个基于 CFS 的调度算法,也就是完全公平调度(Completely Fair Scheduling

CFS

基本思想

让分配给每个任务的 CPU 时间是一样,于是它为每个任务安排一个虚拟运行时间 vruntime,如果一个任务在运行,其运行的越久,该任务的 vruntime 自然就会越大,而没有被运行的任务,vruntime 是不会变化的。在 CFS 算法调度的时候,会优先选择 vruntime 少的任务,以保证每个任务的公平性。

对于优先级的设计,则采用 权重 (weight)的方式,去解决。

vruntime += delta_exec(实际执行时间) * NICE_0_LOAD【常量】/ weight

【权重越大,vruntime越小,越容易被调到】

CPU运行队列

一个系统通常都会运行着很多任务,多任务的数量基本都是远超 CPU 核心数量,因此这时候就需要排队

事实上,每个 CPU 都有自己的运行队列(Run Queue, rq,用于描述在此 CPU 上所运行的所有进程,其队列包含三个运行队列,Deadline 运行队列 dl_rq、实时任务运行队列 rt_rq 和 CFS 运行队列 cfs_rq,其中 cfs_rq 是用红黑树来描述的,按 vruntime 大小来排序的【因为实时任务较少,一般来说简单简单队列即可?】,最左侧的叶子节点,就是下次会被调度的任务。

调整优先级

对于普通任务,可以调整任务的 nice值nice 的值能设置的范围是 -20~19, 值越低,表明优先级越高,因此 -20 是最高优先级,19 则是最低优先级,默认优先级是 0。

启动任务的时候,可以指定 nice 的值,比如将 mysqld 以 -3 优先级

nice -n -3 /usr/sbin/mysqld

对于已启动任务

renice -10 -p pid

改变任务的优先级以及调度策略,使得它变成实时任务

chrt -f 1 -p pid

设置为SCHED_FIFO,优先级为1

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

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

相关文章

Transformer实现以及Pytorch源码解读(一)-数据输入篇

目标 以词性标注任务为例子,实现Transformer,并分析实现Pytorch的源码解读。 数据准备 所选的数据为nltk数据工具中的treebank数据集。treebank数据集的样子如以下两幅图所示: 该数据集中解释变量为若干句完整的句子: 被解释变…

Docker-DockerFile制定镜像

什么是DockerFile? DockerFile是一个用来编写Docker镜像的文本文件,文本内容包含了一条条构建镜像所需要的指令和说明。DockerFile就想要一个脚本文件一样。把我们想要执行的操作放到文本文件里,一键执行。这样我们就可以复用这个DockerFile…

读论文:Learning to Compare: Relation Network for Few-Shot Learning

Abstract 我们提出了一个概念上简单、灵活且通用的少镜头学习框架,其中分类器必须学习识别每个只给出少量示例的新类。我们的方法称为关系网络(RN),从头到尾进行训练。在元学习过程中,它学习学习一个深度距离度量来比较插曲中的少量图像&…

RNA-seq 详细教程:时间点分析(14)

学习内容 了解如何使用 DESeq2 进行时间的分析LRT 使用 LRT 进行 Time course 分析尽管基因表达的静态测量很受欢迎,但生物过程的时程捕获对于反映其动态性质至关重要,特别是当模式复杂且不仅仅是上升或下降时。在处理此类数据时,似然比检验 …

doris入门后遇到的几个问题总结

文章目录1. Access denied for user anonymnull (using password: NO)2. timeout when waiting for send fragments RPC. Wait(sec): 5, host: xxx(ip)3. Failed to initialize JNI: Failed to find the library libjvm.so.4. 从mysql库导出的json文件大于100M时报错5. csv格式…

OA办公系统:颠覆企业办公模式,激活组织潜能打造新模式

企业的生命力在于生存,而想要在竞争日益激烈的市场环境下生存,就必须不断革新自己的内部条件,否则将会在发展的洪流中被社会所淘汰。如今社会的发展正在信息化世界中进行,企业搭建信息化平台是一条必经之道,而OA办公自…

太爽了!看酷开系统帮你沉浸式带娃!

现如今,OTT大屏涉及的线上内容与娱乐方式与日俱增,不仅常规的电视节目、网剧影视能够随心选择,还发展出以大屏为载体的短视频、健身、云游戏等丰富内容。在人们的居家生活走向常态化的当下,更长的开机使用时间自然对电视操作系统的…

codeforces:C. Another Array Problem【分类讨论 + 找规律】

目录题目截图题目分析ac code总结题目截图 题目分析 做cf题目别老想着套算法模版 找规律才是正道,这就是所谓的「思维」 n 2很简单 n > 4: # 肯定有一个最大值,不妨设它的位置在第三个或以后的x# 前两个值经过两次操作,都变为0# 第0…

Vue.js 目录结构

当我们初始化一个项目后目录结构是这样的: 目录解析 目录/文件说明build项目构建(webpack)相关代码config配置目录,包括端口号等。我们初学可以使用默认的。node_modulesnpm 加载的项目依赖模块src这里是我们要开发的目录,基本上要做的事情都…

# 关于“table“中更新传参回填form

关于"table"中更新传参回填form 一、id查询数据库回填form 使用阶段:Javaweb/ssm/Springboot出现场景:jsp页面(el表达式)、thymeleaf页面(thymeleaf表达式,具体使用方法请前往百度)…

Python成求职中最吃香的三大编程语言之一

程序员培训公司 CodinGame 发布的一份开发人员调查报告显示,在开发人员招聘中,拥有 JavaScript、Java 和 Python 三大编程语言技能的开发人员最受招聘经理欢迎。 该报告基于对全球近 15,000 名开发人员和人力资源专业人员的调查。报告显示,每…

【IO流】JAVA基础篇(一)

文章目录一、字节流和字符流的区别1、字节和字符换算关系2、字节、位、二进制之间的关系3、在64位的操作系统中,一个字等于多少字节?4、字节流和字符流区别二、InputStream1、FileInputStream2、FilterInputStream3、ObjectInputStream4、PipedInputStre…

玩客云刷ARMBIAN当服务器过程记录

玩客云的可玩性 1、可以刷成电视游戏盒子的双系统。也可以刷成单独的电视盒子和游戏盒子。不过因为内存有限放不了多少游戏。还是建议用外置SD卡存储游戏比较合适。 2、刷成Armbian linux系统(可以实现docker、可道云、甜糖等多种功能) 3、最后它还可…

jsp+ssm计算机毕业设计风景区管理系统【附源码】

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JSPSSM mybatis Maven等等组成,B/S模式 Mave…

生物安全防护实验室建设要点SICOLAB

生物安全实验室(BiosafetyLaboratory),也称生物安全防护实验室(BiosafetyContainmentforLaboratories),是通过防护屏障和管理措施,能够避免或控制被操作的有害生物因子危害,达到生物…

磺丁基醚环糊精盐内水相/桂利嗪/EGF/吲哚美辛-环糊精/黄芩苷β-环糊精包合物脂质体制备

小编今天分享了磺丁基醚环糊精盐内水相/桂利嗪/EGF/吲哚美辛-环糊精/黄芩苷β-环糊精包合物脂质体的研究内容,和小编一起来看! 黄芩苷β-环糊精(β-CD)包合物脂质体: 采用薄膜-超声分散法制备黄芩苷-CD包合物脂质体,并测定脂质体的粒径分布,Zeta电位以及…

灿芯股份冲刺科创板上市:计划募资6亿元,中芯国际、小米为股东

12月19日,灿芯半导体(上海)股份有限公司(下称“灿芯股份”)在上海证券交易所递交招股书,准备在科创板上市。本次冲刺科创板上市,灿芯股份计划募资6亿元,海通证券为其保荐机构。 招股…

赫夫曼树 | 实战演练(二)

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…

高效空气过滤器检漏

广州特耐苏净化设备有限公司详细介绍:高效空气过滤器安装后的检漏 高效空气过滤器安装后的检漏是确认安装质量,检测高效空气过滤器送风口的整个面、过滤器的周边、过滤器外框和安装框架之间的密封处。检漏时,从过滤器的上风侧引入测试气溶胶…

北京理工大学汇编语言复习重点(可打印)

文章目录前言第一章:基础性能指标计算储存器原理第二章:微处理器管理模式CPU工作模式实模式保护模式虚拟8086模式(V86模式)寄存器概述GDTR(Global Descriptor Table Registr)全局描述符表寄存器LDTRIDTRTR内…