自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

李白

此生是否有幸能在这个行业有所建树

  • 博客(321)
  • 资源 (1)
  • 收藏
  • 关注

原创 分布式选举算法:Bully、Raft、ZAB

摘要: 分布式选举算法是确保分布式系统高可用的核心技术。Bully算法通过节点ID比较选举主节点,ID最大的节点获胜,适用于节点数量有限且ID可比较的场景。Raft算法采用投票机制,遵循多数票原则,通过领导者、候选者和跟随者三种角色实现高效选举,并解决脑裂问题。ZAB(ZooKeeper原子广播)协议则通过两阶段提交确保数据一致性,在领导者选举和崩溃恢复时保证系统稳定。这三种算法各有优势:Bully简单直接,Raft强调强一致性,ZAB则注重高吞吐和低延迟,共同为分布式系统提供可靠的领导者选举方案。

2025-08-05 15:42:58 645

原创 CAP 理论中的 “为什么 CA 无法同时存在”

CAP理论指出,分布式系统无法同时满足一致性(C)、可用性(A)和分区容错性(P)。其核心矛盾在于:网络分区(P)必然发生,此时系统必须在C和A之间抉择。选择强一致(C)就要牺牲可用性(如拒绝请求),选择高可用(A)则要容忍数据不一致(如继续服务但数据不同步)。因此,在实际分布式环境中,CA无法同时实现。只有在无网络问题的单机系统或理想网络条件下,才能短暂维持CA状态。

2025-06-08 12:09:56 324

原创 分布式互斥算法

分布式互斥通过网络消息保证多节点对共享资源的互斥访问,需考虑网络延迟、时钟不同步和故障检测。常见算法有:集中互斥——协调者维护请求队列,消息开销小但有单点故障;许可算法(Lamport、Richard & Agrawal)——用逻辑时钟排序请求,有序广播与许可,无单点故障;令牌环互斥——节点构成环、令牌顺序传递,通信开销低但令牌丢失和环重构成本高。三种算法适合不同规模与场景。

2025-06-04 17:20:46 997

原创 grpc的二进制序列化与http的文本协议对比

gRPC 相较于 HTTP/JSON 更省空间,主要因为:一是 Protobuf 用二进制格式,不需传字段名,只保留数字标签;二是 Varint 和定长类型减少整数、布尔等类型的字节;三是 HTTP/2 用二进制帧和 HPACK 压缩头部,避免每次都发送完整文本头,从而整体报文体积大幅缩减,带来更低网络带宽占用和解析开销。

2025-06-03 20:27:57 1356

原创 分布式常见概念

正向代理示意(“我去帮你拿数据”)反向代理示意(“你找我,我替你联系内部服务器”)API 网关的核心功能DNS 负载均衡(基于域名系统)硬件负载均衡(如 F5、Citrix、H3C)软件负载均衡(运行在普通服务器或容器中)

2025-05-27 15:22:12 1133

原创 深入解析 Redis AOF 机制:持久化原理、重写优化与 COW 影响

AOF 主要用于保证 Redis 数据持久化,避免数据丢失。AOF 重写(Rewrite)机制减少文件体积,加快恢复速度。写时复制(COW)影响 AOF 重写期间的内存使用。大规模数据写入下,优化 AOF 体积使用 AOF + RDB 混合模式。调整 AOF 重写触发条件。优化磁盘 IO,避免 AOF 过大。📌最终建议:如果 Redis 版本 ≥ 7.0,推荐使用 AOF + RDB 混合模式,以获得最佳性能与数据可靠性!

2025-02-03 00:18:20 1518

原创 linux:MSI 与 MSI-X

MSI是一种基于消息的中断机制,设备通过内存写操作发送中断请求,避免了传统中断引脚的限制,提升了系统扩展性和中断处理效率。MSI-X是MSI的扩展版本,提供更多中断向量、更强的控制灵活性,尤其适用于高性能设备中,以支持更高并发和更复杂的中断需求。

2024-10-26 17:29:57 782

原创 linux:NAPI

NAPI 是一种灵活且高效的网络处理机制,特别适用于高吞吐量、高并发的场景,如数据中心和高速路由器。通过结合中断和轮询,NAPI 能够在不同负载下优化网络设备的数据包处理效率,减轻中断风暴对系统性能的影响。

2024-10-21 22:47:06 1470

原创 linux:DMA( Direct Memory Access,直接内存访问)

DMA是一种重要的硬件机制,能够让设备直接与内存通信,减少 CPU 的参与,提高数据传输速度和系统整体性能。通过不同的工作模式(如突发模式、循环窃取模式等)和类型(内存到内存、设备到内存等),DMA 能够适应不同的应用场景,广泛应用于磁盘 I/O、网络传输、多媒体处理等领域。

2024-10-21 21:32:13 1650

原创 linux:使用sar诊断问题

工具包中的命令,用于收集、报告和保存各种系统活动的统计信息。它可以监控 CPU、内存、磁盘 I/O、网络等多种资源的使用情况。它生成了一段时间内的内存使用统计,包括空闲内存、已使用内存、缓存和缓冲区等信息。,可以分析系统的 CPU 性能,了解 CPU 是处于忙碌状态还是有足够的空闲资源,以及是否有 I/O 或 CPU 相关的瓶颈。:报告文件表、inode 表、缓冲区和内核内部的相关信息。:报告内存的使用情况,包括物理内存和交换空间的统计数据。:报告交换空间的活动情况,包括交换入和交换出的数据量。

2024-10-10 20:50:18 1080

原创 TCP:过多的TIME_WAIT

线上机器出现了几万个TIME_WAIT,怎么办?tcp_tw_reuse 允许重用处于 TIME_WAIT 状态的连接,而不必等待其 TIME_WAIT 持续时间(通常是 2 MSL)结束。默认情况下tcp_tw_reuse是关闭状态,启用方法:sysctl -w net.ipv4.tcp_tw_reuse=1。

2024-10-09 22:17:12 542

原创 动态库控制符号的导出和可见性:__declspec(dllexport)、__declspec(dllimport)、__attribute__((visibility(“default“)))

__declspec(dllexport) 和 __declspec(dllimport) 是 Windows 特有的,用于 DLL 的导出和导入。__attribute__((visibility("default"))) 是 GNU 编译器(GCC)特有的,适用于 Linux 和 POSIX 系统,提供更灵活的符号可见性控制。

2024-07-31 16:18:33 632

原创 动态库/静态库文件中检查是否存在指定的函数实现

动态库/静态库文件中检查是否存在指定的函数实现1. 使用 `nm` 工具2. 使用 `objdump` 工具3. 使用 `readelf` 工具(仅适用于ELF格式)

2024-04-09 18:51:48 2372

原创 linux进程退出之exit与_exit

调用_exit()函数会使程序立即退出,不会进行任何清理操作。用户调用_exit函数,本质上是调用exit_group系统调用。

2024-03-30 17:45:39 1126

原创 设计模式:桥接模式

桥接模式适用于需要将抽象和实现分离、有多个维度的变化、需要建立稳定关联关系和实现多态性的场景。它可以提高系统的灵活性、可扩展性和可维护性。

2024-01-07 00:38:22 1417 1

原创 设置模式:适配器模式

适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。注:在适配器模式定义中所提及的接口是指广义的接口,它可以表示一个方法或者一组方法的集合。适配器模式将现有接口转化为客户类所期望的接口,实现了对现有类的复用。

2024-01-06 12:00:48 1345

原创 设计模式:原型模式

原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制现有的对象来创建新对象,而无需从头开始编写代码。在这个模式中,我们可以使用已经存在的对象作为“原型”,并通过克隆该原型对象创建一个新的对象,而不是从头开始构建一个新对象。该模式的核心思想是将对象的创建过程与使用过程分离,通过复制已有对象来减少对象的创建过程,从而提高系统的性能和效率。

2024-01-03 13:09:27 967 1

原创 设计模式:简单工厂模式、工厂方法模式、抽象工厂模式

简单工厂模式适用于创建对象较少且变化不频繁的情况,工厂方法模式适用于创建对象较多且需要灵活扩展的情况,而抽象工厂模式适用于创建一组相关对象的情况。所有的工厂模式都强调一点:两个类A和B之间的关系应该仅仅是A创建B或是A使用B,而不能两种关系都有。将对象的创建和使用分离,也使得系统更加符合单一职责原则,有利于对功能的复用和系统的维护。此外,将对象的创建和使用分离还有一个好处:防止用来实例化一个类的数据和代码在多个类中到处都是,可以将有关创建的知识搬移到一个工厂类中。

2024-01-02 22:18:12 1524

原创 cmake常见操作记录(持续更新)

cmake常见操作记录(持续更新)

2023-12-25 17:22:23 777

原创 设计模式:单例模式(使用c++分别实现饿汉式单例、带双重检查锁定机制的懒汉式单例以及IoDH技术的单例)

设计模式:单例模式(使用c++分别实现饿汉式单例、带双重检查锁定机制的懒汉式单例以及IoDH技术的单例)

2023-12-25 00:29:35 883

原创 windows常见命令整理(持续更新)

windows常见命令整理(持续更新)

2023-12-24 20:39:58 729

原创 UML类图与类关系

1. 类图2. 类关系2.1. 关联关系2.1.1. 双向关联2.1.2. 单向关联2.1.3. 自关联2.1.4. 多重性关联2.1.5. 聚合关系2.1.6. 组合关系2.2. 依赖关系2.3. 依赖关系,也称继承关系2.4. 接口与实现关系

2023-12-24 20:20:08 790

原创 ARM 架构下的汇编指令(持续更新中)

ARM 架构下的汇编指令

2023-08-06 20:46:57 2055

原创 ARM 内存屏障指令

如果是针对数据访问的屏障,可以使用 DMB 指令,根据共享性选择相应的屏障类型。需要注意的是,WFE 指令只是将处理器置于等待状态,具体的事件触发和事件处理需要根据具体的应用和系统设计来完成。isb 指令会等待之前的所有指令完成,并清空指令流水线中的缓存,刷新指令预取队列(instruction prefetch queue),以确保执行的指令是最新的版本,可确保后续指令按照正确的顺序执行。根据具体的需求和场景,选择适当的内存屏障指令以确保正确的内存访问顺序和同步。

2023-08-06 18:39:54 3149

原创 linux gcc __attribute__

_attribute__ 是 GCC 编译器提供的一种特殊语法,它可以用于设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。

2023-08-06 15:27:52 1157

原创 asm:常用语法

1、循环 1.1、使用条件跳转指令实现循环 1.2、使用LOOP指令实现循环 2、字符串 2.1、指定字符串的长度 2.2、字符串指令 2.3、重复前缀 3、数组 4、递归 5、宏 6、文件操作 7、内存管理

2023-08-01 12:57:54 1560

原创 Linux内核:系统调用大全(持续更新中)

1. sys_brk()是用于更改进程的堆空间大小。2. dup2用于创建一个新的文件描述符,这个新的文件描述符与指定的旧文件描述符指向同一个文件.

2023-08-01 12:43:03 1032

原创 asm:常见指令大全

常见指令大全算数指令INC 指令DEC 指令ADD 指令SUB指令MUL指令IMUL指令DIV指令IDIV指令逻辑指令AND指令OR指令XOR 指令TEST指令NOT指令跳转指令条件跳转指令无条件跳转指令

2023-07-26 12:39:42 2943

原创 asm: 指示符

ORG 指示符equ 指示符%define 指示符数据指示符RES'X'系列指示符RESBRESWRESDRESQRESTRESWD'X'系列指示符DBDWDDDQDTTIMES 指示符.text 指示符.data 指示符.bss 指示符.global/.extern 指示符.align 指示符

2023-07-16 11:40:17 1063

原创 asm: 实现打印“Hello, world!“

使用汇编打印“Hello, world!“,并详细剖析每一步的指令

2023-07-15 20:00:11 995

原创 80x86系列CPU的寄存器大全(带注释)

8086 CPU是一款由英特尔公司推出的16位微处理器,它具有14个寄存器,其中8个通用寄存器、4个段寄存器和2个指针寄存器。80386 CPU是一款由英特尔推出的32位微处理器,相比于8086 CPU,它拥有更多的寄存器。

2023-07-04 19:15:21 2173

原创 char*转LPCWSTR的两种方法

char*转LPCWSTR的两种方法

2023-06-27 07:00:53 4357

原创 Linux内核源码分析-进程调度(六)-PELT(per-entity load tracking)

什么叫负载?per-entity load tracking如何记录负载信息runnable_avg_yN_invdecay_loadstruct sched_avg调度实体se初始化函数是init_entity_runnable_average计算当前负载贡献计算公式代码实现accumulate_sumdecay_load__accumulate_pelt_segments调度实体更新负载贡献就绪队列更新负载贡献per-entity load tracking有什么好处呢?

2023-06-09 00:20:25 2411 3

原创 Linux内核源码分析-进程调度(五)-组调度

系统启动后默认有一个root_task_group,管理系统中最顶层CFS就绪队列cfs_rq(即cpu rq对应的CFS就绪队列)。cfs组进程调度:pick_next_task_fair; 组进程抢占:task_tick_fair调度组的时间分配

2023-05-24 20:58:05 5285 7

原创 Linux内核源码分析-进程调度(四)-进程周期性调度和如何选择下一个运行进程

周期性调度是指Linux周期性地检查当前任务是否耗尽当前进程的时间片,并检查是否应该抢占当前进程。判断一下curr比起红黑树最左边的是否已经运行满一个时间片(这个时间片是指curr进程自身在一个调度周期内可以运行的时间片),满了就回就绪队列等待下一次运行,这样每一个进程都会尽快运行,且权重小的进程更容易被抢占。 if (delta > ideal_runtime)resched_curr(rq_of(cfs_rq)); // 设置抢占flag

2023-05-16 23:59:03 1083 4

原创 Linux内核源码分析-进程调度(三)-从进程创建到唤醒的过程去了解CFS调度器

从进程创建到唤醒的过程去了解CFS调度器

2023-05-09 23:26:15 1488 1

原创 Linux内核源码分析-进程调度(二)-常用数据结构

但是,每一个调度类并不是直接管理task_struct,管理的是调度实体,从而引入调度实体的概念。CFS调度器的就绪队列,简称cfs就绪队列,管理就绪态的struct sched_entity调度实体,后续可以通过pick_next_task接口从cfs就绪队列中选择最适合运行的调度实体(虚拟时间最小的调度实体)。// 每个CPU都有一个全局的运行队列,它是per-cpu类型,即每个cpu上都会有一个struct rq结构体。rq中包含cfs就绪队列、rt就绪队列、dl就绪队列。

2023-04-26 01:11:57 1409

原创 Linux内核源码分析-进程调度(一)-调度器初识

调度器的主要工作就是选择就绪的进程来执行。目前Linux支持的调度器有五种:stop scheduler、Deadline scheduler、RT scheduler、CFS scheduler、Idle scheduler。从Linux2.6.23开始,Linux引入scheduling class的概念,目的是为了将调度器模块化。这样提高了扩展性,添加一个新的调度器也变得简单起来。调度器的抽象基类为struct sched_class;

2023-04-23 08:34:28 2544

原创 Linux内核源码目录简介

【代码】Linux内核源码目录简介。

2023-01-31 21:13:51 378

原创 linux信号:SIGINT、SIGKILL、SIGSTOP、SIGCONT

linux信号:SIGINT、SIGKILL、SIGSTOP、SIGCONT

2022-12-13 00:46:19 8222

linux内核代码-5.6

linux内核代码-5.6

2023-01-15

2.5G Ethernet LINUX driver r8125 for kernel up to 5.19

网卡驱动

2022-12-22

CPP-Summit 2019演讲讲义.zip

2019年c++开发大会资料 ppt整理

2020-11-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除