做哪类网站2024年新闻摘抄十条

张小明 2026/1/2 1:06:24
做哪类网站,2024年新闻摘抄十条,网站关键词数量,注册科技有限公司可以做网站吗注#xff1a;该文用于个人学习记录和知识交流#xff0c;如有不足#xff0c;欢迎指点。一、CPU是如何获取数据的cpu缓存缓存行CPU 获取数据的精简流程#xff08;按 “快→慢” 层级查#xff0c;无效则找其他核心 / 主存#xff09;#xff1a;先查自己核心的 L1 缓存…注该文用于个人学习记录和知识交流如有不足欢迎指点。一、CPU是如何获取数据的cpu缓存缓存行CPU 获取数据的精简流程按 “快→慢” 层级查无效则找其他核心 / 主存先查自己核心的 L1 缓存若 L1 里有该数据对应的有效缓存行直接读若 L1 缓存行无效去查自己核心的 L2 缓存。再查自己核心的 L2 缓存若 L2 有有效缓存行读并同步到 L1若 L2 缓存行无效去查所有核心共享的 L3 缓存。接着查共享的 L3 缓存若 L3 有有效缓存行读并同步到 L2、L1若 L3 缓存行无效先看其他核心有没有该数据的有效缓存行有则直接从其他核心读同步到 L3、L2、L1没有则从主存读。最后从主存读从主存加载该数据对应的缓存行依次存入 L3、L2、L1然后读取。问线程间的共享变量如何避免同时操作操作的最新值如何实时同步到别的线程下面是解答二、原子性一个或一组操作在执行过程中不可被线程调度器中断且对外呈现 “要么完全执行完毕要么完全不执行” 的状态 —— 不存在 “执行到一半” 的中间态其他线程也无法观察到中间结果。简单点讲在该变量被操作的过程中其他线程不可访问该变量会阻塞到操作完成才访问成功且该操作无法被中断。关键特征不可中断操作一旦开始必须执行到结束不会被其他线程打断底层依赖 CPU 原子指令、锁、内存屏障等保证无中间态从其他线程的视角看操作要么 “没开始”要么 “已完成”看不到 “执行到一半” 的中间值单线程无意义原子性是针对多线程的特性 —— 单线程下所有操作天然不会被中断因此讨论原子性的前提是多线程竞争。三、原子操作具备原子性的 “具体操作”针对原子变量的操作原子操作需要考虑内存序的问题内存序细讲就是控制可见性和顺序性我们要基于变量对可见性和顺序性的要求选择合适的内存序一 可见性1. 定义一个线程对原子变量的修改其他线程能否及时、确定地读取到这个最新值。核心痛点即使是原子操作修改后的值可能只留在当前线程核心的私有缓存中其他线程读的是自己缓存里的旧值“修改了但看不见”。2. 原子操作可见性的问题根源和普通操作一致CPU 缓存 重排序但原子操作可通过内存序解决缓存层面修改先写入核心私有缓存未即时刷到缓存可能仍存在寄存器中、主存如果有MESI机制的化未刷新到主存不影响会直接从缓存行同步到其他CPU缓存行编译器 / CPU 优化重排序或寄存器驻留导致读取不到最新值。3. 内存序如何解决可见性通过release写acquire读组合强制同步缓存release写原子变量时强制将当前线程缓存中的所有修改刷到主存acquire读原子变量时强制从主存加载最新值而非本地缓存。二顺序性1. 定义多线程下原子操作的执行顺序是否和代码书写顺序一致以及 “不同线程看到的操作顺序是否一致”。核心痛点编译器 / CPU 为了性能会重排序指令单线程语义不变但多线程下打乱顺序导致逻辑错误。2. 原子操作顺序性的问题根源指令重排序比如反例代码中 “先写 shared_data再写 data_ready”CPU 可能重排为 “先写 data_ready再写 shared_data”—— 线程 2 读到 data_ready1 时shared_data还没被修改“顺序乱了”。3. 内存序如何解决顺序性内存序会约束 “哪些操作不能重排序”release当前线程中所有在 release 操作之前的写操作不能被重排到 release 之后acquire当前线程中所有在 acquire 操作之后的读操作不能被重排到 acquire 之前seq_cst最严格所有线程看到的操作顺序 “全局一致”像单线程执行。反例注意不一定报错编译器不一定有重排这里只是举个例子#include atomic #include thread #include cassert #include iostream // 全局变量 std::atomicbool data_ready(false); // 原子flag标记data是否准备好 int shared_data 0; // 普通变量生产者要写入的数据 // 生产者先写数据再置位flag代码书写顺序正确 void producer() { shared_data 42; // 步骤1写数据代码顺序在前 // 错误用宽松内存序不约束操作顺序 data_ready.store(true, std::memory_order_relaxed); // 步骤2置位flag代码顺序在后 } // 消费者看到flag置位就读取数据 void consumer() { // 循环等待flag置位 while (!data_ready.load(std::memory_order_relaxed)) {} // 预期shared_data42但实际可能0因为重排序 assert(shared_data 42 shared_data未正确初始化); std::cout 消费者读取到shared_data shared_data std::endl; } int main() { // 启动生产者和消费者线程 std::thread t_prod(producer); std::thread t_cons(consumer); t_prod.join(); t_cons.join(); return 0; }三内存序内存序是 C 给原子操作提供的约束规则本质是告诉编译器 / CPU哪些原子操作之间不能重排序哪些原子操作的修改必须同步到其他线程刷缓存。内存序类型可见性保证顺序性保证适用场景memory_order_relaxed无仅保证原子性无操作可任意重排序无依赖的计数器如统计访问量memory_order_release修改对后续 acquire 读可见之前的写操作不能重排到该操作之后发布数据写状态 / 指针memory_order_acquire能看到之前 release 写的所有修改之后的读操作不能重排到该操作之前获取数据读状态 / 指针memory_order_acq_rel兼具 acquire读 release写的可见性兼具 acquirerelease 的顺序性原子交换、CAS 等读写操作memory_order_seq_cst强可见性全局同步全局顺序一致所有线程看到相同操作顺序强同步场景性能开销大总结概念核心目标依赖关系可见性保证线程间修改能互相看到需内存序release/acquire约束顺序性保证操作执行顺序符合代码逻辑需内存序约束重排序内存序控制可见性 顺序性的规则不影响原子性是解决前两者的手段疑问问1普通变量a具备原子性吗以常见的编程语言Java/C/Python 等为例看似简单的a本质是三步拆解操作而非单一不可中断的指令读取Load将变量a的值从内存加载到 CPU 寄存器递增Increment在寄存器中对a的值执行1运算存储Store将递增后的值从寄存器写回缓存或内存。这三步是分步执行的中间可能被线程调度器中断导致多线程下的错误结果。时间片线程 1线程 2内存中 a 的值T1读取 a0 到寄存器—0T2被线程调度器中断读取 a0 到寄存器0T3—寄存器中 a110T4—写回缓存或内存a11T5恢复执行寄存器 a11—1T6写回缓存或内存a1—1最终a1而非预期的2证明a不是原子操作。四、缓存一致性缓存一致性Cache Coherence是硬件层面的核心机制—— 它解决了「多核心 CPU 的私有缓存中同一变量的副本数据不一致」的问题是原子操作能实现 “跨线程可见性” 的底层基础。注意缓存一致性应用于所有变量但是不保证操作的原子性、顺序性。一实现几乎所有现代 CPU 都用MESI 协议Modified/Exclusive/Shared/Invalid实现缓存一致性 —— 它给每个缓存行缓存的最小存储单位标记 4 种状态通过总线广播状态变化强制各核心同步缓存缓存行状态含义MModified缓存行被当前核心修改过和主存数据不一致仅当前核心持有该缓存行独占EExclusive缓存行和主存数据一致仅当前核心持有无其他核心共享SShared缓存行和主存数据一致多个核心持有共享状态IInvalid缓存行无效数据过期必须从主存 / 其他核心重新加载二MESI 协议如何保证缓存一致结合原子操作举例假设初始时a0核心 1 执行原子自增核心 2 执行原子读取核心 1 要修改a先通过总线广播「请求独占a的缓存行」其他核心如核心 2收到广播将自己缓存中a的缓存行标记为I无效核心 1 将a的缓存行标记为E独占然后修改为 1状态变为M已修改核心 2 执行a.load()时发现自己的缓存行是I于是向总线请求a的最新值数据来源优先级M E S核心 1 收到请求将a1刷回主存并直接传给核心 2自己的缓存行状态变为S共享核心 2 从主存 / 核心 1 加载a1缓存行标记为S读取到最新值。整个过程中MESI 协议通过 “状态标记 总线广播”保证了核心 2 能拿到核心 1 修改后的最新值 —— 这就是缓存一致性的核心作用。三缓存一致性救不了普通a的核心原因缓存一致性不保证原子性也就是核心1在执行操作的时候还未更改完毕核心2请求核心1的值核心1很可能返回的是a的旧值1。而原子变量在操作前会发起lock指令阻塞其他核心请求该值直至操作结束完毕。注意单靠原子性也不一定能获取到最新值因为核心1操作完之后最新值可能仍存放在寄存器中并没有更新到缓存中而此时lock释放核心2获取的是旧值。所以原子操作实时更新应该使用realse内存序确保更新到缓存和主存。然后用acquire从主存中直接获取更稳妥疑问问1MESI 中 核心1持有a变量此时核心2也要获取a变量那是从内存中直接获取还是核心a同步给核心2在 MESI 协议中核心 2 获取a变量时优先从核心 1 的缓存中直接同步缓存到缓存传输而不是从内存获取—— 这是为了避免内存访问的高延迟是现代 CPU 缓存一致性的高效实现方式。具体行为取决于核心 1 持有a对应的缓存行的状态分 3 种状态拆解核心 1 的缓存行状态不同同步方式不同假设核心 1 已持有a的缓存行核心 2 发起 “获取a” 的请求1. 核心 1 的缓存行是M 状态已修改 / 脏块核心 1 的缓存行数据和内存不一致比如核心 1 修改了a但没刷回内存此时核心 2 请求时核心 1 会先将缓存行的最新数据比如a1直接传给核心 2缓存到缓存传输同时把数据刷回主存保证内存和缓存一致核心 1 的缓存行状态从M变为S共享核心 2 接收数据后缓存行状态设为S。结论核心 2 从核心 1 同步最新数据而非从内存获取内存里还是旧值。2. 核心 1 的缓存行是E 状态独占 / 未修改核心 1 的缓存行数据和内存一致且只有核心 1 持有核心 2 请求时核心 1 会直接将缓存行数据传给核心 2无需刷内存因为数据和内存一致核心 1 的缓存行状态从E变为S核心 2 的缓存行状态设为S结论核心 2 从核心 1 同步数据比从内存读更快。3. 核心 1 的缓存行是S 状态共享 / 未修改核心 1 的缓存行数据和内存一致且可能有多个核心持有核心 2 请求时核心 1 会直接将缓存行数据传给核心 2或核心 2 也可以从内存读但缓存传输更快核心 2 的缓存行状态设为S结论优先从核心 1 同步数据少数情况比如核心 1 的缓存行已被替换才从内存获取。缓存到缓存传输是 MESI 的高效优化现代 CPU 都支持 “缓存到缓存传输”Cache-to-Cache Transfer—— 核心间可以直接通过总线传递缓存行数据无需绕路主存。这是因为内存访问延迟约 100ns远高于缓存间传输延迟约 10ns 内优先核心间同步能大幅提升性能。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

wordpress排版错误安卓手机性能优化软件

前言 线上千万级的大表在新增字段的时候,一定要小心,我见过太多团队在千万级大表上执行DDL时翻车的案例。 很容易影响到正常用户的使用。 本文将深入剖析大表加字段的核心难点,并给出可落地的解决方案。 希望对你会有所帮助。 1.为什么大…

张小明 2025/12/24 6:01:21 网站建设

免费模板素材网站正规的网页制作

SUSTechPOINTS:终极3D点云标注工具快速完成自动驾驶数据标注 【免费下载链接】SUSTechPOINTS 3D Point Cloud Annotation Platform for Autonomous Driving 项目地址: https://gitcode.com/gh_mirrors/su/SUSTechPOINTS 在自动驾驶技术快速发展的今天&#x…

张小明 2025/12/31 13:53:14 网站建设

网站建设与维护的实训总结合肥建设局网站

汽车设计图纸大文件上传(WEB 集成)方案 一、项目背景 在汽车制造行业,汽车设计图纸是核心资产,其文件体积通常较大,动辄达到 100G 左右。客户提出需求,希望能在我们开发的 WEB 系统中实现这类大文件的安全…

张小明 2025/12/31 4:07:45 网站建设

微信视频网站建设多少钱建设是哪里

GraniStudio零代码平台提供配方功能,当HMI设计器处于设计时状态下将当前参数以配方形式导出。然后退出运行时状态后切换至设计时状态下将保存配方导入,即可将控件默认值修改。 (当使用HMI切换配方时,导入配方文件内算子信息必须与当前UI界面保持一致,否则切换无效果) 导出配方…

张小明 2025/12/30 22:46:04 网站建设

ui网站建设格泰网站建设

企业微信SCRM系统年投入动辄数十万,但60%的企业因选型失误陷入功能冗余却效果平平的困境。微盛作为服务过160家500强企业的企业微信生态最大服务商(腾讯四轮投资支持),结合这些头部企业的实战数据,拆解2025年高性价比S…

张小明 2025/12/31 4:07:12 网站建设

南京网站开发公司哪家好网站导航还值得做

12 月 14 日,边缘 AI 工作坊 在上海张江科学堂成功举办。本次活动由边缘计算社区主办,很荣幸在 上海市人工智能行业协会的指导与邀请下参与策划,并作为 2025 全球开发者先锋大会(GDPS)的重要分论坛活动隆重亮相。GDPS …

张小明 2025/12/31 7:50:02 网站建设