1、多线程同步——CPU、core核、线程、内存

news/2024/11/15 13:40:49/文章来源:https://www.cnblogs.com/xixixing/p/18302029

CPU 的运行原理

控制单元在时序脉冲的作用下,将指令计数器里所指向的指令地址(这个地址是在内存里的)送到地址总线上去,然后 CPU 将这个地址里的指令读到指令寄存器进行译码。对于执行指令过程中所需要用到的数据,会将数据地址也送到地址总线,然后 CPU 把数据读到 CPU 的内部存储单元(就是内部寄存器)暂存起来,最后命令运算单元对数据进行处理加工。周而复始,一直这样执行下去。

CPU的缓存

CPU缓存通常分成了三个级别:L1L2L3。级别越小越接近 CPU,所以速度也更快,同时也代表着容量越小。

L1 是最接近 CPU 的, 它容量最小(例如:32K),速度最快。每个核上都有一个 L1 缓存,每个核上其实有两个 L1 缓存, 一个用于存数据的 L1 d-Cache(Data Cache),一个用于存指令的 L1 i-Cache(Instruction Cache)。

L2 缓存 更大一些(例如:256K),速度要慢一些, 一般情况下每个核上都有一个独立的 L2 缓存。

L3 缓存是三级缓存中最大的一级(例如:3MB),同时也是最慢的一级, 在同一个 CPU 插槽之间的核共享一个 L3 缓存。

读取数据过程。就像数据库缓存一样,首先在最快的缓存中找数据,如果缓存没有命中(Cache miss) 则往下一级找, 直到三级缓存都找不到时,向内存要数据。一次次地未命中,代表取数据消耗的时间越长。

计算过程。程序以及数据被加载到主内存;指令和数据被加载到 CPU 的高速缓;CPU 执行指令,把结果写到高速缓存;高速缓存中的数据写回主内存。

 

【参考】

进程、线程与多核、多CPU之间的关系 (qq.com)

 

Core核

一个核心只能同时执行一个线程

线程切换

  • cpu给线程分配时间片(也就是分配给线程的时间),执行完时间片后会切换都另一个线程。
  • 切换之前会保存线程的状态,下次时间片再给这个线程时才能知道当前状态。
  • 从保存线程A的状态再到切换到线程B时,重新加载线程B的状态的这个过程就叫上下文切换。
  • 而上下切换时会消耗大量的cpu时间。

【参考】

认识cpu、核与线程 - jiajun_geek - 博客园 (cnblogs.com)

关于线程上下文切换,你知道多少? (qq.com)  有协程内容

 

重排序与内存可见性

CPU中每个核在执行线程时,都会创建一个本地缓存来保存主内存中的数据。在修改后,再异步写会给主内存。多个线程间对于变量的交互,是通过主内存来进行的。那么这个过程中,就存在一个多个线程间本地缓存同步的问题。比如说,现在对于一个主内存中的变量x=3,线程A将该值修改为x=4,但是,在线程A将数据同步到主内存前,线程B中就读取了数据。那么线程B中就讲讲本该x=4的值读成了x=3,造成了线程间同步的错误。

 【参考】

内存一致性,指令重排序,内存屏障,volatile解析_volatile内存屏障证明-CSDN博客

 

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

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

相关文章

基础语法

单行注释 //加内容 多行注释 /内容/ 文档注释/** * */ 标识符Java中所有的组成部分都需要名字.类名,变量以及方法名都被称为标识符 标识符注意点 1.所有的标识符都应该以字母(A-Z或者a-z),美元符$或者下划线_开始 2.首字符之后可以是以字母(A-Z或者a-z),美元符$,下划线_或者数字…

《痞子衡嵌入式半月刊》 第 104 期

痞子衡嵌入式半月刊: 第 104 期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :《…

[深入理解Java虚拟机]HotSpot虚拟机对象

对象的创建 Java是一门面向对象的编程语言,Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象通常(例外:复制、反序列化)仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎样一个…

将虚拟机跑在ceph之中

目录openStack对接ceph1. cinder对接ceph1.1 ceph创建存储池1.2 ceph授权1.3 下发ceph文件1.4 修改globals文件1.5 部署cinder1.6 创建卷null2. nova对接ceph2.1 创建卷2.2 更新cinder权限2.3 修改globals文件2.4 创建目录2.5 升级nova3. 验证nova3.1 检查存储池3.2 创建虚拟机…

C++使用gnuplot-cpp库绘制图像

最近想要对一些时变的变量进行可视化,搜索来搜索去选择了使用gnuplot这个工具。 sudo apt-get install gnuplot sudo apt-get install gnuplot-x11 # 使其支持linux终端这样就安装完gnuplot了。接着可以在命令行中键入gnuplot命令打开gnuplot的交互式环境。由于这里着目于使用…

分支预测,为什么使用 if/else 语句会降低程序效率

在现代 CPU 架构中,分支预测是为了提高指令执行的效率。然而,如果 if/else 语句的分支走向难以预测,就可能会降低程序效率。这是因为当 CPU 执行到 if/else 语句时,它需要猜测接下来要执行的是 if 分支还是 else 分支。如果 CPU 的预测错误,就需要清空已经预取和执行的部分…

Unraid 连接雷迪司 H1000M UPS 教程

前言 上周六租住的小区更换电表,由于本人未注意贴在楼下的通知,直到断电时往去楼下咨询更换电表的工作人员才知晓通知已经提前一周下达。强制断电对 NAS 的硬盘影响是致命的,于是当机立断购入了雷迪司的这款 NAS 备用电源。选择这款备用电源的原因主要是便宜,Unraid 和 The…

JavaWeb开发基础Servlet简介

Servlet是什么?现在的Java Web开发,很少直接接触到Servlet。在Spring项目中,Spring Boot基于Spring Framework,简化了Spring应用程序开发,Spring Framework是一个全面的Java应用程序框架,其中包含Spring MVC模块,Spring MVC封装了Servlet,以实现Web功能。Servlet不属于…

Pictures

本文来自博客园,作者:haozexu,转载请注明原文链接:https://www.cnblogs.com/haozexu/p/18301944

万字长文:Go 语言流行 ORM 框架 GORM 使用详解

万字长文:Go 语言流行 ORM 框架 GORM 使用详解 原创 江湖十年 Go编程世界 2024年05月18日 08:41 浙江 4人听过GORM 是 Go 语言中最受欢迎的 ORM 库之一,它提供了强大的功能和简洁的 API,让数据库操作变得更加简单和易维护。本文将详细介绍 GORM 的常见用法,包括数据库连接、…

搭建一个javaweb项目的准备流程

搭建一个javaweb项目的准备流程 以所学系统项目为例:1src\main\java\com\utils 1.1tools: DruidTools.java ​ 需要在lib中加入druid-xx-xx.jar包代码展示 package com.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource; import j…