当前位置: 首页 > news >正文

【Java 并发编程】(三) 从CPU缓存开始聊 volatile 底层原理

并发编程

三大问题

  • 在并发编程中,原子性、有序性和可见性是三个重要的问题,解决这三个问题是保证多线程程序正确性的基础。
  • 原子性: 指的是一个操作不可分割, 要么全部执行完成, 要么不执行, 不存在执行一部分的情况.
  • 有序性: 有序性是指程序的执行顺序与程序中代码的顺序一致。在多线程环境下,由于线程的交替执行和指令重排等因素,可能会导致代码的执行顺序与预期不一致
  • 可见性: 可见性是指当一个线程修改了共享变量的值时,其他线程能够立即看到这个修改。在多核处理器和多级缓存系统中,线程对共享变量的修改可能被缓存到CPU的本地缓存中,而其他CPU上的线程无法立即看到这个修改,从而导致数据不一致的问题。
  • 原子性问题, 可以用 synchronized 关键字解决, JDK 也提供了 ReentrantLock 等机制, 也能解决;
  • 有序性和可见性, 可以由 volatile 解决;

原子性问题, 就不多说了, 下面重点介绍一下如何解决有序性和可见性问题;

HappensBefore原则

  • 它是一种顺序保证,确保在并发环境下的有序性和可见性;
  • 例如, 该规则规定同一个线程内的每个操作, 都 happens-before 于该线程中的任意后续操作;
  • 例如, 一个监视器锁上一次的解锁操作, happens-before于下一次的加锁操作;
  • 例如, 如果线程A调用线程B的start()方法来启动线程B,则start()操作Happens-Before于线程B中的任意操作。
  • 如果 A happens before B, 那么 A 应该在 B 之前执行, 且 A 的结果应该对 B 可见;

原则固然好, 问题是怎么实现呢? 主要就是 synchronized + volatile, synchronized已经介绍过, 这里介绍 volatile, 让我们先从缓存开始说起;

缓存行

  • 现代计算机为了缓和 CPU 速度和内存速度之间的差异, 会在内存与CPU之间设置多级缓存, 缓存的速度比内存快;

  • 当 CPU 读缓存未命中时, 会从内存读取数据并放入到缓存中, 以后就可以直接从缓存中读取, 提高了速度;

  • 从内存往 CPU Cache 读的时候, 根据程序局部性原理, 会按块(在缓存里也叫缓存行)读取, 大小为64B;

  • 如果你有一个特别热点的变量, 那应该让他尽量独占一个缓存行, 怎么做? 在前后填充无意义数据, 前后都填充 7 * 8B, 这样就保证热点变量一定独占一个缓存行;

  • 现在 CPU 一般都是多核的, 每个核相当于一个独立的 CPU;

  • 现在的 CPU 缓存一般是三级缓存, 一二级在 CPU 核心内部, 三级共享;

在这里插入图片描述

  • 补充: 超线程

    一个CPU内有一套ALU计算单元, 两套程序计数器PC和寄存器, 这样就可以同时保存两个线程的上下文, 切换时只需要让ALU切换一下数据来源即可;

    这样提高了线程切换效率, 8核16线程就是这么来的;

英特尔X86 - MESI

  • 每个CPU内核有自己的 cache, 为了解决不同 CPU内核的 Cache 之间以及 Cache 与主存之间的一致性问题, 引入了串行总线 + MESI协议的解决方式;

  • 将 Cache 中缓存的数据分为四种状态;

    1. **Exclusive(E):**当某个缓存数据仅存在于一个CPU核内, 并且与内存中的值一致时, 该缓存行的状态为 Exclusive。
    2. Modified(M): 在E的基础上, 如果内核修改了缓存, 使得与内存不一致, 该缓存行的状态为 Modified;
    3. Shared(S): 当一个缓存行被多个CPU内核缓存,并且缓存中的数据与内存中的数据一致时,该缓存行的状态为 Shared;
    4. Invalid(I): 在S的基础上, 某个内核修改自己的缓存时, 其它内核的缓存将被失效, 状态变为 Invalid
  • 举例

    1. CPU0 读变量a, a 从主存缓存到CPU0, 状态为 E;

    2. CPU0 写变量a, 缓存状态改为 M;

    3. CPU1 读变量a, 发现 CPU0 有变量a的缓存, 那么拿到自己的缓存里来, 并将缓存的最新值写入内存, 缓存的状态变为S, CPU0和1现在都有a的缓存, 且状态都是 S;

    4. CPU0 再次修改a, 这会将 CPU1 的缓存失效, 状态改为 I; 并将最新值写入内存, CPU0自己的缓存状态改为 E;

  • 当CPU内核去查询其它CPU内核是否有相同缓存, 以及通知其它CPU缓存失效等操作时, 为了避免这些操作发生混乱, 总线是串行的;

  • 补充: 如果数据非常大, 一个缓存行放不下, 怎么保证一致性? 直接到内存中访问, 并且访问时锁总线;

store buffer & invalidate queue

  • 因为总线是串行的, 所以效率较低, 为此引入了store bufferinvalidate queue; 以下简称 SB 和 IQ;

  • 每个 CPU 都有自己 SB 和 IQ ;

  • 前面讲过, 当一个 CPU 要读某个数据时, 会向其它 CPU 查询是否有该数据的缓存, 如果有, 拿过来, 如果没有, 去内存拿; 这个过程是锁总线的, 是串行的, 过程中所有 CPU 都不能使用总线;

  • 当一个 CPU 要失效其它 CPU 中的数据时也是一样, 其它 CPU 要等待通知, 然后失效对应的缓存, 这个过程中不能去使用总线;

  • 现在引入 SB 后, 当 CPU 要读取数据时, 由 SB 与其它 CPU 交互, 得到的结果暂存到 SB 中, CPU 此时可以去执行其它指令;

  • IQ 也是一样, 当有失效通知到来时, 先缓存到 IQ 中, CPU再异步地进行处理;

指令重排

指令重排通常出现在以下两个阶段:

编译器优化阶段:编译器在生成字节码或机器码时,为了提高执行效率,可能会对源代码中的指令进行重新排序。例如,编译器可能会将没有依赖关系的指令提前执行,以充分利用 CPU 的流水线能力。

处理器优化阶段:处理器为了最大化硬件资源的利用率,可能会在执行指令时重新调整指令的顺序。例如,在处理器的流水线中,如果某个指令的执行依赖于之前指令的结果,而该结果尚未准备好,处理器可能会先执行其他指令。

比如 SB 和 IQ 的引入, 就会导致修改不能立即可见以及指令重排的问题;

// 假设一开始 flag 值为true, 在线程 1 和线程 2都有缓存;
// 线程1先执行, 这将导致线程2的缓存失效, 但是因为invalidQueue, 线程2并不会立即收到这一信息;
{flag = false;
}// 线程二可能还没来得及处理IQ中的失效通知, 导致还是能通过 if 判断;
if(flag){// 导致还能进来;i++;
}// 明明我先把一个值改为 false 了, 其它线程却还是判断为 true, 这就发生了不可见;
// 本来应该 flag = false 然后 i++ 不执行, 现在却变成了相当于线程二先通过判断并执行 i++, 线程一再 flag = false
// 这就发生了指令重排;

指令重排问题举例: new对象

一次完整的 new 对象并执行构造方法的过程, 其字节码如下

new #2 <T>
dup
invokespecial #3 <T.<init>>
astore_1
return
  • new 分配空间, 并将该引用压到操作数栈; 分配以后所有成员都是默认值;

    分配空间的时候有两种方式: 指针碰撞和空闲链表;

    首先, 不考虑逃逸分析的话, 新对象的创建都在堆上;

    Eden 区放得下, 就在 Eden 区分配; 如果是超大对象, 还有可能直接在老年代分配;

    指针碰撞: 用一个指针指向当前空闲区域的起始位置;

    适用于不会产生碎片的垃圾回收算法, 比如 Parallel Scavenge, 基于复制算法; 所以, 新生代上 new 对象, 一般适用指针碰撞;

    空闲链表: 维护空闲链表, 每个元素对应一个空闲块; 适用于会产生碎片的垃圾回收算法; 比如CMS;

    如何解决多线程同时分配内存的安全问题?

    可以用 CAS;

    可以用 TLAB; 每个线程初始化的时候, 分配一个 在分配内存权限上私有的 一块Buffer; 满了再申请; 分配是私有的, 访问不是;

  • dup 将栈顶的值复制一份再次入栈;

  • invokespecial 弹出栈顶, 作为 this 传给构造方法;

  • astore, 将弹出栈顶, 保存到当前方法的局部变量表中;

  • return, 返回;

  • 由于指令重排, 有可能还没调用构造方法, 就放到局部变量表里了, 这时候去使用它, 用的是一个没有经过构造方法初始化的对象, 很危险;

指令重排问题举例: 单例模式

如何做一个线程安全的懒加载单例类? 大多数人的回答是DCL, 即 double check lock

private static singleton;
public static Singleton get(){// 外层的if 保证效率, 已经创建了单例对象的时候不会进入synchronized;if(singleton == null){synchronized(Singleton.class){// 内层保证多线程安全if(singleton == null)singleton = new Singleton();else{return singleton;}}}else{return singleton;}
}
  • 正确的回答要在 DCL 的基础上, 给 singleton 引用加 volatile, 如果不加volatile, DCL也没用

    private volatile static singleton;
    
  • 因为new对象是个过程, 假设没有加volatile, 因为指令重排, 使得astore指令在 invokespecial 指令前执行; 那么线程一 new 对象 new 到一半, 所有成员还是默认值的情况下, 就把引用保存了, 这时如果线程2到来, 进行外层判断, singleton != null, 会直接把这个没有执行invokespecial的对象返回;

  • 如果是一个初值为1000的账户, 那现在初始金额只有0;

volatile 如何解决可见性与有序性问题?

  1. 在源码中加volatile关键字, 编译为 class 文件后, 对应 ACC_VOLATILE 指令;

  2. CPU 提供了内存屏障指令, 上层应用可以在合适的地方添加内存屏障指令来避免指令重排;

    JVM 会自动对 volatile 变量的读写操作添加对应的内存屏障;

    比如对 volatile 修饰的变量 x 进行写操作:

    JVM 自动在写操作之前加 StoreStore 屏障, 表示前面的对普通变量的写操作完成, 当前的写操作才能执行;

    后面加 StoreLoad, 表示当前的写操作执行完了, 后面对普通变量的读操作才能执行;

  3. 读写屏障在底层使用 lock 汇编指令, 通过对总线或者缓存行加锁的方式, 禁用 SB 和 IQ, 将对缓存的修改强制立即写入主存, 进而解决了可见性和有序性问题;

  4. 需要注意, volatile 并不保证原子性; 不过, 在一些场景下, 比如 CAS 操作一个变量, 通过 CAS 和 volatile 是可以同时解决三大问题的, 性能比synchronized 要好;

相关文章:

【Java 并发编程】(三) 从CPU缓存开始聊 volatile 底层原理

并发编程 三大问题 在并发编程中&#xff0c;原子性、有序性和可见性是三个重要的问题&#xff0c;解决这三个问题是保证多线程程序正确性的基础。原子性: 指的是一个操作不可分割, 要么全部执行完成, 要么不执行, 不存在执行一部分的情况.有序性: 有序性是指程序的执行顺序与…...

YOLOV8网络结构|搞懂Backbone-Conv

参数量计算: (输入通道*w)*(输出通道*w)*k^2+(输出通道*w)*2 w是模型缩放里面的width - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2 输出通道c2=64,k=3,s=2 P1/2 特征图变小一半 先定义算子层 再搭一个forward前向传播 class Conv(nn.Module):"""Standard convo…...

Elasticsearch Nested类型详解与实战

Elasticsearch&#xff08;简称ES&#xff09;是一个基于Lucene的全文搜索引擎&#xff0c;它提供了强大的搜索能力以及对数据的高效索引和查询。在ES中&#xff0c;数据通常以JSON格式存储&#xff0c;并且可以采用多种数据类型。其中&#xff0c;nested类型是一种特殊的对象数…...

网络编程,网络协议,UDP协议

网络&#xff1a; 1.协议&#xff1a;通信双方约定的一套标准 2.国际网络通信协议标准&#xff1a; 1.OSI协议&#xff1a; 应用层 发送的数据内容 表示层 数据是否加密 会话层 是否建立会话连接 传输层 …...

每日一题——第六十三题

题目&#xff1a;判断一个数是否为合数 #include <stdio.h> #include <stdbool.h> // 为了使用bool类型 // 函数声明&#xff0c;用于判断是否为合数 bool isComposite(int x); int main() { int x; printf("请输入一个正整数: "); scanf(&quo…...

人工智能算法,图像识别技术;基于大语言模型的跨境商品识别与问答系统;图像识别

目录 一 .研究背景 二,大语言模型介绍 三,数据采集与预处理 商品识别算法 四. 跨境商品问答系统设计 五.需要源码联系 一 .研究背景 在当今全球化的背景下&#xff0c;跨境电商行业迅速发展&#xff0c;为消费者提供了更广泛的购物选择和更便利的购物方式。然而&#xf…...

数据库系统 第18节 数据库安全

数据库安全是确保数据库管理系统&#xff08;DBMS&#xff09;中存储的数据的保密性、完整性和可用性的过程。以下是一些关键的数据库安全措施&#xff1a; 用户身份验证&#xff08;Authentication&#xff09;&#xff1a; 这是确定用户或系统是否有权访问数据库的第一步。通…...

Golang | Leetcode Golang题解之第338题比特位计数

题目&#xff1a; 题解&#xff1a; func countBits(n int) []int {bits : make([]int, n1)for i : 1; i < n; i {bits[i] bits[i&(i-1)] 1}return bits }...

【Python变量简析】

Python变量简析 在 Python 中&#xff0c;变量是用于存储和操作数据的命名内存位置。变量的概念类似于代数中的方程变量&#xff0c;比如对于方程式 y x * x &#xff0c;x 就是变量。 Python 变量具有以下特点&#xff1a; 变量名可以由字母、数字和下划线组成&#xff0c…...

智慧零售模式下物流优化与开源AI智能名片S2B2C商城系统的深度融合

摘要&#xff1a;在数字化浪潮的推动下&#xff0c;智慧零售模式正逐步成为零售业的新常态。该模式通过深度融合物联网、大数据、人工智能等先进技术&#xff0c;实现了线上线下无缝衔接&#xff0c;为消费者提供了更加便捷、个性化的购物体验。物流作为智慧零售的重要支撑&…...

socket和websocket 有什么区别

Socket 和 WebSocket 都用于网络通信&#xff0c;但它们的用途、协议、以及使用方式有所不同。以下是两者的主要区别&#xff1a; ### 1. **基础协议** - **Socket**: - Socket 是网络通信的一个抽象概念&#xff0c;通常基于传输层协议&#xff0c;如 TCP&#xff08…...

亿玛科技:TiDB 6.1.5 升级到 7.5.1 经验分享

作者&#xff1a; foxchan 原文来源&#xff1a; https://tidb.net/blog/6e628afd 为什么要升级&#xff1f; 本次升级7.5的目的如下&#xff1a; 1、tidb有太多的分区表需要归档整理。7.5版本这个功能GA了。 2、之前集群tikv节点的region迁移过慢&#xff0c;影响tikv节…...

8.16-ansible的应用

ansible ansible是基于模块工作的&#xff0c;本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块&#xff0c;ansible只是提供一种框架。 格式 ansible 主机ip|域名|组名|别名 -m ping|copy|... 参数 1.ping模块 m0 # 查看有没有安装epel ​ [rootm0 ~]#…...

相似度计算方法-编辑距离 (Edit Distance)

定义 编辑距离&#xff08;Edit Distance&#xff09;&#xff0c;也称为Levenshtein距离&#xff0c;是一种衡量两个字符串相似度的方法。它定义为从一个字符串转换为另一个字符串所需的最少单字符编辑操作次数&#xff0c;这些操作包括插入、删除或替换一个字符。 计算方法 …...

初识FPGA

大学的时候有一门verilog语言&#xff0c;觉得很难&#xff0c;不愿学。有学习套件是黑金的一块FPGA开发板&#xff0c;可能当时点灯和点数码管了。全都忘了。 今项目需要&#xff0c;使用FPGA中的ZYNQ&#xff0c;需要c语言开发&#xff0c;随即开始学习相关知识。 ZYNQ内部…...

探索 JavaScript:从入门到精通

目录 1. JavaScript 的介绍与基础 示例&#xff1a;弹出欢迎信息 JavaScript&#xff0c;作为网络时代最流行的脚本语言之一&#xff0c;赋予了网页生动活泼的动态功能。无论是新手还是经验丰富的开发者&#xff0c;掌握 JavaScript 的核心概念和技能都是开启网络编程之门的钥…...

这4款视频压缩软件堪称是压缩界的神器!

视频在我们的日常设备当中会占用相对较多的空间&#xff0c;尤其是喜欢用视频记录的朋友。但是过多过大的视频不仅会给我们的设备带来了压力&#xff0c;也不利于分享和管理。今天我就要给大家分享几个视频压缩的小妙招。 1、福昕压缩 直通车&#xff1a;www.foxitsoftware.cn…...

【ARM 芯片 安全与攻击 5.6 -- 侧信道与隐蔽信道的区别】

文章目录 侧信道与隐蔽信道的区别侧信道攻击(Side-channel Attack)侧信道攻击简介侧信道攻击 使用方法侧信道攻击示例隐蔽信道(Covert Channel)隐蔽信道简介隐蔽信道使用方法隐蔽信道代码示例侧信道与隐蔽信道在芯片及系统安全方面的使用侧信道的应用隐蔽信道的应用Summary…...

C#:Bitmap类使用方法—第4讲

大家好&#xff0c;今天接着上一篇文章继续讲。 下面是今天的方法&#xff1a; &#xff08;1&#xff09;Bitmap.MakeTransparent 方法&#xff1a;使此 Bitmap的默认透明颜色透明。 private void MakeTransparent_Example1(PaintEventArgs e) { // Create a Bitmap object…...

Vue是如何实现nextTick的?

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏和关注。个人知乎 Vue.js 的 nextTick 函数是一个非常重要的功能&#xff0c;它用于延迟执行代码块到下次 DOM 更新循环之后。这在 Vue.js 的异步更新队列机制中非常有用&#xff0c;尤其是在你需要基于更新后的 DOM 来…...

rabbitmq镜像集群搭建

用到的ip地址 ip地址端口192.168.101.65&#xff08;主&#xff09;15672192.168.101.7515672192.168.101.8515672 安装erlang和rabbitmq 安装 安装三个包 yum install esl-erlang_23.0-1_centos_7_amd64.rpm -y yum install esl-erlang-compat-18.1-1.noarch.rpm -y rpm -…...

《c++并发编程实战》 笔记

《c并发编程实战》 笔记 1、你好&#xff0c;C的并发世界为什么要使用并发 第2章 线程管理2.1.1 启动线程2.2 向线程函数传递参数2.5 识别线程 第3章 线程间共享数据3.2.1 C中使用互斥量避免死锁的进阶指导保护共享数据的替代设施 第4章 同步并发操作4.1 等待一个事件或其他条件…...

57qi5rW35LqRZUhS pc.mob SQL注入漏洞复现

0x01 产品简介 57qi5rW35LqRZUhS是大中型企业广泛采用人力资源管理系统。某云是国内顶尖的HR软件供应商,是新一代eHR系统的领导者。 0x02 漏洞概述 57qi5rW35LqRZUhS pc.mob 接口存在SQL注入漏洞,未经身份验证的远程攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息(例…...

微信小程序--27(自定义组件4)

一、父子组件之间通信的3种方式 1、属性绑定 用于父组件向子组件的只当属性设置数据&#xff0c;但只能设置JSON兼容的数据 2、事件绑定 用于子组件向父组件传递数据&#xff0c;可以传递任意数据 3、获取组件实例 父组件还可以通过this.select Component()获取子组件的实…...

Linux | Linux进程万字全解:内核原理、进程状态转换、优先级调度策略与环境变量

目录 1、从计算机组成原理到冯诺依曼架构 计算机系统的组成 冯诺依曼体系 思考&#xff1a;为什么计算机不能直接设计为 输入设备-CPU运算-输出设备 的结构&#xff1f; 2、操作系统(Operator System) 概念 设计OS的目的 描述和组织被管理对象 3、进程 基本概念 进程id和父进程…...

VBA技术资料MF184:图片导入Word添加说明文字设置格式

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…...

在函数设计中应用单一职责原则:函数分解与职责分离

在函数设计中应用单一职责原则&#xff1a;函数分解与职责分离 引言 单一职责原则&#xff08;Single Responsibility Principle, SRP&#xff09;是面向对象设计原则中的核心原则之一&#xff0c;强调一个类或函数应该只有一个责任或理由去改变。在函数设计中&#xff0c;应…...

多线程锁机制面试

目录 乐观锁的底层原理 ReentrantLock的实现原理 读写锁 ReentrantReadWriteLock synchronized 底层原理 Lock和synchronized的区别 乐观锁的底层原理 版本号机制 在数据库表中添加一个版本号字段&#xff08;如 version&#xff09;&#xff0c;每次更新数据时都会将版本号…...

《SQL 中计算地理坐标两点间距离的魔法》

在当今数字化的世界中&#xff0c;地理数据的处理和分析变得越来越重要。当我们面对一个包含地理坐标数据的表时&#xff0c;经常会遇到需要计算两点之间距离的需求。无论是在物流配送路线规划、地理信息系统应用&#xff0c;还是在基于位置的服务开发中&#xff0c;准确计算两…...

微服务可用性设计

一、隔离 对系统或资源进行分割&#xff0c;实现当系统发生故障时能限定传播范围和影响范围。进一步的&#xff0c;通过隔离能够降低系统之间得耦合度&#xff0c;使得系统更容易维护和扩展。某些业务场景下合理使用隔离技巧也能提高整个业务的性能。我理解隔离本质就是一种解…...

【扒代码】dave readme文档翻译

jerpelhan/DAVE (github.com) 摘要 低样本计数器估算选定类别对象的数量&#xff0c;即使在图像中只有少量或没有标注样本的情况下。目前最先进的技术通过对象位置密度图的总和来估算总数量&#xff0c;但这种方法无法提供单个对象的位置和大小&#xff0c;这对于许多应用来说…...

c语言---文件

这一节我准备分三个部分来带领大家了解文件 ——一、有关文件的基础知识 ————二、文件的简单操作 ————————三、文件结束的判定 ————————————四、文件缓冲区 一、文件的基础知识&#xff1a; 首先在了解文件之前&#xff0c;我们需要了解C/C程序内存…...

Windows系统下Go安装与使用

step1&#xff1a; 下载go语言SDK 下载地址&#xff1a;https://go.dev/dl/ 下载后选择合适位置安装即可&#xff0c;我选择D盘 在安装完成后&#xff0c;可以通过go env 命令检测是否安装成功。在“命令提示符”界面输入“go env”命令&#xff0c;如果显示如下类似结果则说明…...

day24-测试之接口测试基础

目录 一、接口的定义 二、接口的优点 三、API接口 四、接口测试流程 五、网络基础概念 六、HTTP和RURL 七、get和post请求 八、数据格式 九、状态码 十、restful风格 十一、接口工具 一、接口的定义 程序之间协作所要遵循的一套规范、标准 二、接口的优点 2.1.责任…...

TSN 交换机

TSN&#xff08;Time-Sensitive Networking&#xff09;交换机是一种支持时间敏感网络协议的网络交换设备&#xff0c;用于在以太网网络中实现低延迟、高确定性的数据传输。TSN 是一组 IEEE 802 标准的集合&#xff0c;旨在通过标准化的方式&#xff0c;将传统的以太网扩展到需…...

针对thinkphp站点的漏洞挖掘和经验分享

0x1 前言 浅谈 目前在学习和研究thinkphp相关漏洞的打法&#xff0c;然后最近对于thinkphp资产的收集方面有了一个简单的认识&#xff0c;然后写一篇新手看的thinkphp相关的漏洞收集和挖掘的文章来分享下。然后后面是给师傅们分享下后台文件上传&#xff0c;然后直接打一个ge…...

MySQL数据库入门,pycharm连接数据库—详细讲解

一.安装MySQL 1.常用MySQL5.7&#xff0c;首先安装MySQL&#xff0c; &#xff08;一&#xff09; &#xff08;二&#xff09; &#xff08;三&#xff09; &#xff08;四&#xff09; &#xff08;五&#xff09; 2.配置环境变量 打开MySQL安装路径&#xff0c;在其中找到…...

.bat文件快速运行vue项目

如何使用bat文件快速运行vue项目&#xff1f; 新建个文件&#xff0c;改名为serve.bat。 在文件中写入以下内容&#xff1a; # cd 项目路径 cd D:\projects\xxx npm run serve pausecd 项目所在的路径 npm run dev/serve &#xff0c;取决于项目的启动方法&#xff0c;打…...

数据结构(邓俊辉)学习笔记】优先级队列 07——堆排序

1.算法 作为完全二叉堆的一个应用&#xff0c;这节来介绍堆排序算法。 是的&#xff0c;谈到优先级队列&#xff0c;我们很自然地就会联想到排序。因为就其功能而言&#xff0c;包括完全二叉堆在内的任何一种优先级队列都天生地具有选取功能&#xff0c;也就是选取其中的最大…...

npm install pnpm -g 报错的解决方法

npm install pnpm -g 报错的解决方法 npm error code ETIMEDOUT npm error errno ETIMEDOUT npm error network request to https://registry.npmjs.org/pnpm failed, reason: npm error network This is a problem related to network connectivity. npm error network In mo…...

集师知识付费小程序开发

智慧生活&#xff0c;从选择一款优质知识付费小程序起航 在这个信息爆炸的时代&#xff0c;知识成为了最宝贵的财富。我们渴望不断学习&#xff0c;提升自我&#xff0c;追求更高品质的生活。而一款优质的知识付费小程序&#xff0c;就如同照亮前行道路的明灯。 它是知识的宝库…...

前端开发提效工具——用户自定义代码片段

做开发总是会有大量的代码要写&#xff0c;但是有时候某些代码是非常基础但是很多&#xff0c;我们就可以把这一部分整合起来&#xff0c;使用一个很简短的关键字来快速唤出。 如何新建这样的代码段&#xff1f; 1.在VSCode当中找到Snippets&#xff0c;然后点击 2.之后会弹出…...

docker容器安全加固参考建议——筑梦之路

这里主要是rootless的方案。 在以 root 用户身份运行 Docker 会带来一些潜在的危害和安全风险&#xff0c;这些风险包括&#xff1a; 容器逃逸&#xff1a;如果一个容器以 root 权限运行&#xff0c;并且它包含了漏洞或者被攻击者滥用&#xff0c;那么攻击者可能会成功逃出容器…...

基于 Appium 的 App 爬取实战

除了运行 Appium 的基本条件外&#xff0c;还要一个日志输出库 安装&#xff1a; pip install loguru 思路分析 首先我们观察一下整个 app5 的交互流程&#xff0c;其首页分条显示了电影数据&#xff0c; 每个电影条目都包括封面&#xff0c;标题&#xff0c; 类别和评分 4…...

nvm与node安装

参考&#xff1a; 一文搞定NVM安装所有问题NVM UI解决nodejs下载慢问题 node_mirror: http://npmmirror.com/mirrors/node/ npm_mirror: http://registry.npmmirror.com/mirrors/npm/解决nvm list available报错问题 Could not retrieve https://npm.taobao.org/mirrors/node/…...

【电子通识】什么是MSL湿敏等级

潮敏失效是塑料封装表贴器件在高温焊接工艺中表现出来的特殊的失效现象。 造成此类问题的原因是器件内部的潮气膨胀后使得器件发生损坏。 MSL是“Moisture Sensitivity Level&#xff08;湿气敏感性等级&#xff09;”的缩写&#xff0c;针对需进行回流焊的产品设定了MSL基准。…...

【ARM 芯片 安全与攻击 5.4 -- Meltdown 攻击与防御介绍】

文章目录 什么是 Meltdown 攻击?Meltdown 攻击的基本原理Meltdown 攻击代码示例Meltdown 攻击在芯片中的应用应用场景Meltdown 攻击与瞬态攻击、测信道攻击的关系针对 Meltdown 攻击的防御硬件级防御Summary什么是 Meltdown 攻击? Meltdown 攻击是一种利用处理器乱序执行(o…...

Django 后端架构开发:分页器到中间件开发

&#x1f680; Django 后端架构开发&#xff1a;分页器到中间件开发 &#x1f680; &#x1f539; 应用样式&#xff1a;上下翻页 分页功能在处理大量数据时非常有用。通过上下翻页&#xff0c;我们可以让用户轻松浏览数据。以下是一个展示产品列表的分页示例&#xff1a; fr…...

亲测解决The client socket has failed to connect to

这个问题是因为深度学习的程序&#xff08;服务&#xff09;跟本地主机连接不上&#xff0c;解决方法是确认rank起始数为0。 报错原文 [W socket.cpp:663] [c10d] The client socket has failed to connect to [csdn-xiaohu]:12345 (errno: 22 - Invalid argument).解决方法 …...

Intel ACRN 安装WIN10 VM

上一篇帖子记录了ACRN运行rt linux&#xff0c;这篇帖子记录一下最近倒腾出来的WIN10。目前架构如下 ACRN可以把它理解为一个基于Linux类似软件的Type1 Hypervisor&#xff0c;基于Linux去做而不是baremetal是为了更方便去配置资源。 首先我们得有两台电脑&#xff0c;一台是开…...