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

gem5学习(20):替换策略——Replacement Policies

目录

一、Random

二、Least Recently Used (LRU)

三、Tree Pseudo Least Recently Used (TreePLRU)

四、Bimodal Insertion Policy (BIP)

五、LRU Insertion Policy (LIP)

六、Most Recently Used (MRU)

七、Least Frequently Used (LFU)

八、First-In, First-Out (FIFO)

九、Second-Chance

十、Not Recently Used (NRU)

十一、Re-Reference Interval Prediction (RRIP)

十二、Bimodal Re-Reference Interval Prediction (BRRIP)


这一教程中主要介绍了当内存系统满时,需要进行相应的替换策略。

官网教程:gem5: Replacement Policies

Gem5实现了多种替换策略。每种替换策略在确定需要替换的数据块时,都使用特定的替换数据进行判断。替换数据是衡量数据块被替换优先级的指标。

在所有替换策略中,无效块(invalid blocks)都被优先作为替换对象。无效块是指在缓存中没有有效数据的块,即没有被使用或者已经被无效化的块。因为无效块不再有用,可以立即被替换掉,给新的数据块提供空间。

替换策略由reset()、touch()、invalidate()和getVictim()方法组成。每种方法对替换数据的处理方式不同。

  • reset()用于初始化替换数据(即将其标记为有效)。它只应在插入新条目时调用,并且在无效化之前不应再次调用。对条目的第一次访问必须始终是reset()。
  • touch()用于访问替换数据,因此应在条目访问时调用。它的目的是更新替换数据,用来反映最新的访问情况。【当一个条目被访问时,touch()方法被调用,说明该条目被使用了一次。通过调用touch()方法,替换策略可以根据访问模式和频率来更新替换数据,更准确地判断哪个数据块适宜留在缓存中】
  • invalidate()在条目无效化时调用,之所以会被无效化,通常是由于一致性处理的需求。一致性处理可能是其他处理器或缓存修改了相同的数据,导致当前缓存中的数据变成无效状态。此时,在确定需要被替换的条目时,invalidate()会调整替换数据,使得被无效化的条目在替换决策中的优先级较高,更有可能被替换出去。
  • getVictim()在发生缺失时调用,必须从缓存中选择一项数据替换出去,以腾出空间来存储新的数据。在所有候选替换条目中,它会优先搜索具有最差替换数据的条目,这意味着会根据替换策略中定义的替换数据度量标准,选择具有较低优先级的条目作为替换的对象,同时优先选择替换掉无效条目。

我们简要介绍了Gem5中实现的替换策略。如果需要进一步了解,可以参考Cache Replacement Policies Wikipedia页面或相关论文。

一、Random

随机(Random)是一种最简单的替换策略,它不依赖于任何替换数据或者访问模式。在发生缺失需要进行替换时,随机替换策略会在所有的替换候选项中随机选择一个替换数据块。

这种策略的优势在于它的实现简单且成本低,因为不需要维护额外的替换数据结构。它可以适用于一些不需要特定的替换策略的场景,或者作为其他更复杂替换策略的基准进行比较。

然而,随机替换策略也存在一些缺点。由于其随机性质,它无法利用访问模式或者替换数据的信息,因此可能无法充分优化缓存的命中率。在某些情况下,随机替换策略可能会导致频繁替换频繁访问的数据块,从而降低缓存性能。

二、Least Recently Used (LRU)

最近最少使用(LRU)是一种替换策略,其替换数据包括最后访问时间戳,记录最后一次访问该条目的时间。当需要替换时,LRU替换策略会选择具有最早最后访问时间戳的条目作为替换数据块。

该策略的原理是,根据时间戳可以推测出最近被访问的数据块相对较新,而较长时间未被访问的数据块相对较旧。因此,最早被访问的数据块是最有可能在未来较长时间内不再被访问的,所以选择它作为替换数据块是合理的。通过基于最后访问时间戳选择替换数据块,LRU替换策略可以充分利用访问模式的局部性原理,即最近被访问的数据块在未来也可能被频繁访问。这有助于提高缓存的命中率,使得常被访问的数据块能够长时间保留在缓存中,提高访问性能。

然而,LRU替换策略也有一些限制。维护时间戳需要额外的开销,并且在高并发的情况下,更新时间戳可能会引入竞争条件。此外,对于具有周期性访问模式或者突发访问的数据块,LRU可能无法有效地适应其访问模式。

三、Tree Pseudo Least Recently Used (TreePLRU)

TreePLRU是对LRU替换策略的改进。它通过使用二叉树和1位指针来管理和跟踪缓存条目的使用情况。

TreePLRU的核心思想是将缓存条目组织成二叉树结构,并使用1位指针来表示每个节点的状态。二叉树的叶子节点表示缓存条目,而非叶子节点表示缓存条目的组合。通过在每个节点上设置1位指针,可以表示该节点的子节点中哪个子节点最近被访问过。当需要进行替换时,TreePLRU会根据节点的1位指针来选择替换数据块。具体选择的方法是从根节点开始,根据节点的1位指针选择下一个节点,直到到达叶子节点,该叶子节点即为需要替换的数据块。

通过使用二叉树和1位指针来管理替换数据,TreePLRU能够更高效地跟踪和更新条目的使用近期性。相比传统的LRU实现,它节省了额外的时间和空间开销。

然而,TreePLRU也有一些限制。由于使用二叉树结构,它需要维护和更新树的指针,这可能会引入一些复杂性和开销。此外,TreePLRU对于大型缓存和高并发访问的情况可能不够高效。

四、Bimodal Insertion Policy (BIP)

BIP是一种改进的替换策略,它在LRU的基础上引入了概率性的MRU插入。每个块在被插入缓存时,根据双模节流参数(btp)确定以MRU方式插入的概率。

双模节流参数(btp)是一个控制插入策略的参数,它决定了新块以MRU方式插入的可能性。较高的btp值表示更高的插入概率,即新块更有可能以MRU方式插入。换句话说,btp决定了新块插入时被放置的位置,越高的btp值表示新块更有可能被放置在最近最少使用的位置。

使用BIP策略时,较高的btp值可以增加新块以MRU方式插入的概率,这意味着最近访问的块可能会更长时间地保留在缓存中。这可以提高缓存的命中率,从而提高系统的性能。

然而,需要注意的是,较高的btp值也可能导致缓存中的块长时间保留,导致较少访问的块很难进入缓存。因此,在选择适当的btp值时需要进行权衡,以获得最佳的缓存性能。

五、LRU Insertion Policy (LIP)

LIP是一种改进的替换策略,它基于LRU替换策略的基本原则,但在插入新块时有所不同。通常,在LRU中,新块会被插入到最近使用的位置(MRU),以便它们有更高的机会在未来被频繁访问。然而,在LIP中,新块被插入到最近最少使用的位置(LRU),即最不可能被访问的位置。

当新块被插入到LRU位置时,它们的时间戳会被更新为MRU,以便在后续访问中正确反映它们的使用频率。这样,当新块被重复访问时,它们将逐渐向MRU位置移动,直到它们成为最近访问的块。

LIP也可以被视为BIP的一种特殊情况,其中将插入新块作为最近使用的可能性设置为0%。在BIP中,插入新块的概率可以根据双模节流参数进行调整,而在LIP中,新块始终以LRU方式插入,不考虑最近使用的可能性。

LIP的优点是它简化了插入策略,减少了实现的复杂性,并且在某些情况下可能提供更好的性能。然而,它可能会导致缓存中的新块较少,因为它们总是以LRU方式插入。

六、Most Recently Used (MRU)

MRU替换策略是一种基于使用频率的缓存替换策略。它与LRU(最近最少使用)相反,LRU策略选择的是最久未被使用的条目进行替换,而MRU策略选择的是最近被使用的条目进行替换。

在MRU策略中,条目的"新鲜度"越高,即最近被使用的时间越近,它们越有可能成为替换数据块。这意味着,相对较新的条目会更容易被替换,而相对较旧的条目会更有可能保留在缓存中。

这种策略的目的是优先保留最近使用的条目,以便它们在未来可能再次被访问。较新的条目通常被认为是在短期内更有可能被频繁访问的,因此将它们视为替换数据块可以提供更好的缓存性能。

然而,MRU策略也有一些局限性。由于它偏向保留较新的条目,可能会导致较旧但仍然频繁访问的条目被替换出缓存,从而降低缓存的命中率。这在某些工作负载下可能导致性能下降。

七、Least Frequently Used (LFU)

LFU替换策略是一种基于引用频率的缓存替换策略。它根据条目被访问的次数选择替换数据块,而不考虑这些访问发生的时间或距离上次访问的时间有多久。

在LFU策略中,每当一个条目被访问时,其引用计数会增加。当缓存空间不足时,LFU策略会选择引用计数最低的条目作为替换块,即最不经常被引用的条目。这样做的目的是尽可能保留经常被访问的条目,以提高缓存的命中率。

LFU策略可以很好地适应访问模式发生变化的情况。一旦某个条目不再被访问,其引用计数会逐渐降低。在未来如果该条目再次被访问,它的引用计数将重新增加,使其有机会被保留在缓存中。

然而,LFU策略也有一些局限性。如果某个条目在缓存中一直存在但很少被访问,它的引用计数可能始终较低,导致它很难被保留在缓存中。此外,LFU策略需要维护每个条目的引用计数,这可能需要额外的计算和存储开销。

八、First-In, First-Out (FIFO)

FIFO算法按照数据进入缓存的顺序确定替换顺序。当缓存已满且需要插入新数据时,最早进入缓存的数据将被替换出去,为新数据腾出空间。这是因为最早进入缓存的数据在时间上最久远,很可能是最不常使用的数据。

FIFO算法的优点是实现简单,容易理解和预测。然而,它也有一些缺点。由于只考虑了数据的插入时间,而没有考虑数据的访问频率和重要性,FIFO算法可能会导致缓存命中率较低。如果某个数据在一开始被频繁访问,但随后很少被使用,它仍然会一直留在缓存中,占用宝贵的空间,而更重要的数据可能无法被缓存。

九、Second-Chance

Second-Chance替换策略是一种基于FIFO的缓存替换策略。它引入了一个"第二次机会"的概念,以允许某些即将被替换的条目有机会继续留在缓存中。在Second-Chance策略中,每个条目都有一个额外的位,通常称为"第二次机会位"(second chance bit)。当一个条目被插入到缓存中时,它的第二次机会位被设置为1。当需要替换一个条目时,首先检查队列的第一个条目。如果该条目的第二次机会位为1,表示它已经得到了第二次机会,那么该位会被清除,并将该条目重新插入到FIFO队列的末尾。如果第一个条目的第二次机会位为0,表示它没有得到第二次机会,那么该条目会被替换。

当发生缺失(miss)时,即需要插入一个新的条目时,该条目的第二次机会位会被清除,以确保该条目在下一次替换时不会得到第二次机会。

Second-Chance策略允许某些即将被替换的条目有机会继续留在缓存中。如果一个条目在第一次机会时没有被访问,但在第二次机会时被访问到,它的第二次机会位将被设置为1,从而使其有机会继续存在于缓存中。

十、Not Recently Used (NRU)

NRU算法通过维护每个块的一个比特位来估计块的最近使用情况。当需要替换一个块时,NRU算法会优先选择那些比特位为1的块,因为它们可能已经较久没有被引用,有较高的可能性不会在短时间内被再次引用。

在NRU算法中,当一个块被替换时,所有与其一起可能被替换的块都会使其重新引用比特位递增。这是为了确保被替换的块在下一轮替换时有更高的机会被选择,从而避免频繁替换同一块。

NRU算法的优点是实现相对简单,且能够在一定程度上近似LRU算法。然而,由于它只使用了一个比特位来判断块的使用情况,因此无法提供精确的LRU替换策略。在某些情况下,NRU算法可能会导致较低的缓存命中率。

十一、Re-Reference Interval Prediction (RRIP)

Re-Reference Interval Prediction(RRIP)是一种用于缓存替换策略的扩展,它是基于NRU(Not Recently Used,最近未使用)策略的改进。RRIP引入了重新引用预测值(RRPV),用于预测块是否在不久的将来会被重新访问。

在RRIP中,每个缓存块都被分配一个RRPV值。初始时,所有的RRPV值被设置为最大值。当一个块被访问时,它的RRPV值会被重新设置为最小值。当需要替换一个块时,通过检查所有块的RRPV值来确定被替换的块。如果存在至少一个块的RRPV值为最大值,那么选择其中一个RRPV值为最大的块进行替换。如果所有块的RRPV值都不是最大值,那么选择RRPV值最小的块进行替换。

RRPV的值表示块距离下一次访问的间隔。值越高,表示块与下一次访问的间隔越远,即块越不可能在不久的将来被重新访问。通过使用RRPV值,RRIP可以更好地预测块是否会被重新使用,并相应地进行替换。

Static RRIP(SRRIP)是RRIP的一种实现方式,它总是以相同的RRPV值插入块。在SRRIP中,所有块的初始RRPV值都设置为最大值。当一个块被访问时,它的RRPV值被重新设置为最小值。这种实现方式简化了RRIP的操作,并且在实际应用中具有较好的性能。

十二、Bimodal Re-Reference Interval Prediction (BRRIP)

Bimodal Re-Reference Interval Prediction(BRRIP)是对RRIP策略的进一步扩展,它采用了Bimodal Insertion Policy的思想。BRRIP引入了一个概率控制机制,用于决定是否插入块,这与LRU策略中的不插入块的概率相似。这个概率由双模态节流参数(btp)控制。

在BRRIP中,每个缓存块都有一个重新引用预测值(RRPV),用于预测块是否会在不久的将来重新访问。与RRIP类似,RRPV值越高表示块与下一次访问的间隔越远。然而,BRRIP通过引入双模态节流参数(btp)来控制插入块的概率。

btp参数可以取0或1两个值,分别表示插入块的概率为0和1。当btp参数为0时,BRRIP的行为类似于LRU,即不插入块。当btp参数为1时,BRRIP的行为类似于RRIP,按照RRPV值进行插入和替换。通过调整btp参数,可以在BRRIP中控制插入块的概率,从而平衡缓存的性能和命中率。

BRRIP的双模态节流参数提供了一种灵活的机制,可以在不同的工作负载和访问模式下调整插入块的概率。根据具体的应用场景和性能需求,可以调整btp参数以适应不同的情况。

相关文章:

gem5学习(20):替换策略——Replacement Policies

目录 一、Random 二、Least Recently Used (LRU) 三、Tree Pseudo Least Recently Used (TreePLRU) 四、Bimodal Insertion Policy (BIP) 五、LRU Insertion Policy (LIP) 六、Most Recently Used (MRU) 七、Least Frequently Used (LFU) 八、First-In, First-Out (FIF…...

嵌入式Qt Qt中的字符串类

一.Qt中的字符串类 QString vs string&#xff1a; QString在Qt库中几乎是无所不在的 所有的Qt图形用户组件都依赖于QString 实验1 &#xff1a;QString 初体验 #include <QDebug> void Sample_1() {QString s "add";s.append(" "); // &q…...

函数高级(C++)

师从黑马程序员 函数默认参数 在C中&#xff0c;函数的形参列表中的形参是可以有默认值的 语法&#xff1a;返回值类型 函数名 &#xff08;参数默认值 {}&#xff09; #include <iostream> using namespace std;//函数默认参数//如果我们自己传入数据&#xff0c;…...

jmeter-10调试取样器

文章目录 作用设置使用举例 作用 jmeter中添加调试取样器&#xff0c;可以用于检测测试过程的值如&#xff1a;变量、参数、系统设置等 设置 选择线程组右键 >>> 添加 >>> 取样器 >>> 调试取样器&#xff08;Debug Sampler&#xff09; jmeter …...

C#,二进制数的按位旋转(Bits Rotate)算法与源代码

1 二进制数的按位旋转 二进制数的按位旋转&#xff08;翻转&#xff09;是编程中常见的按位运算方法。 二进制数的按位旋转分为左转、右转。 左转意味着数据变大&#xff0c;右转意味着数据变小&#xff08;有损&#xff09;。 2 源程序 using System; using System.Text; us…...

解决ubuntu登录密码问题

解决ubuntu登录密码问题 不要随便删除密码&#xff0c;不要随便改密码&#xff0c;很容导致密码过期&#xff0c;或者密码无效。参考了很多人的做法&#xff0c;都没有得到解决。下面的过程&#xff0c;够详细了&#xff0c;我就是这么搞好的。 1、重启虚拟机&#xff0c;不停…...

Ubuntu忘记登录密码重置步骤

Ubuntu忘记登录密码重置步骤 1.开机界面长按shitf键&#xff0c;进入grub&#xff0c;并选择Advanced options for ubuntu&#xff0c;按下回车 2.选择一个较新版本的recovery mode&#xff0c;按下回车 3.会跑一些数据&#xff0c;等待跑完后会出现下面的界面&#xff0c;选择…...

MySQL数据库基础(五):SQL语言讲解

文章目录 SQL语言讲解 一、SQL概述 二、SQL语句分类 1、DDL 2、DML 3、DQL 4、DCL 三、SQL基本语法 1、SQL语句可以单行或多行书写&#xff0c;以分号结尾 2、可使用空格和缩进来增强语句的可读性 3、MySQL数据库的SQL语句不区分大小写&#xff0c;关键字建议使用大写…...

python-使用ffmpeg批量修改文件的后缀名

import os import subprocessdef convert_ogg_to_mp3(directory):for filename in os.listdir(directory):if filename.endswith(".ogg"):# 获取文件的完整路径file_path os.path.join(directory, filename)# 创建一个新的文件名&#xff0c;只是将扩展名从.ogg更改…...

关于jupyter的一些小笔记

关于jupyter的一些小笔记 1.Jupyter Notebook&#xff1a;单/多行注释&#xff0c;组合键&#xff1a;选中代码&#xff0c;按Ctrl /。 2.安装PHATE包 使用pip直接进行安装 pip install --user phate成功解决AttributeError: module ‘numpy’ has no attribute ‘float’. 报…...

macOS 安装 conda

macOS 安装 conda 安装 conda参考 Conda是一个开源的软件包管理系统和环境管理系统&#xff0c;用于安装和管理软件包和其依赖项。 安装 conda mkdir miniconda3 cd miniconda3 bash Miniconda3-latest-MacOSX-x86_64.sh$ conda list参考 macOS 安装 conda开始使用conda...

C++并发编程 -3.同步并发操作

本文介绍如何使用条件变量控制并发的同步操作、C 并发三剑客&#xff0c;函数式编程 一.条件变量 1.概念 C条件变量&#xff08;condition variable&#xff09;是一种多线程编程中常用的同步机制&#xff0c;用于线程间的通信和协调。它允许一个或多个线程等待某个条件的发生…...

【打工日常】使用docker部署可视化工具docker-ui

一、docker-ui介绍 docker-ui是一个易用且轻量化的Docker管理工具&#xff0c;透过Web界面的操作&#xff0c;方便快捷操作docker容器化工作。 docker-ui拥有易操作化化界面&#xff0c;不须记忆docker指令&#xff0c;仅需下载镜像即可立刻加入完成部署。基于docker的特性&…...

LGAMEFI基于BPL公链开发的第一生态:开启RWA游戏娱乐与DeFi融合的新纪元

在去中心化金融&#xff08;DeFi&#xff09;与游戏娱乐的结合趋势中&#xff0c;BPL公链上的LGAMEFI项目代表了前沿的技术革新和市场领导。这种将web2上成熟页游进行RWA链改&#xff0c;不仅仅是将游戏热门领域融合&#xff0c;更是在寻找一种全新的参与者经验&#xff0c;将玩…...

AI专题:5G-A扬帆风正劲,踏AI增长新浪潮

今天分享的是AI系列深度研究报告&#xff1a;《AI专题&#xff1a;5G-A扬帆风正劲&#xff0c;踏AI增长新浪潮》。 &#xff08;报告出品方&#xff1a;开源证券&#xff09; 报告共计&#xff1a;22页 足立连接&#xff0c;拓展算力&#xff0c;双曲线稳步发力 中兴通讯拥…...

C++Linux网络编程:poll模型和简单使用

文章目录 poll模型pollfd结构体nfds_t的定义 一个简单的poll服务器总结 poll模型 poll模型和select模型类似&#xff0c;都是在指定时间内轮询一定数量的文件描述符&#xff0c;以测试其中是否有就绪者&#xff0c;需要使用头文件poll.h&#xff1a; #include <poll.h>…...

Excel模板2:进度条甘特图

Excel模板2&#xff1a;进度条甘特图 ‍ 今天复刻B站up【名字叫麦兜的狗狗】的甘特图&#xff1a;还在买Excel模板吗&#xff1f;自己做漂亮简洁的甘特图吧&#xff01;_哔哩哔哩_bilibili 阿里网盘永久分享&#xff1a;https://www.alipan.com/s/cXhq1PNJfdm 当前效果&…...

数据结构:4_二叉树

二叉树 一.树概念及结构 1. 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个**特殊的…...

设计模式之:状态模式(State Pattern)

状态模式&#xff08;State Pattern&#xff09; 状态模式是一种行为设计模式&#xff0c;允许一个对象在其内部状态改变时改变它的行为。这种模式通过把状态的变化逻辑分布到State的子类之间&#xff0c;减少了相互间的依赖&#xff0c;使得状态的切换更加清晰。 状态模式的…...

【微服安全】API密钥和令牌与微服务安全的关系

什么是 API 密钥和令牌 API 密钥 API 密钥是一串用于识别应用程序或用户的字符串。它通常用于授权应用程序或用户访问 API。API 密钥可以是公开的&#xff0c;也可以是私有的。公开的 API 密钥可供任何人使用&#xff0c;而私有的 API 密钥只能由授权的应用程序或用户使用。 …...

Mock.js

在开发后端的应用中&#xff0c;我们使用postman来测试接口&#xff0c;观察和验证前后端之间的数据传递是否正常。 在开发前端的应用中&#xff0c;我们使用Mock.js来模拟后端服务&#xff0c;以便进行前端业务逻辑的开发和测试。 一般情况下&#xff0c;个人开发或者小团队开…...

【c++】list详细讲解

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟悉list库 > 毒鸡汤&#xff1a;你的脸上云淡…...

C#面:在.NET中 类 System.Web.UI.Page 可以被继承吗?

可以。 它是 ASP.NET WebForms中的一个重要类&#xff0c;用于表示 Web 页面。通过继承 System.Web.UI.Page 类&#xff0c;可以创建自定义的 Web 页面&#xff0c;并在其中添加自己的逻辑和功能。 继承 System.Web.UI.Page 类的好处是&#xff0c;可以重用和扩展已有的功能。…...

AI:128-基于机器学习的建筑物能源消耗预测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…...

php基础学习之可变函数(web渗透测试关键字绕过rce和回调函数)

可变函数 看可变函数的知识点之前&#xff0c;蒟蒻博主建议你先去看看php的可变变量&#xff0c;会更加方便理解&#xff0c;在本篇博客中的第五块知识点->php基础学习之变量-CSDN博客 描述 当一个变量所保存的值刚好是一个函数的名字&#xff08;由函数命名规则可知该值必…...

MongoDB聚合操作符:$acos

$acos操作符返回一个值的反余弦。从MongoDB4.2版本开始支持。 语法 { $acos: <expression> }$acos接受任何可被解析为值在-1到1之间的表达式&#xff0c;即&#xff1a;-1 < value < 1$acos返回值以弧度为单位&#xff0c;使用$radiansToDegrees操作符可以把输出…...

开源PDF工具 Apache PDFBox 认识及使用(知识点+案例)

文章目录 前言源码获取一、认识PDFBox二、导入依赖三、基础功能demo1&#xff1a;读取pdf所有内容demo2&#xff1a;读取所有页内容&#xff08;分页&#xff09;demo3&#xff1a;添加页眉、页脚demo4&#xff1a;添加居中45文字水印demo5&#xff1a;添加图片到右上角 参考文…...

微软.NET6开发的C#特性——委托和事件

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;看到不少初学者在学习编程语言的过程中如此的痛苦&#xff0c;我决定做点什么&#xff0c;下面我就重点讲讲微软.NET6开发人员需要知道的C#特性&#xff0c;然后比较其他各种语言进行认识。 C#经历了多年发展…...

卷积神经网络的基本结构

卷积神经网络的基本结构 与传统的全连接神经网络一样&#xff0c;卷积神经网络依然是一个层级网络&#xff0c;只不过层的功能和形式发生了变化。 典型的CNN结构包括&#xff1a; 数据输入层&#xff08;Input Layer&#xff09;卷积层&#xff08;Convolutional Layer&#x…...

python:使用GDAL库读取遥感影像指定行列数/经纬度坐标的像素值

作者:CSDN @ _养乐多_ 本文将介绍如何使用GDAL库来读取单波段遥感影像数据,如何获取指定行列位置的像素的经纬度坐标,并根据像素行列数或者经纬度坐标获取像素值。代码由python实现。 文章目录 一、读取影像二、获取指定行列位置的像素坐标三、根据地理坐标获取像素值四、根…...

Redis篇----第一篇

系列文章目录 文章目录 系列文章目录前言一、什么是 Redis?二、Redis 与其他 key-value 存储有什么不同?三、Redis 的数据类型?四、使用 Redis 有哪些好处?五、Redis 相比 Memcached 有哪些优势?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住…...

C语言-----用二维数组解决菱形的打印问题

1.打印菱形&#xff0c;多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成“X”的反斜线和正斜线的长度。 #include <stdio.h>int main() {int n0;while(scanf("%d",&n)! EOF){int i0;int j0;f…...

.NET Core WebAPI中使用swagger版本控制,添加注释

一、效果 二、实现步骤 在代码中添加注释 在项目属性中生成API文档 在Program中注册Swagger服务并配置文档信息 // 添加swagger注释 builder.Services.AddSwaggerGen(x > {x.SwaggerDoc("v1", new OpenApiInfo { Title "Swagger标题", Version "…...

css篇---移动端适配的方案有哪几种

移动端适配 移动端适配是指同一个页面可以在不同的移动端设备上都有合理的布局。主流实现的方案有 响应式布局通过rem或者vw,vh 等实现不同设备有相同的比例而实现适配 首先需要了解viewport 【视口】 视口代表了一个可看见的多边形区域&#xff08;通常来说是矩形&#xff0…...

一、部署Oracle

部署Oracle 一、Docker部署1.Oracle11g1.1 测试环境1.1.1 拉取镜像1.1.2 启动容器1.1.3 配置容器环境变量1.1.4 修改sys、system用户密码1.1.5 创建表空间1.1.6 创建用户并授权1.1.5 使用DBeaver测试连接 二、安装包部署 一、Docker部署 1.Oracle11g 1.1 测试环境 当前只能用…...

11-编写自动化测试

上一篇&#xff1a; 10-通用类型、特质和生命周期 Edsger W. Dijkstra 在 1972 年发表的文章《The Humble Programmer》中说&#xff1a;"程序测试可以非常有效地显示错误的存在&#xff0c;但对于显示错误的不存在却无能为力。这并不意味着我们不应该尽可能多地进行测试&…...

爱上JVM——常见问题(一):JVM组成

1 JVM组成 1.1 JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f; 难易程度&#xff1a;☆☆☆ 出现频率&#xff1a;☆☆☆☆ JVM是什么 Java Virtual Machine Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 好处&#xff1a; 一次编写&…...

C#系列-EF扩展框架AutoMapper应用实例(40)

AutoMapper是一个对象到对象的映射器&#xff0c;它用于将一个对象的属性映射到另一个对象的属性。它主要用于在应用程序的不同层之间传输数据时&#xff0c;自动将数据传输对象&#xff08;DTOs&#xff09;映射到领域模型&#xff0c;或者将领域模型映射到视图模型等。 下面…...

DataX源码分析-插件机制

系列文章目录 一、DataX详解和架构介绍 二、DataX源码分析 JobContainer 三、DataX源码分析 TaskGroupContainer 四、DataX源码分析 TaskExecutor 五、DataX源码分析 reader 六、DataX源码分析 writer 七、DataX源码分析 Channel 八、DataX源码分析-插件机制 文章目录 系列文章…...

容器高级知识: 适配器模式与 Sidecar 模式的区别

适配器模式与 Sidecar 模式的区别 在 Kubernetes 中&#xff0c;适配器模式和 Sidecar 模式都是扩展您的主应用程序容器功能的方法&#xff0c;但它们具有不同的目的和功能&#xff1a; Sidecar 模式&#xff1a; 通用目的&#xff1a; 为主应用程序提供 补充功能&#xff0…...

使用Xdisplay将ipad作为扩展显示器Agent闪退问题

1. 正常流程贴子挺多&#xff0c;可以参考这几篇 https://blog.csdn.net/Shi_Xueqing/article/details/129744496 如何将ipad作为win10的扩展屏&#xff08;使用USB线连接&#xff09;_ipad win usb 上网-CSDN博客 2.在进行pc端软件设置的时候发生闪退 解决方法&#xff1a…...

DVXplorer事件相机入门

DV官方文档&#xff1a;Get Started DV (inivation.gitlab.io) DV事件相机的ROS包&#xff1a;https://github.com/uzh-rpg/rpg_dvs_ros 事件相机的资源汇总&#xff1a;https://github.com/uzh-rpg/event-based_vision_resources 1.DV事件相机ROS包驱动程序安装 注意&#x…...

ubuntu屏幕小的解决办法

1. 安装vmware tools , 再点自适应客户机 执行里面的vmware-install.pl这个文件 &#xff1a;sudo ./vmware-install.pl 执行不了可以放到家目录&#xff0c;我放在了/home/book 里面 最后点这个自适应客户机 然后我这里点不了是因为我点了控制台视图和拉伸客户机&#xff0c…...

黑群晖一键修复:root、AME、DTS、转码、CPU型号等

食用方法&#xff1a;SSH连接群晖使用临时root权限执行 AME3.x激活补丁 只适用于x86_64的&#xff1a;DSM7.x Advanced Media Extensions (AME)版本3.0.1-2004、3.1.0-3005 激活过程需要下载官方的解码包&#xff0c;过程较慢&#xff0c;耐心等待。。。 DSM7.1和7.2的AME版…...

Repo命令使用实例(三十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…...

2024年华为OD机试真题-分披萨-Python-OD统一考试(C卷)

题目描述: “吃货”和“馋嘴”两人到披萨店点了一份铁盘(圆形)披萨,并嘱咐店员将披萨按放射状切成大小相同的偶数扇形小块。但是粗心服务员将披萨切成了每块大小都完全不同奇数块,且肉眼能分辨出大小。 由于两人都想吃到最多的披萨,他们商量了一个他们认为公平的分法:从…...

找负环(图论基础)

文章目录 负环spfa找负环方法一方法二实际效果 负环 环内路径上的权值和为负。 spfa找负环 两种基本的方法 统计每一个点的入队次数&#xff0c;如果一个点入队了n次&#xff0c;则说明存在负环统计当前每个点中的最短路中所包含的边数&#xff0c;如果当前某个点的最短路所…...

无人机飞控算法原理基础研究,多旋翼无人机的飞行控制算法理论详解,无人机飞控软件架构设计

多旋翼无人机的飞行控制算法主要涉及到自动控制器、捷联式惯性导航系统、卡尔曼滤波算法和飞行控制PID算法等部分。 自动控制器是无人机飞行控制的核心部分&#xff0c;它负责接收来自无人机传感器和其他系统的信息&#xff0c;并根据预设的算法和逻辑&#xff0c;对无人机的姿…...

关于内存相关的梳理

1 关键字 总结 &#xff08;lowmemory&#xff0c;anr in&#xff09; 2 知识储备 虚拟机原理 垃圾回收算法 又包含标记 和清除两种算法 标记&#xff1a;程序计数器-已过时&#xff0c;可达性分析 具体可见 http://help.eclipse.org/luna/index.jsp?topic%2Forg.ec…...

7.JS里表达式,if条件判断,三元运算符,switch语句,断点调试

表达式和语句的区别 表达式就是可以被求值的代码比如什么a 1 语句就是一段可以执行的代码比如什么if else 直接给B站的黑马程序员的老师引流一波总结的真好 分支语句 就是基本上所有的语言都会有的if else 语句就是满足不同的条件执行不同的代码&#xff0c;让计算机有条件…...