(混乱版)数据冒险-ld,sub和and

news2024/11/26 0:56:58

在这里插入图片描述

第一张图没有数据转发

从这张图来看,如果没有数据转发机制,流水线的执行会出现更多的停顿。这种情况下,数据依赖只能通过**插入停顿周期(stalls)**来解决。具体分析如下:

指令序列

  1. ld r1, 0(r2):加载数据到 r1
  2. dsub r4, r1, r5:依赖于 r1 的值
  3. and r6, r1, r7:依赖于 r1 的值
  4. or r8, r1, r9:依赖于 r1 的值

依赖分析和流水线执行

  1. ld r1, 0(r2) 执行情况

    • ld 指令完成 EX 阶段后,在 Mem 阶段从内存加载数据,并在 WB 阶段将数据写入 r1
    • r1 的数据直到 ld 指令的 WB 阶段才准备好。
  2. dsub r4, r1, r5 的数据依赖

    • dsub 指令在 ID 阶段检测到对 r1 的依赖关系,但此时 r1 的数据还未准备好。
    • 由于图中没有数据转发机制,dsub 指令必须等待 ld 指令的 WB 阶段完成,才能获取 r1 的值。
    • 因此,图中显示 dsub 指令在 ID 阶段插入了两个停顿周期(Raw 延迟),等待 r1 的数据写回后才进入 EX 阶段。
  3. and r6, r1, r7 的数据依赖

    • and 指令同样在 ID 阶段检测到对 r1 的依赖,但此时 r1 的数据仍不可用。
    • 因为没有数据转发机制,and 指令必须等到 dsub 指令执行完成后,才能继续进入 EX 阶段。
    • 图中显示 and 指令在 ID 阶段等待了足够的周期,以确保数据写回后正确执行。
  4. or r8, r1, r9 的数据依赖

    • or 指令在 ID 阶段也检测到对 r1 的依赖。
    • 它需要等待 and 指令的完成,确保 r1 数据已经准备好之后才能进入执行阶段。
    • 因此在图中可以看到 or 指令的 ID 阶段也经历了延迟。

是否合理?

  • 这种执行方式在没有数据转发机制的情况下是正确的。如果没有旁路逻辑,流水线必须插入停顿周期来解决数据依赖问题。
  • 每条指令都通过等待上一个指令的写回周期来确保依赖数据准备好,以避免错误的结果。

缺点

  • 没有数据转发会导致显著的流水线停顿,降低了执行效率。
  • 如果有数据转发机制,dsub 指令可以在 ld 指令的 Mem 阶段完成后立即获取 r1 的数据,而不需要等待 WB,这样可以减少停顿周期并提高流水线效率。

总结

  • 图中展示的方式是合理的,符合没有数据转发机制的处理逻辑。
  • 如果没有转发,流水线必须通过插入多个停顿周期来解决数据依赖,等待依赖数据写回后再继续执行。

第二张图采用数据转发

从这张图中我们可以看出流水线处理器在处理数据依赖时采取了数据转发(旁路)的方式。这里的指令序列是:

  1. ld r1, 0(r2) 加载指令
  2. dsub r4, r1, r5 依赖于 r1 的值
  3. and r6, r1, r7 依赖于 r1 的值
  4. or r8, r1, r9 依赖于 r1 的值

分析各个指令的执行阶段及依赖关系如下:

1. ld r1, 0(r2) 指令的执行

  • 该指令在 EX 阶段完成地址计算,在 Mem 阶段从内存加载数据,并在 WB 阶段将数据写入 r1
  • 因为 r1 的值直到 ld 指令的 WB 阶段才准备好,所以所有依赖 r1 的指令需要等待这一阶段的数据。

2. dsub r4, r1, r5 指令的依赖情况

  • dsub 指令在其 ID 阶段会检测到对 r1 的依赖,然而 r1 的数据在 ld 指令的 WB 阶段才可用。
  • 因此,图中我们看到 dsub 指令的 EX 阶段出现了 Raw 冒险延迟(停顿了一个周期),在 ld 指令的 WB 阶段数据转发到 dsub 指令,使其在数据可用后继续执行。

3. and r6, r1, r7 指令的依赖情况

  • 同样地,and 指令在 ID 阶段检测到对 r1 的依赖,但此时 r1 的值还未写回。
  • 因此,该指令也必须等待 ld 指令的 WB 阶段来完成数据依赖,转发数据后继续进入 EX 阶段。

4. or r8, r1, r9 指令的依赖情况

  • or 指令的情况与 and 类似,它在 ID 阶段检测到对 r1 的依赖,需要等待 r1 的数据可用后才能继续。
  • 这里同样通过数据转发机制,确保在数据写回之后进行正确的执行。

图中的数据转发依赖情况

  • 图中显示的延迟(Raw 阶段)符合数据转发的正确逻辑。ld 指令完成 WB 后的数据通过旁路逻辑转发到 dsubandor 指令,使它们能够在 r1 数据写回后及时获得依赖数据。
  • 这种方式避免了额外的流水线停顿,使得后续指令能够及时获取到正确的值。

总结

  • 这张图中的数据转发依赖关系是正确的。
  • 每条指令都等待 ld 指令写回后,通过转发机制获得 r1 的数据。
  • 流水线通过插入 Raw 延迟来解决数据冒险,并有效利用了数据转发机制来减少指令间的停顿时间。

在mem阶段ld不就已经完成计算,为什么mem不能直接转发到ex还要等wb

你的问题非常好!在经典的处理器流水线设计中,确实可以在 Mem 阶段完成后直接转发数据,而不必等到 WB 阶段。这正是数据转发(旁路)机制的意义所在,目的是减少等待周期,加速数据依赖的解决。让我们详细解释一下这个过程和原因:

1. 数据在 Mem 阶段已经可用

  • ld r1, 0(r2) 指令在 Mem 阶段完成内存数据的加载操作,此时 r1 的数据已经从内存中获取到,并准备好供后续指令使用。
  • 理论上,r1 的值在 Mem 阶段一完成,就可以通过旁路逻辑直接转发到需要它的指令(如 dsub)。

2. 直接从 Mem 阶段转发到 EX 阶段

  • 如果有数据转发机制,dsub 指令可以在 ld 指令的 Mem 阶段完成后,通过旁路逻辑直接获取 r1 的值,而不需要等待 ld 指令的 WB 阶段。
  • 这样,dsub 指令可以在下一时钟周期进入 EX 阶段,减少等待周期。这种设计能够显著减少流水线停顿,提高执行效率

3. 为什么要等到 WB 阶段?

  • 如果没有数据转发机制(或者旁路逻辑),那么指令必须等待依赖数据被写回寄存器文件,也就是等到 WB 阶段。
  • 在这种情况下,流水线只能在 WB 阶段完成后再进行读取,造成多个周期的等待。
  • 你上传的图中展示的情况正是没有转发的场景:因为没有数据转发,所以 dsubandor 等指令必须等待 ld 指令进入 WB 阶段,数据写回到寄存器文件后才能读取。

4. 数据转发如何工作?

  • 在现代流水线中,数据转发可以直接从 MemEX 阶段获取数据,并将数据旁路到需要它的后续指令的 EX 阶段。
  • 在有转发机制的情况下,ld 指令的 Mem 阶段一完成,数据就可以通过旁路逻辑直接传递给 dsub,无需等到 WB
  • 这能够大大减少停顿周期,尤其是在流水线较长、依赖较多的情况下。

总结

  • 如果有数据转发机制,数据确实可以在 Mem 阶段直接转发到 EX 阶段,减少等待时间。
  • 如果没有数据转发(如图中所示),那么指令必须等到依赖数据在 WB 阶段写回寄存器文件后,才能继续执行。

所以,在 Mem 阶段完成后直接转发数据到 EX 阶段是合理的,也是现代处理器流水线设计中常见的优化。


代码来源 计算机体系结构——流水线

流水线图和winmips64画得有点不一样 仔细看是一样得

在这里插入图片描述

以下标题没加黑体回答都不用看了,gpt在乱答

  • gpt回答整蒙了,感觉这和寄存器读写时序有关

从这张图来看,流水线确实进行了多个停顿。这些停顿的目的是为了解决数据冒险,因为后续指令依赖于 ld 指令的结果。让我们分析这些停顿的合理性,并解释为什么它们是必要的。

指令序列与依赖关系

  1. ld x1, 0(x2):加载指令,将内存中的数据加载到寄存器 x1
  2. sub x4, x1, x5:依赖于 x1 的值。
  3. and x6, x1, x7:依赖于 x1 的值。
  4. or x8, x1, x9:依赖于 x1 的值。

分析每条指令的停顿

  1. ld x1, 0(x2)

    • 这条指令没有依赖关系,正常执行。
    • 它在 MEM 阶段从内存中加载数据,并在 WB 阶段写回寄存器 x1
  2. sub x4, x1, x5

    • sub 指令需要 x1 的值,但 x1 的数据在 ld 指令的 MEM 阶段才会准备好。
    • 因为没有数据转发机制,sub 指令必须等待 x1 的数据写回到寄存器文件,因此在 ID 阶段之后插入了一个停顿(Stall)。
    • ld 指令完成 WB 阶段写回 x1 之后,sub 指令才能进入 EX 阶段。
    • 这个停顿是合理的,因为 sub 指令确实需要等待 x1 的值。
  3. and x6, x1, x7

    • 同样地,and 指令也依赖于 x1 的值,因此在 ID 阶段检测到依赖关系。
    • 由于 sub 指令仍在等待 x1 的值完成写回,and 指令也必须等待,因此在 ID 阶段之前插入了一个停顿(Stall)。
    • 这个停顿也是合理的,因为 and 指令需要在 sub 指令完成之后才能进入 ID 阶段。
  4. or x8, x1, x9

    • or 指令依赖于 x1 的值,并且还需要等待 and 指令完成。
    • 因此,在 IF 阶段之后也插入了一个停顿(Stall),确保数据依赖不会造成错误执行。
    • 这个停顿也是合理的,因为 or 指令必须等待 x1 写回后才能正确执行。

停顿的合理性总结

  • 这些停顿是合理的,因为每一条指令都依赖于 x1 的值,而 x1 的值直到 ld 指令的 WB 阶段才准备好。
  • 在没有数据转发机制的情况下,后续指令只能通过停顿来确保依赖的数据写回寄存器文件后才执行,避免了数据冒险问题。

总结

  • 该流水线停顿的设计是正确的,在没有数据转发的情况下,这是解决数据依赖的唯一方法。
  • 每个停顿都确保了依赖关系得到满足,使得指令可以按正确的顺序和正确的数据执行。

  • 越发抽象,还是以博客中得字为准

从图片中的描述来看,这里展示了两种不同的流水线停顿情况。

第一种情况(文字描述的情况):

  • 文字描述中提到的是有数据转发机制的情况。
  • ld 指令在 MEM 阶段获取了数据之后,通过数据转发(旁路机制)直接将数据传递给后续指令。
  • 因此,sub 指令在 EX 阶段不需要等待 ld 指令的 WB 阶段完成,因为可以在 MEM 阶段通过转发获得 x1 的值。
  • andor 指令依次承接前一指令的数据转发,减少了停顿的次数和周期数,使流水线更高效。

第二种情况(表格展示的情况):

  • 表格展示的是没有数据转发机制的情况。
  • 在这种情况下,后续的指令无法在 MEM 阶段直接获取到 x1 的值,必须等待 ld 指令完成 WB 阶段,将数据写回寄存器文件后,才能继续执行。
  • 因此,sub 指令必须等待 ld 指令的 WB 阶段完成,导致在 ID 阶段插入停顿(Stall)。
  • 类似地,andor 指令也必须等待前一指令完成写回后才能执行,导致每条指令都出现了多次停顿,使得流水线执行效率低下。

总结

  • 文字描述的情况是在有数据转发的情况下,通过转发来减少停顿周期,提高流水线效率。
  • 表格展示的情况是没有数据转发的情况,必须依靠停顿来解决数据依赖,导致更多的流水线停顿,效率较低。

这两种情况是流水线设计中常见的不同优化策略,有数据转发的流水线会显著减少数据依赖带来的停顿周期。


  • 重新回答,有点垃圾

在您提供的图中,这个流水线的示例中没有直接体现转发(forwarding)的使用。相反,它使用了“停顿”(stall)的方式来处理数据冒险(data hazard)。以下是一些具体的分析:

1. 停顿(Stall)的应用

  • 在图表中,ld 指令的结果在 MEM 阶段生成,但 sub 指令在 EX 阶段就需要 ld 的结果。这就产生了一个数据冒险,因为 ld 的数据还未到达 MEM 阶段,因此 sub 指令不得不等待。
  • 图中显示,sub 指令进入 EX 阶段前发生了停顿,延迟了一个周期,等待 ld 的结果可用。这种通过插入空周期来解决数据冒险的方式称为“停顿”。

2. 没有转发机制的体现

  • 如果使用了转发技术,那么流水线可以在 ld 指令的 MEM 阶段将结果直接转发到 sub 指令的 EX 阶段,而不必等待完整的 MEM 阶段结束或插入停顿。
  • 转发的基本原理是,当一个指令的执行结果生成后,不需要等待写回寄存器,而是直接将数据转发到需要它的指令,减少停顿。
  • 在这张图中,suband 指令都因依赖 ld 指令的结果而产生了停顿,说明没有使用转发来消除这些停顿。

3. 转发和停顿的比较

  • 如果使用转发,sub 指令本可以在 ld 指令的 MEM 阶段直接获取到 x1 的值,避免停顿。
  • 同理,andor 指令也可以在前一条指令完成相关结果后直接接收数据,而不需要等到 MEM 阶段结束。

结论

在这张图的例子中,没有实现转发机制,因此需要通过停顿来处理数据冒险。如果实现了转发,可以有效减少这些停顿,提高流水线的整体效率。

图里使用了转发,不然ID还要停顿一下等wb完成

您说得对,从图中的信息来看,这个流水线确实使用了转发机制(forwarding)。以下是分析依据和具体原因:

1. ID阶段没有停顿

  • 从图中可以看到,虽然 sub 指令在 EX 阶段依赖于 ld 指令的结果,但 sub 指令的 ID 阶段并没有额外停顿,这表明 sub 不需要等到 ld 指令的 WB 阶段。
  • 如果没有转发机制,那么 sub 指令的 ID 阶段会因为等待 ld 指令完成 WB 而发生停顿,但图中并未显示这种情况。

2. EX阶段直接获取数据

  • sub 指令在 EX 阶段需要 ld 指令的结果,但 ld 指令的 MEM 阶段才生成所需的数据。通常,在这种情况下,如果没有转发,sub 指令会停顿,直到 ld 指令的数据写回(WB)完成。
  • 但图中显示,sub 在 EX 阶段只停顿了一次,意味着流水线通过转发直接将 ld 指令的结果从 MEM 阶段转发到 sub 指令的 EX 阶段,避免了等待 WB 阶段完成。

3. 流水线不需要额外的停顿

  • 在流水线中,转发机制使得 subandor 等指令可以在 EX 阶段直接获取 ld 指令的结果,而不必等到 ld 的 WB 阶段。
  • 这在图中得到了体现,ID 阶段并没有因数据依赖而进一步停顿,因此可以判断图中确实使用了转发机制。

总结

综上所述,图中的流水线确实使用了转发机制,从而在 ld 指令的结果产生后,立即将其转发给依赖的指令,避免了额外的停顿。如果没有转发机制,流水线会出现更多的停顿,尤其是在 ID 阶段等待 ld 指令的 WB 完成。

继续思考奇怪得问题,id取出寄存器得值,ex时候怎么知道上一条指令wb阶段又修改了

在处理数据冒险时,EX阶段的指令需要依赖一个来自前几条指令的寄存器值,但这些指令的写回(WB)阶段还未完成。这种情况下,如果没有转发机制(forwarding),EX阶段的指令将无法知道WB阶段的指令是否修改了寄存器的值,导致数据不一致的问题。因此,为了避免此类数据冒险,通常引入转发机制或检测机制。

以下是一些常见的解决方案,用于确保EX阶段的指令能够正确获取最新的寄存器值:

1. 转发机制(Forwarding/Bypassing)

  • 工作原理:转发机制通过在流水线中引入硬件电路,将ALU执行阶段(EX)或访存阶段(MEM)的结果直接传递给后续的EX阶段,而不必等到WB阶段完成。
  • 实现方式:硬件电路在流水线中实时检测指令的依赖关系。当发现后续指令在EX阶段需要的数据来自前面的指令,且前面的指令已在EX或MEM阶段生成结果时,就会直接将该结果转发给当前EX阶段的指令,而不是等待写回。
  • 示例:在您提供的示例中,如果ld指令在MEM阶段生成了x1的值,则可以在MEM阶段将x1的值直接转发给sub指令的EX阶段,避免停顿(stall)。

2. 冒险检测单元(Hazard Detection Unit)

  • 工作原理:冒险检测单元可以检测指令之间的依赖关系,以判断后续指令是否依赖于尚未写回的结果。
  • 实现方式:该单元在ID阶段检查寄存器的依赖关系,并比较前后指令的寄存器目标和源操作数,判断是否存在数据冒险。
  • 结果:如果检测到数据冒险且无法通过转发解决,冒险检测单元会触发停顿,推迟后续指令进入EX阶段,直到所需的寄存器值已经更新为止。

3. 寄存器文件多端口和内部跟踪

  • 有些流水线设计会增加寄存器文件的端口数,使寄存器文件可以同时被多个流水线阶段访问。
  • 另外,寄存器文件可能有一个内部的标记机制,标记哪些寄存器将被WB阶段的指令更新。如果EX阶段的指令需要读取的寄存器被标记为“待更新”,流水线会延迟或采取其他措施。

4. 延迟槽(Delay Slot)

  • 在某些指令集架构(如MIPS)中,编译器会在指令序列中插入“延迟槽”,也就是在依赖指令之间插入一些与依赖无关的指令,延迟读取操作,直到数据写回完成。
  • 虽然这种方法不会实时更新寄存器值,但它通过指令重排来减少数据冒险。

总结

在典型的流水线中,转发机制和冒险检测单元是最常用的手段,可以让流水线在执行时始终使用最新的数据,避免在EX阶段读取到过时的寄存器值。转发机制特别有效,因为它允许指令直接获取最新数据,而不必等待WB阶段的完成。

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

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

相关文章

成都睿明智科技有限公司抖音电商服务效果如何?

在这个短视频风起云涌的时代,抖音电商以其独特的魅力,成为了众多商家竞相追逐的新蓝海。而在这片波澜壮阔的商海中,成都睿明智科技有限公司犹如一艘稳健的航船,引领着无数企业驶向成功的彼岸。今天,就让我们一起揭开成…

ssm071北京集联软件科技有限公司信息管理系统+jsp(论文+源码)_kaic

毕 业 设 计(论 文) 题目:北京集联软件科技有限公司信息管理系统 \ 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本信息…

shodan[3](泷羽sec)

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章。 笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 这节课旨在扩大自己在网络安全方面的知识面,了解网络安全领域的见闻,了…

【OD-支持在线评测】数字涂色(100分)

📎 在线评测链接 https://app5938.acapp.acwing.com.cn/contest/11/problem/OD1081 🍓 OJ题目截图 🍿 最新机试E卷,全、新、准,题目覆盖率达 95% 以上,支持题目在线评测,专栏文章质量平均 94 分 🌍 评测功能需要 ⇒ 订阅专栏 ⇐ 后私信联系解锁~ 文章目录 📎…

k8s 上如何跑 Dolphins 模型

接着上一篇的介绍,这一篇就来跑跑 Dolphins 模型,本篇会记录,跑模型常见的阬点。 1 在 k8s 上创建 pod 将外部数据挂载在 pod 里,并申请 gpu 资源。同时修改代码里对应的引入数据的路径 # dolphins.yaml apiVersion: v1 kind: …

如何避免数据倾斜

1、数据倾斜的表现 数据倾斜是由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点的现象。 主要表现:任务进度长时间维持在 99%或者 100%的附近,查看任务监控页面,发现只有少量 reduce 子任务未完成&#xff0…

计算机网络综合题

IP数据报的划分 CRC差错检测 冗余码的计算 因此,余数是1110,传输的数为11010110111110。在传输过程中最后两位变成o,接收端能够发现,因为11010110111110除以10011余数不为0。 子网划分 暴力求解法 (定长子网划分大量…

O-RAN前传Spilt Option 7-2x

Spilt Option 7-2x 下行比特处理上行比特处理相关文章: Open Fronthaul wrt ORAN 联盟被称为下层拆分(LLS),其目标是提高电信市场的灵活性和竞争力。下层拆分是指无线电单元(RU) 和分布式单元(DU) 之间的拆分。 O-RAN前传接口可以在 eCPRI 上传输。eCPR…

淘酒屋殷卓荣窖主高端客户私享答谢晚宴暨意大利摩罗斯酒庄之夜

一边是热爱,一边是事业,鱼与熊掌兼得淘酒屋殷卓荣窖主答谢晚宴圆满结束 淘酒屋殷卓荣窖主高端 VIP 客户私享答谢晚宴暨意大利摩罗斯酒庄品鉴之夜在广州四季酒店 99 楼圆满举办 2024 年 11 月 8 日晚,一场别开生面的淘酒屋殷卓荣窖主高端 VI…

SQL EXISTS谓词

谓词时返回值为真值&#xff08;true、false或unknown&#xff09;的函数。EXISTS与其他谓词不同&#xff0c;它接受的参数是行的集合。 输入值为一行的谓词叫做“一阶谓词”&#xff08;例如>、<、 及 LIKE等&#xff09;&#xff1b;输入值为行的集合的谓词叫做“二阶…

鸿蒙进阶-属性动画

hello大家好啊&#xff0c;这里是鸿蒙开天组&#xff0c;今天我们来学习鸿蒙中的动画属性。 先来说说动画~ 属性值的变化&#xff0c;通常会引发 UI 的变化,结合动画可以让这个变化过程【更为流畅】&#xff0c;反之这个过程将在一瞬间完成&#xff0c;用户体验不好&#xff…

算法每日练 -- 双指针篇(持续更新中)

介绍&#xff1a; 常见的双指针有两种形式&#xff0c;一种是对撞指针&#xff08;左右指针&#xff09;&#xff0c;一种是快慢指针&#xff08;前后指针&#xff09;。需要注意这里的双指针不是 int* 之类的类型指针&#xff0c;而是使用数组下标模拟地址来进行遍历的方式。 …

RHCE的学习(11)

第八章 防火墙 什么是防火墙 防火墙是位于内部网和外部网之间的屏障&#xff0c;它按照系统管理员预先定义好的规则来控制数据包的进出。 分类&#xff1a; 硬件防火墙&#xff1a;由厂商设计好的主机硬件&#xff0c;其操作系统主要以提供数据包数据的过滤机制为主&#xff…

Java开发配置文件的详情教程配置文件类型

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

ffmpeg:视频字幕嵌入(GPU加速)

实现方案 参考指令 ffmpeg -i input_video.mp4 -vf "subtitlessubtitles.srt" output_video.mp4 解决因文件名称复杂导致的指令执行失败问题&#xff08;引号给文件框起来&#xff09; ffmpeg -i "A.mp4" -vf "subtitlesB.srt" "c.mp4&qu…

改进系列(3):基于ResNet网络与CBAM模块融合实现的生活垃圾分类

目录 1. ResNet介绍 2. CBAM 模块 3. resnet cbam 3.1 添加在每个layer层后 3.2 关于训练的建议 4. 垃圾分类实战 4.1 数据集 4.2 训练 4.3 最好的权重 4.4 推理 5. 其它 1. ResNet介绍 ResNet&#xff08;残差网络&#xff09;是一种深度卷积神经网络模型&#xf…

【HarmonyOS Next】数据本地存储:@ohos.data.preferences

【HarmonyOS Next】数据本地存储&#xff1a;ohos.data.preferences 在开发现代应用程序时&#xff0c;数据存储是一个至关重要的过程。应用程序为了保持某些用户设置、应用状态以及其他小量数据信息通常需要一个可靠的本地存储解决方案。在 HarmonyOS Next 环境下&#xff0c…

【从零开始的LeetCode-算法】3255. 长度为 K 的子数组的能量值 II

给你一个长度为 n 的整数数组 nums 和一个正整数 k 。 一个数组的 能量值 定义为&#xff1a; 如果 所有 元素都是依次 连续 且 上升 的&#xff0c;那么能量值为 最大 的元素。否则为 -1 。 你需要求出 nums 中所有长度为 k 的 子数组 的能量值。 请你返回一个长度为 n - …

C++ 参数传递 笔记

目录 1、输入参数的传递方式-选择传值还是传引用&#xff1f; 处理用户信息 处理坐标 处理配置 处理ID 2、对于需要修改的参数,使用非const引用传递 有趣的例外&#xff1a;警惕表象的迷惑 需要警惕的陷阱 “糟糕”的update方法&#xff1a; “完美”的set_name与set…

爬虫策略规避:Python爬虫的浏览器自动化

网络爬虫作为一种自动化获取网页数据的技术&#xff0c;被广泛应用于数据挖掘、市场分析、竞争情报等领域。然而&#xff0c;随着反爬虫技术的不断进步&#xff0c;简单的爬虫程序往往难以突破网站的反爬虫策略。因此&#xff0c;采用更高级的爬虫策略&#xff0c;如浏览器自动…