【分布式理论9】分布式协同:分布式系统进程互斥与互斥算法
文章目录
- 一、互斥问题及分布式系统的特性
- 二、分布式互斥算法
- 1. 集中互斥算法
- 调用流程
- 优缺点
- 2. 基于许可的互斥算法(Lamport 算法)
- 调用流程
- 优缺点
- 3. 令牌环互斥算法
- 调用流程
- 优缺点
- 三、三种算法对比
在分布式系统中,多个应用服务可能会同时访问同一个资源,导致互斥问题的出现。例如,在分布式数据库环境中,多个事务可能同时尝试对同一行数据加锁,导致锁争抢,影响系统性能。为了避免互斥现象,并保证数据的一致性,引入了分布式锁机制。而支撑分布式锁的理论基础,就是分布式互斥算法。
一、互斥问题及分布式系统的特性
以现实生活中的例子来类比,假设有两个小孩想玩同一个玩具,但玩具只能由一个小孩使用,另一个小孩必须等待。这种情况类似于计算机系统中的互斥问题:
- 共享资源(玩具)只能由一个进程访问。
- 竞争该资源的进程必须遵循一定的顺序。
- 若资源被占用,其他进程必须等待。
在单机环境下,进程互斥问题可以通过线程同步等方式解决。但在分布式系统中,由于各个进程部署在不同的服务器上,互斥问题变得更为复杂,必须考虑以下特性:
- 互联网特性:分布式系统中的服务器通过网络连接,网络延迟、丢包等问题可能影响互斥操作。
- 没有统一时钟:不同服务器的时钟不同步,导致进程无法准确判断资源请求的先后顺序。
- 服务器和网络可能故障:当某个服务器或进程发生故障,其他服务器需要感知并进行相应处理。
二、分布式互斥算法
针对分布式系统的互斥问题,研究者提出了不同的互斥算法。这些算法适用于不同的场景,例如,某些算法适合小规模系统,而另一些则更适用于高并发环境。主要包括:
1. 集中互斥算法
集中互斥算法的核心思想是引入一个全局协调者(类似于老师管理玩具的使用),由协调者统一管理资源访问请求。

调用流程
- 进程向协调者发送资源访问请求。
- 协调者根据请求时间戳排队,并允许最先请求的进程访问资源。
- 进程访问资源后,向协调者发送释放通知。
- 协调者允许下一个进程访问资源。

优缺点
- 优点:实现简单,协调者能有效控制资源的访问。
- 缺点:
- 协调者可能成为系统瓶颈,影响性能。
- 协调者的单点故障会导致系统不可用。
2. 基于许可的互斥算法(Lamport 算法)
在集中互斥算法中是通过协调者记录先后顺序的,而在 Lamport 算法中,每个节点进程都会维护一个逻辑时钟,当系统启动时,所有节点上的进程都会对这个时钟进行初始化,每当节点进程向其他节点进程发起临界资源访问申请的时候,就会将这个逻辑时间戳加 1。
即该算法不依赖单个协调者,而是由各个进程相互协商资源访问权。
调用流程
- 进程向所有其他进程发送资源访问请求(REQUEST)。
- 其他进程收到请求后,将其加入本地队列,并根据逻辑时钟更新顺序。
- 当请求进程收到所有进程的许可(REPLY)后,即可访问资源。
- 访问完成后,进程向所有等待的进程发送释放消息(RELEASE),其他进程更新队列。

优缺点
- 优点:
- 解决了分布式系统时钟不同步的问题。
- 适用于进程较少的场景。
- 缺点:
- 需要进行大量消息传输,通信开销较大。
- 资源请求多时,系统响应可能变慢。
3. 令牌环互斥算法
令牌环算法类似于小孩们围成一圈,轮流传递一个令牌(Token),拿到令牌的孩子才能玩玩具。
如下图令牌环互斥算法中的所有节点进程构成一个环结构,每个节点进程都有一个唯一 ID 作为标识,且都会记录对应前驱节点和后继节点的地址。
令牌作为访问临界资源的许可证,会按照一定方向(顺时针、逆时针)在节点进程之间传递,收到令牌的节点进程有权访问临界资源,访问完成后将令牌传送给下一个进程;若拿到令牌的节点进程不需要访问临界资源,则直接把令牌传递给下一个节点进程。

调用流程
- 进程形成一个逻辑环,并按固定方向传递令牌。
- 持有令牌的进程可以访问资源。
- 访问完成后,进程将令牌传递给下一个进程。
- 若进程不需要访问资源,则直接传递令牌。
优缺点
- 优点:
- 令牌唯一,避免竞争冲突。
- 进程不会长时间等待,保证公平性。
- 缺点:
- 令牌丢失时,系统需要恢复令牌,增加复杂度。
- 进程数量变化时,需要重构令牌环。
- 即使没有进程访问资源,令牌仍在传递,造成资源浪费。
三、三种算法对比
| 算法 | 优点 | 缺点 | 适用场景 | 消息复杂度 | 故障恢复能力 |
|---|---|---|---|---|---|
| 集中互斥算法 | 实现简单,便于管理 | 协调者可能成为瓶颈,单点故障风险高 | 进程数量较少,资源访问请求不频繁 | 低 | 低(协调者故障导致不可用) |
| 基于许可的算法 | 无单点故障,保证公平性 | 通信开销大,进程数量多时性能下降 | 进程较少,通信代价可接受的场景 | 高 | 中(进程故障会影响队列排序) |
| 令牌环算法 | 令牌唯一,访问公平 | 令牌丢失影响系统,进程变化需重构环 | 资源访问频繁,系统规模较小 | 低 | 中(需要令牌恢复机制) |
在实际应用中,分布式锁(如 Zookeeper、Redis 分布式锁)通常结合了这些算法的思想,以提高系统的性能和可靠性。选择合适的互斥方案,可以有效提升分布式系统的稳定性和数据一致性。
参考:
《分布式原理与实践-崔皓》
相关文章:
【分布式理论9】分布式协同:分布式系统进程互斥与互斥算法
文章目录 一、互斥问题及分布式系统的特性二、分布式互斥算法1. 集中互斥算法调用流程优缺点 2. 基于许可的互斥算法(Lamport 算法)调用流程优缺点 3. 令牌环互斥算法调用流程优缺点 三、三种算法对比 在分布式系统中,多个应用服务可能会同时…...
木材表面缺陷检测数据集,支持YOLO+COCO JSON+PASICAL VOC XML+DARKNET格式标注信息,平均正确识别率95.0%
数据集说明 木材表面缺陷检测数据集是用于训练和验证人工智能算法,以帮助自动识别和检测木材表面的缺陷,如裂纹、疤痕、孔洞等。这对于木材行业非常重要,可以提高生产过程的效率和质量控制水平。 本文提供的木材表面缺陷检测数据集࿰…...
Leetcodehot 力扣热题100 二叉搜索树中第 K 小的元素
class Solution { public:int res; // 用于存储第 k 小的元素int kthSmallest(TreeNode* root, int k) {inorder(root, k); // 进行中序遍历并找到第 k 小的元素return res; // 返回结果}private:// 中序遍历:遍历树的左子树、根节点和右子树void inorder(TreeNod…...
Awtk 如何添加开机画面
场景 我们知道在工程中,Ui是一个线程,并且需要一直存在,当我们使用的开机画面在这个线程开启就直接展示的时候,因为awtk的界面是window_open入栈的,即首次打开的窗口会记录在top,往后的窗口会依次往后存放&…...
关于多语言商城系统的开发流程
建设多语言商城系统是现在很多传统外贸企业的选择,外贸企业通过多语言电商系统开展海外业务,那么多语言商城系统的开发流程是怎么样的呢?接下来就跟着小来一起来看看吧。 1、页面UI设计 多语言商城系统的原型图经过反复推敲修正后࿰…...
IDEA中常见问题汇总
🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...
计算机视觉-拟合
一、拟合 拟合的作用主要是给物体有一个更好的描述 根据任务选择对应的方法(最小二乘,全最小二乘,鲁棒最小二乘,RANSAC) 边缘提取只能告诉边,但是给不出来数学描述(应该告诉这个点线是谁的&a…...
CSS 实现下拉菜单效果实例解析
1. 引言 在 Web 开发过程中,下拉菜单是一种常见且十分实用的交互组件。很多前端教程都提供过简单的下拉菜单示例,本文将以一个简洁的实例为出发点,从 HTML 结构、CSS 样式以及整体交互逻辑三个层面进行详细解析,帮助大家理解纯 C…...
DeepSeek模拟阿里面试——Mysql
1.数据库基础知识 关系型数据库是什么? 关系型数据库是基于关系模型的数据库,使用表格来存储数据,表格之间可以通过键建立关系。 数据库的ACID特性是什么? 原子性(Atomicity):事务要么全部完成…...
MVVM设计模式
MVVM(Model-View-ViewModel)是一种软件设计模式,MVVM模式由三个主要部分组成: Model(模型):负责管理应用程序的业务逻辑和数据。它不关心UI如何展示数据,主要负责与服务器通信和数据处处…...
解决:Cannot find a valid baseurl for repo: base/7/x86_64
传送门 repo_file/etc/yum.repos.d/CentOS-Base.repo cp ${repo_file} ~/CentOS-Base.repo.backup sudo sed -i s/#baseurl/baseurl/ ${repo_file} sudo sed -i s/mirrorlist.centos.org/vault.centos.org/ ${repo_file} sudo sed -i s/mirror.centos.org/vault.centos.org/ $…...
ffmpeg -codecs
1. ffmpeg -codecs -loglevel quiet 显示ffmpeg支持的编解码器 2. 输出 选取部分结果: Codecs: D..... Decoding supported .E.... Encoding supported ..V... Video codec ..A... Audio codec ..S... Subtitle codec ...I.. Intra frame-only code…...
社区版IDEA中配置TomCat(详细版)
文章目录 1、下载Smart TomCat2、配置TomCat3、运行代码 1、下载Smart TomCat 由于小编的是社区版,没有自带的tomcat server,所以在设置的插件里面搜索,安装第一个(注意:安装时一定要关闭外网,小编因为这个…...
强化学习 DPO 算法:基于人类偏好,颠覆 PPO 传统策略
目录 一、引言二、强化学习基础回顾(一)策略(二)价值函数 三、近端策略优化(PPO)算法(一)算法原理(二)PPO 目标函数(三)代码示例&…...
长安链支撑全国不动产登记数据可信流通
转自人民日报客户端 不动产登记事关亿万企业、家庭的切身利益。促进不动产登记数据安全流通、业务高效协同,是各方持续努力的目标。记者1月7日从国家区块链技术创新中心获悉,我国自主可控、性能领先的区块链软硬件技术体系长安链,支撑自然资…...
GitCode 助力 Dora SSR:开启游戏开发新征程
项目仓库(点击阅读原文链接可直达) https://gitcode.com/ippclub/Dora-SSR 跨越技术藩篱,构建游戏开发乐园 Dora SSR 是一款致力于打破游戏开发技术壁垒的开源游戏引擎。其诞生源于开发者对简化跨平台游戏开发环境搭建的强烈渴望࿰…...
获取 Windows 视频时长的正确方式——Windows Shell API 深度解析
在 Qt 开发中,有时需要获取视频文件的时长,最直接的方法是在 Windows 上使用 Windows Shell API。然而,这涉及到 IShellItem、IPropertyStore 等 COM 组件,并需要正确处理 PKEY_Media_Duration。本篇文章将详细解析 Windows Shell API 获取视频时长的正确实现方式,并解决常…...
Linux系统安装Nginx详解(适用于CentOS 7)
目录 1. 更新系统包 2. 安装EPEL仓库 3. 安装Nginx 4. 启动Nginx服务 5. 设置Nginx开机自启 6. 检查Nginx状态 7. 配置防火墙 8. 访问Nginx默认页面 9. 配置Nginx(可选) 10. 重启Nginx 解决步骤 1. 检查系统版本 2. 移除错误的 Nginx 仓库 …...
深入理解Java对接DeepSeek
其实,整个对接过程很简单,就四步,获取key,找到接口文档,接口测试,代码对接。 1.获取 KEY https://platform.deepseek.com/transactions 直接付款就是了(现在官网暂停充值2025年2月7日…...
flutter isolate到底是啥
在 Flutter 中,Isolate 是一种实现多线程编程的机制,下面从概念、工作原理、使用场景、使用示例几个方面详细介绍: 概念 在 Dart 语言(Flutter 开发使用的编程语言)里,每个 Dart 程序至少运行在一个 Isol…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
