【MIT 6.5840/6.824】In Search of an Understandable Consensus Algorithm 学习笔记

从零开始学习使用 AI 欢迎踏入ClaudeCode未来世界,开启与AI协作的全新旅程。无论你是零基础新手、开发者,还是非程序员,都能通过实战项目快速掌握智能体协作技能——不再只是提问,而是指挥AI完成复杂任务。你将化身主角,在16个级别、200+实践中成长为高效创造者。真正的优势不再是会用工具,而是懂得如何让智能体为你工作。取代你的不是AI,而是会用AI的人。现在,故事从你开始👇 阅读详情

6.5840/6.824 Lab与笔记汇总
本文为笔者阅读论文In Search of an Understandable Consensus Algorithm过程中的随笔记录,较为随意,希望能为大家提供一点理解上的帮助

1 Introduction

一致性算法允许一组机器作为一个连贯的群体工作,可以在一些成员的失败时仍保持正常运行。Paxos一直占着一致性算法的主导地位,但是它非常难以理解,而且为了支持实际系统,它的架构需要进行复杂的修改。
本文提出的Raft则是一种容易理解的一致性算法。Raft采用了特殊的技术来改善可理解性,包括分解(Raft将一致性的关键元素拆分为leader election、log replication和safety)和状态空间缩减(Raft降低了不确定性的程度以及服务器相互不一致的方式)
Raft在许多方面与现有的一致性算法相似,但也有一些新颖的特点:

  • Strong leader:Raft使用比其他一致性算法更强的领导形式,比如日志条目只从leader流向其他服务器
  • Leader election:Raft使用随机计时器来选择leader
  • Membership changes:Raft的更改集群中服务器集的机制使用了一种新的联合一致性方法,其中两个不同配置的大多数服务器会重叠,这允许集群在配置更改期间继续正常运行

2 Replicated state machines

复制状态机用于在分布式系统中提供容错。复制状态机通常使用replicated log实现,如下图。每个服务器都存储一个log,其中包含一系列命令,服务器中的状态机会按顺序执行这些命令。由于每个log都以相同的顺序包含相同的命令,因此每个状态机都会处理相同的命令序列,最终的输出也相同。
一致性算法的工作之一就是保持replicated log的一致性,server中的一致性模块会从客户端接收命令,并将命令追加到log中。它会与其他server的一致性模块交互,确保每一个log的命令序列都一致。正确复制命令后,每个server的状态机都会按照log中的命令顺序处理它们,然后将输出返回给客户端。
在这里插入图片描述
实际系统中的一致性算法通常具有以下属性:

  • 它们会确保在非拜占庭条件(每个节点均遵循协议)下的安全性,包括网络延迟、分区和丢包、重复和重新排序
  • 只要集群中的大多数服务器都可以运行并且可以相互通信以及与客户端通信,它们就可以正常工作
  • 它们不依赖于时间来确保日志的一致性
  • 只要大多数集群中的服务器响应了单轮远程过程调用,命令就可以完成;少数慢速服务器不影响整体系统性能

3 What’s wrong with Paxos?

第一个缺点是Paxos非常难以理解。
Paxos的第二个问题是它没有为构建实际系统提供良好的基础。Lamport的描述主要是关于single-decree的Paxos;他勾勒了multi-Paxos的可能方法,但许多细节被遗漏了。
结论就是,Paxos既没有为系统构建也没有为教育提供良好的基础。

4 Designing for understandability

Raft使用了两种普遍适用的技术,第一种是众所周知的问题分解方法(只要可能,就将问题分解成可以相对独立地解决、解释和理解的单独部分),如Raft中,分离了leader election、log replication、safty和membership changes。第二种方法是通过减少要考虑的状态数量来简化状态空间,使系统更加连贯,并尽可能消除不确定性。
尽管在大多数情况下,我们试图消除非确定性,但在某些情况下,非确定性实际上提高了可理解性。特别是,随机方法引入了非确定性,但它们倾向于通过以类似的方式处理所有可能的选择来减少状态空间。本文使用随机化来简化Raft的leader election算法。

5 The Raft consensus algorithm

Raft通过首先挑选一个杰出的leader来实现一致性,然后赋予leader管理replicated log的完全责任。leader接收来自客户端的log条目,然后将它们复制给其他服务器节点,并告诉服务器们何时启动状态机是安全的。这简化了replicated log的管理。leader可能失败或与其他服务器断开连接,在这种情况下,会选出新的leader。

5.1 Raft basics

一个Raft集群包含多个服务器;通常是五个,它允许系统容忍两次故障。在任何给定时间,每个服务器都处于三种状态之一:leader、follower、candidate。在正常运行中,只有一个leader,所有其他服务器都是follower。follower是被动的:他们自己不发出请求,只是回应leader和candidate的请求。leader处理所有的客户端请求(如果客户端请求follower,follower将其重定向到leader)。第三个状态,candidate,用于挑选新的leader,将在5.2节中讲述。三种状态的转换如下图所示。
在这里插入图片描述
Raft将时间划分为任意长度的term,如下图所示。term用连续的整数编号。每一个term都以election开始,其中一个或者多个candidate试图成为leader。如果一个candidate赢得了选举,那么将在这个term的剩余时间内作为leader。有时候选举无法选出leader,就像下图t3一样,这时会很快进行下一次选举。Raft确保在给定的term中最多只有一个leader。
terms在Raft中充当逻辑时钟,它们允许服务器检测过时的信息,例如过时的leader。每个服务器都存储一个当前term编号,该编号随着时间的推移单调增加。每当服务器通信时,都会交换当前term编号;如果一台服务器的当前term编号小于另一台服务器的当前term编号,则它会将其当前term编号更新为较大的值。如果candidate或leader发现其term已过期,它会立即变为follower。如果服务器收到带有陈旧term编号的请求,它会拒绝该请求。
在这里插入图片描述
Raft服务器之间采用RPC进行通信,基础的一致性算法只需要两种类型的RPC。RequestVote RPC由candidate在选举期间发起;AppendEntries RPC由leader发起,用于复制log条目并提供一种heartbeat形式(5.3节讲述)。如果服务器没有及时收到回复,它们会重试RPC,同时它们会并行发出RPC以获得最佳性能。

5.2 Leader election

Raft采用heartbeat机制来触发leader选举。服务器会作为follower启动,如果从leader或者candidate收到有效的RPC,就一直保持follower状态。leader会定期向所有follower发送heartbeat信号(没有携带log条目的AppendEntries RPC调用),以保持其权威。如果follower在一段时间内(election timeout)没有收到任何信号,那么它会假设当前没有leader,并开始选举新的leader。
为了开始新一轮选举,follower增加当前term编号,并转为candidate状态。然后,它为自己投票,并向集群中的每个其他服务器并行发出RequestVote RPC。candidate状态会一直持续,直到以下条件的其中一个成立:

  • 它赢得选举
  • 其他服务器赢得选举
  • 一段时间过去后,没有胜利者

如果candidate在同个term内收到了集群中大多数机器的投票,那么赢得选举,就成为leader。它会向所有其他服务器发送heartbeat信号,以建立权威防止新的选举。
在等待投票时,candidate可能会收到另一个自称leader的服务器的AppendEntries RPC调用。如果该leader的term编号大于或等于candidate的term编号,那么candidate会承认该leader是合法的,并回到follower状态。如果RPC编号小于candidate的当前编号,则拒绝该RPC并继续处于candidate状态。
可能会有平票的情况,这时所有candidate都会超时,并开启新一轮选举。Raft使用随机选举超时来确保平票情况很少发生,如果发生了也可以快速解决。上面提到的election timeout会从固定间隔(例如150-300ms)中随机选择,这分散了服务器启动选举,因此大多数情况下只有一台服务器会超时,成为leader,然后在其他服务器超时前发送heartbeat信号确立权威。

5.3 Log replication

一旦选择了leader,它就开始为客户端请求提供服务。每个客户端请求都包含一个命令。leader将该命令作为新条目附加到其日志中,然后向每个其他服务器并行发出AppendEntries RPC以复制该条目。当条目被安全复制时,leader将该条目应用于其状态机,并将执行结果返回给客户端。如果follower崩溃或运行缓慢,或者如果网络数据包丢失,leader会无限期地重试AppendEntries RPC(即使它已经响应客户端),直到所有follower最终存储所有日志条目。
日志的组织形式如下图所示。每个日志条目都存储一个状态机命令以及一个term编号(leader收到该日志条目时的term编号)。日志条目中的term编号用于检测日志之间的不一致,每个日志条目也有一个整数索引。
在这里插入图片描述
leader决定日志条目何时能够安全地应用到状态机,这种安全的条目称为committed的条目。Raft保证committed的条目是持久的,并且最终将由所有可用的状态机执行。一旦创建条目的leader在大多数服务器上复制了该日志条目,就会提交日志条目,同时提交leader日志中的所有先前条目。leader需要跟踪它所提交条目的最高索引(如上图中的7),并将该索引包含在未来的AppendEntries RPC中,以便被其他服务器得知。一旦follower得知某条日志条目已提交,它就会将该条目应用到其本地状态机(按日志顺序)。
本文设计了Raft日志机制来保持不同服务器上日志之间的高度一致性。Raft维护以下属性成立:

  • 如果不同日志中的两个条目具有相同的索引和term编号,那么它们存储相同的命令
  • 如果不同日志中的两个条目具有相同的索引和term编号,则两个日志在该条目前面的所有条目都是相同的

leader在一个term中最多创建一个具有给定索引的日志条目,且日志条目永远不会改变它们的位置,故第一个属性会成立。第二个属性则由AppendEntries执行的简单一致性检查来保证成立。当leader发送一个AppendEntries RPC时,它会将新条目直接前驱条目的索引和term编号携带过去。如果接收到RPC的follower在其日志中没有找到该前驱条目,那么会拒绝接收新条目。这个简单的一致性检查保证了上述两个属性在新条目追加后依然成立。因此,当AppendEntries成功返回时,leader就会通过新条目知道follower的日志与自己的日志相同。
正常操作下,leader的日志和follower的日志均保持一致,故AppendEntries的一致性检查均能通过。但是,leader的崩溃可能导致日志的不一致(旧leader可能没有完全复制日志中的条目)。下图说明了follower日志与leader日志不同的几种可能不一致情况。
在这里插入图片描述
在Raft中,leader通过强迫follower复制leader的日志来处理不一致的情况。为了使follower日志与自己的日志一致,leader需要找到两个日志中最新的一致点,删除该点后follower的所有日志条目,并将该点后leader的所有条目发送给follower。具体实现上,leader为每一个follower维护了一个变量nextIndex,表示下一次发送给follower的条目索引,初始化为leader日志中的最高索引+1(如上图中的11)。如果leader与某个follower的日志不一致,那么下一次AppendEntries RPC将会失败,此时leader会递减nextIndex并重试RPC。最终nextIndex将指向最新一致点,RPC也将成功,这将覆盖follower中不一致的条目,并复制leader中的条目。
使用这种机制,新的leader在掌权时不需要采取任何特殊操作来恢复日志一致性。它只是开始正常操作,日志将自动收敛以响应一致性检查的失败。leader从不覆盖或删除自己日志中的条目。

5.4 Safety

前面描述了Raft如何选择leader和复制日志条目。然而,到目前为止描述的机制还不足以确保每个状态机均以相同的顺序执行完全相同的命令。例如,当leader提交多个日志条目时,follower可能不可用,然后它可以被选为leader并用新条目覆盖这些已提交的旧条目;因此,不同的状态机可能会执行不同的命令序列。
本节通过添加对哪些服务器可以被选为leader的限制来完成Raft算法。该限制确保任何给定term的leader都包含以前term已提交的所有条目。

5.4.1 Election restriction

Raft使用投票过程来阻止未包含所有提交条目的candidate赢得选举。candidate必须联系集群中的大多数服务器才能成为leader,如果candidate的日志至少与大多数服务器的日志一样up-to-date(下面有精确的定义),那么可以认为它保存了所有已提交的条目。RequestVote RPC实现了这一机制:RPC会包含candidate的日志信息,如果接收到该RPC的服务器认为自己的日志比candidate的日志更加up-to-date,那么该服务器不会给candidate投票。
Raft通过比较日志中最后一个条目的索引和term编号来确定两个日志中的哪一个更加up-to-date。如果日志的最后一个条目具有不同的term编号,那么具有较大term编号的日志更加up-to-date。如果日志以相同的term编号结束,那么哪个日志的条目更多,哪个就更加up-to-date。

5.4.2 Committing entries from previous terms

下图展示了一个问题,存在一个旧日志条目已经被复制到大多数机器上,但没有被commit,最终被后来的leader覆盖的情况。
一开始S1是leader,并且在term 2(a)追加了一个新日志条目,索引为2。在term 3(b)时,S1崩溃了,S5被选举为新的leader(投票来源于自己、S3和S4),然后接受了一个新日志条目,并追加到自己的日志上。在term 4(c)时,S5崩溃了,S1重启并被选举为新的leader,同时,继续copy它在term 2接收到的日志条目,而且已经copy到大多数服务器上了,但是还没来得及commit。在term 5时,如果S1崩溃了,就会出现如下图(d)的结果,S5会被选举为新的leader,并且将覆盖所有服务器的日志。
在这里插入图片描述
为了消除上述问题,Raft不通过计算条目的副本来提交之前term所接收到的日志条目。只有leader在当前term所接收到的日志条目才通过计算副本来提交;一旦以这种方式提交了当前term的条目,那么所有先前的条目都会间接提交。

5.5 Follower and candidate crashes

follower和candidate的崩溃比leader崩溃更容易处理,并且它们都以相同的方式处理。如果某个follower或candidate崩溃,那么发送给它的RequestVote和AppendEntries RPC将失败。Raft通过持续重试来处理这些失败;如果崩溃的服务器重新启动,那么RPC将成功完成。如果服务器在完成RPC后但在响应之前崩溃,那么它将在重新启动后再次收到相同的RPC。由于Raft的RPC是幂等的,所以这没有什么影响。例如,如果follower收到一个包含其日志中已经存在的日志条目的AppendEntries请求,它会忽略新请求中的条目。

5.6 Timing and availability

本文对Raft的要求之一是安全性不能取决于时间:系统不能仅仅因为某些事件发生得比预期的更快或更慢就产生不准确的结果。然而,可用性(系统及时响应客户端的能力)不可避免地取决于时间。例如,如果message交换比服务器崩溃的典型时间更长,candidate就不会赢得选举;没有稳定的leader,Raft就无法取得进展。
leader选举是Raft中时间最关键的方面。只要系统满足以下时间要求,Raft将能够选举和保持一个稳定的leader:
broadcastTime << electionTimeout << MTBF
其中,broadcastTime是服务器向集群中每台服务器并行发送RPC并接收它们响应所花费的平均时间;electionTimeout是5.2节描述的election timeout;MTBF是单个服务器故障之间的平均时间间隔(多久发生一次故障)。boardcastTime应该比electionTimeout少一个数量级,这样leader就可以在follower启动新的选举前,可靠地发送heartbeat信号,从而阻止follower启动新选举。electionTimeout也应该比MTBF少几个数量级,使得系统稳步进展,当leader崩溃时,系统将在election timeout期间不可用,希望这只代表很短的时间。
broadcastTime和MTBF是不确定的系统属性,而electionTimeout是可配置的。Raft的RPC通常需要将信息持久化到稳定存储中,因此broadcastTime可能在0.5毫秒到20毫秒之间,具体取决于存储技术。因此,electionTimeout可以在10毫秒到500毫秒之间进行配置。通常,服务器的MTBF为几个月或更长时间,很容易满足时序要求。

第28篇 sw放样特征矩形-圆-矩形学习笔记 本例演示三轮廓放样:先画中心对齐的100×100矩形草图,再在偏移100的基准面上绘制圆,最后在另一基准面画矩形。通过依次选择三个轮廓并正确设置连接点,实现矩形→圆→矩形的平滑过渡,注意连接点位置避免扭曲。 阅读详情

相关推荐

RK3588上rknn_toolkit_lite2报错解决:手把手教你更新librknnrt.so的正确姿势

本文针对在RK3588平台上使用rknn_toolkit_lite2时遇到的“Invalid RKNN model version”等常见错误,提供了完整的诊断与解决方案。文章深入剖析了RKNN生态系统各组件(如librknnrt.so、RKNN Server)版本不兼容的根源,并手把手指导如何安全、正确地更新librknnrt.so运行时库,确保AI模型在RK3588 NPU上实现高效推理。

weixin_29189003的博客 520

「论文自译」MIT 6.824 In Search of an Understandable Consensus Algorithm (Extended Version)

Raft 论文的自译

士全的优快云,用心连载,欢迎关注 782

知识图谱本体建模之RDF、RDFS、OWL详解

(一)知识图谱本体建模之RDF、RDFS、OWL详解 1.语义网体系 知识图谱于2012年由Google提出,并不是新概念,而是由语义网络(Semantic Network)衍生而来。语义网络由相互连接的节点和边组成,节点表示概念或者对象,边表示他们之间的关系。RDF,RDFS与OWL都是基于语义网的知识表示框架,在节点和边的取值上做了约束,制定了统一标准,为多源数据的融合提供了便利。RDF,RDFS/OWL 属于语义网技术栈,它们的提出,使得语义网克服了语义网络的缺点。其语义网技术栈如下所示。 2.RD

周周的专栏 1万+

Raft 共识算法详解:Leader 选举、日志复制与安全性保证

本文基于 InterviewGuide(阿秀的学习笔记)仓库校招八股文"系统设计"系列中的 [Raft 专题](https://link.gitcode.com/i/d943607f3922292a9897f8e3e1ce6b3c),系统讲解 Raft 这一工程上广泛使用的强一致性、去中心化、高可用分布式共识协议:从节点状态机与 term 任期模型,到 Leader 选举的完整流程与平票(spli

gitblog_00882的博客 643

FPGA开发者必看:手把手教你用Xilinx ERNIC IP实现RoCE v2网络加速(附PG332文档解读)

本文详细解析了Xilinx ERNIC IP在FPGA平台上实现RoCE v2网络加速的全流程,包括架构设计、Vivado工程配置、驱动开发与性能调优。通过PG332技术文档的实践指导,帮助开发者快速构建低延迟、高性能的网络加速方案,适用于数据中心和边缘计算场景。

weixin_29168813的博客 664

嵌入式开发必看:STM32 DMA双缓冲配置全攻略(含CubeMX教程)

本文详细解析了STM32 DMA双缓冲机制的原理与优势,并提供了基于CubeMX的完整配置教程。通过硬件自动切换两个缓冲区,实现DMA传输与CPU处理的真正并行,有效降低中断频率,提升高速数据采集、音频流处理等场景下的系统效率和实时性。

weixin_29212429的博客 173

MySQL建库建表操作学习笔记

SQL(Structured Query Language,结构化查询语言)是用于在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。:用于定义对数据库对象(库、表、列、索引)的操作,如 CREATE、DROP、ALTER、RENAME、TRUNCATE 等。保存可变长度的字符串(可包含字母、数字以及特殊字 符)。:用于定义对数据库记录的操作,如 INSERT、DELETE、UPDATE、SELECT 等。:用于定义对数据库、表、字段、用户的访问权限和安全级别,如 GRANT、REVOKE 等。

Eternitycai的博客 221

YOLO11 锚框机制全解析:从改进 K-means 聚类到自适应优化,附多场景实战(附代码)

摘要 YOLO11的锚框机制采用"自适应、动态化、场景感知"的设计理念,通过数据驱动的锚框生成、多尺度感知分配和实时优化策略,显著提升目标检测性能。相较于早期YOLO版本,YOLO11的锚框完全基于训练集目标分布自适应生成,并引入智能分配策略,使不同尺寸目标获得最优匹配。技术架构包含自适应锚框生成、多尺度分配器和动态优化模块,通过改进的K-means聚类和交并比计算实现精准匹配。YOLO11锚框机制在检测精度、训练稳定性和场景适应性方面均有显著提升,为复杂场景下的目标检测提供更优解决方案

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1318

2026.11.7 AI学习总结

110 你 14b 模型权重本身就要约 8.8GB,默认上下文(Ollama 在 16GB 卡上可能给到 4K)加上 KV Cache 就爆了。比如设成 2048,你输入了 500 个 token 的问题,那模型最多还能生成 1500 个 token 的回答。超出部分会被截断,模型就"看不见"了。4 如果 14b 跑起来后发现它"忘事",再逐步往上加,比如先试 4096。,根据注意力头的重要性动态分配缓存资源,重要的留显存,不重要的下沉。,单位是 token,表示模型这一次推理最多能同时"看到"多少内容。

qq_41181702的博客 366

YOLOv11模型改进-模块-引入空间池化模块StripPooling 解决遮挡、小目标

本文介绍了一种新的空间池化策略,称为,用于场景解析。结构:包括两个平行路径,分别进行水平和垂直方向的条带池化,然后通过1D卷积层进行特征调整。:结合了条带池化和传统的空间池化,分别用于捕捉长距离和短距离的依赖关系。作用捕捉长距离依赖:通过长条形的池化窗口,有效捕捉分布离散的区域之间的关系。避免不相关信息干扰:窄条形的池化窗口有助于捕捉局部上下文,防止不相关区域干扰标签预测。提高场景解析性能:在多个基准数据集上,证明了这种方法能够显著提升场景解析的效果。

qq_64693987的博客 4204

【YOLOv11改进- 主干网络】YOLOv11+RepViT: 从ViT的角度重新审视Mobile的CNN助力YOLOv11有效涨点;

本文给大家带来的改进内容是在YOLOv11中更换主干网络为RepViT,助力YOLOv11有效涨点,论文通过集成轻量级 ViT 的高效架构设计,逐步增强了标准轻量级 CNN(即 MobileNetV3)的移动友好性。这最终产生了一个新的纯轻量级 CNN 系列的主干网络。

qq_41304809的博客 785

【FreeRTOS源码学习笔记】任务创建

【FreeRTOS源码学习笔记】任务创建

2502_90565057的博客 459

复旦微FMSH_Procise安装全流程详解:从环境配置到实战避坑指南

通过本文的全流程解析+实战技巧,开发者可快速掌握Procise在复旦微芯片开发中的核心应用。未来随着AKConv轻量级架构(参考往期文章)等创新技术的融入,国产芯片开发生态将更加完善。立即关注本专栏,获取最新多镜像切换指南与Linux SDK实战教程!扩展阅读复旦微在线升级BOOT.BIN全解析H7-TOOL实现复旦微脱机烧录(注:本文实验环境为Windows 10 x64 + FMQL45T-CORE开发板,部分操作可能因版本更新调整)立即行动下载本文配套配置文件:[GitHub链接]加入技术交流群。

QQ_778132974的博客 3232

Flink 学习日志 03:自定义一个SourceFunction,完成对Redis中数据的读取

本文介绍了在Flink中自定义SourceFunction读取Redis数据的完整流程:通过Jedis客户端连接WSL2中的Redis服务,编写RedisSource实现循环读取所有Key-value并逐条输出,结合Thread.sleep()实现每秒一条的流式效果。关键步骤包括环境准备、添加Jedis依赖、配置IDEA运行时加载provided依赖,并注意生产环境中应避免使用阻塞的keys *,改用scan命令。最终实现动态读取、实时打印,验证了Flink与Redis的数据集成能力。

木木的学习笔记 405

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

邓明 Agent 系统面试-意图识别学习笔记

不要只是做意图识别而不做测评,就好像要评估 RAG 准确性,在接口服务要测试响应时延,超时控制等等,这里也要关注意图识别准确率,如果面试官认为项目指标太高是在吹牛,关键就是回答因为 Agent 解决的是特定领域的意图识别,识别场景单一,另外就是因为用户输入相对简单。意图识别影响 prompt/spec 的加载,意图识别影响上下文组织,意图识别影响工具选择,意图识别影响 prompt 建议,意图识别得到的意图不是让模型随机生成而是候选类别里去做选择。2.意图识别的原因,以及意图识别得到的是什么?

m0_57222081的博客 212

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java 多态 学习笔记

多态是面向对象编程的重要特性,指同一操作作用于不同对象时产生不同行为。其核心在于“父类引用指向子类对象”,结合方法重写实现运行时动态绑定。多态使代码更灵活、可扩展,如用Person p = new Student();统一处理各类人员注册,无需修改调用逻辑。但多态无法直接调用子类特有方法,需通过instanceof判断并强制转换。编译时看左边(类型),运行时看右边(实际对象),实现解耦与维护便利。

AA_AA114514的博客 337

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

CMake学习

CMake如何编译成库?1. 为什么要有库?库就是预先写好,编译好的代码集合。存在的意义,1)避免重复造轮子和重复编译,库是,你的代码在编译时直接链接它,不需要把库的源码重新编译一遍,大大节省了编译时间。;2):编译成库让别人可以直接调用我的函数,但看不到cpp源码,看不到里面的逻辑。3):大项目可以拆分给不同的团队开发不同的库,最后拼在一起。静态库:就是在程序编译和链接阶段,把库里被用到的代码部分,像打包裹一样,直接复制粘贴到最终的可执行文件(如.exe或 Linux 下的无后缀文件)里面。

m0_56487684的博客 191

商业经济学学习资料

商业经济学学习资料

weixin_29403917的博客 279

将物理先验嵌入机器人学习:从经典力学到 VLA 与 WAM

本文综述了将物理先验嵌入机器人学习的三条路径:数据与表示、模型架构、训练损失,强调其位置决定约束效力。通过夹取软物体案例,阐明运动学、动力学、接触与材料特性在任务中的分层作用。指出物理先验非万能,需匹配实际条件;强约束可加速学习,但误用会引入偏差。提出“有效刚度”等概念,强调主动探测与参数辨识的重要性,并警示仅靠单一方法无法保障安全执行,需结合在线验证与控制闭环。

lovely_yoshino的博客 715

【学习笔记】51单片机 模块化编程

模块化编程:把各个模块的代码放在不同的c文件里,在.h文件里提供外部可调用函数的声明,在其他.c文件想使用其中的代码时,只需要#include"xxx.h"文件即可。传统方式编程:所有的函数均放在main.c中,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码组织和管理,而且很影响编程者的思路。使用LCD602液晶屏作为调试窗口,提供类似printf函数的功能,可实时观察单片机内部数据的变换情况,便于调试和演示。使用到的.h文件必须要放在编译器可寻找到的地方(工程文件夹根目录,安全目录,自定义)

2601_96469072的博客 221

Linux网络学习【深入理解多路转接epoll】

本文围绕 Linux 多路转接 epoll 展开,以“设计动机—核心机制—触发模式—代码实践”为主线,对比 select、poll 的监听管理与就绪检查方式,解析关注集合、就绪列表及核心接口,重点讲解水平触发与边缘触发的行为差异,以及边缘触发配合非阻塞读写的处理要点。结合多连接服务器实践,梳理事件注册、连接接收、部分收发、可写事件按需监听及断开清理流程,厘清就绪通知与操作完成的区别,分析常见错误与性能影响因素,帮助读者建立从事件循环到连接管理的完整认识,为高并发服务器与事件驱动框架开发打下基础。

承于所学,探技术之渊;以代码求政,寻成长之道。 1万+

正则表达式学习笔记 02:基础语法

正则表达式是描述字符匹配规则的迷你语言,由普通字符和元字符组成。普通字符直接匹配自身,而元字符如.、*、+、^、$等具有特殊含义,用于控制匹配模式。常见功能包括任意字符匹配、字符类、预定义类(如\d)、量词、位置锚点、分组与捕获、环视断言及反向引用。需注意,若要匹配元字符本身,必须使用转义符\。例如,\.可匹配字面点号。

菜鸟的专栏 173

为什么学习 GUI 程序设计:从 Swing 入门桌面界面开发

学习GUI程序设计能让程序从“能用”走向“好用”,提升用户体验与开发能力。选择Java Swing作为入门,因其随JDK自带、跨平台一致、组件完整且学习曲线平缓。通过掌握容器、组件、布局与事件四大核心概念,结合最小示例实践,可快速构建交互界面。建议循序渐进:运行示例→熟悉组件→理解事件→组合布局→完成小项目(如待办清单),夯实桌面应用开发基础。

xyouyuweizhu的博客 108

ES6:Iterator与Generator函数学习及Generator函数和async实现异步编程理解

几个概念:可迭代对象是指具有迭代器接口的对象: 实现类数组使用 for of 循环 对象无法使用数组的迭代器。 generator 函数类似遍历器函数,返回一个迭代器对象; 该对象调用 方法时,会把 后面的表达式作为值 ,并执行当前指针与下一步指针之间的程序。 generator 实现迭代器函数 后面跟的内容为 得到的 值。流程:循环 会调用 generator 函数,返回一个 iterator 对象, 方法由 generator 内部的 决定。 Gene

2403_87566238的博客 215

【学习笔记】51单片机 按键控制LED流水灯模式&定时器时钟

在下面去给他写中断子函数,他会在main中去到Timer0这个子函数当中去,再接着跳转回来。再TMOD上,这个是不可位寻址的,必须八位同时复制,如果同时使用定时器1和定时器0,先配置定时器1再去配置定时器0会把 之前前定时器1的更新掉,我们去给他让他只去执行一部分。现在我们要去做中断了,改正之后的是这样,但其实是还有缺陷在的。寄存器是连接软硬件的媒介,我们现在写一个关于这个的代码。这样得到的和我们预期的一样。TMOD的寄存模式,M1和M0是来决定工作模式的。我们要看的是关于以下的寄存器。

2601_96469072的博客 189

Day33 XD安全学习笔记--JavaEE应用&SQL 预编译&Filter过滤器&Listener监听器&访问控制

本文介绍了SQL预编译与Filter过滤器、Listener监听器的应用。SQL预编译有效防止注入攻击,相比拼接写法更安全。Filter用于拦截请求与响应,实现权限控制、敏感词过滤等功能,具备初始化、过滤、销毁生命周期;如XssFilter拦截非法参数,AdminFilter通过Cookie验证权限。Listener监听域对象的创建、销毁及属性变化,如Session的创建与销毁,实现系统状态管理。三者协同提升Web应用的安全性与可维护性。

一支蜉蝣的博客 219
上一篇: 【论文阅读笔记】Result-Set Management for NDP Operations on Smart Storage
下一篇: 【MIT 6.5840/6.824】Lab3 Raft
juruo_c
博客等级 码龄6年 520粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值