【分布式理论9】分布式协同:分布式系统进程互斥与互斥算法

文章目录

    • 一、互斥问题及分布式系统的特性
    • 二、分布式互斥算法
      • 1. 集中互斥算法
        • 调用流程
        • 优缺点
      • 2. 基于许可的互斥算法(Lamport 算法)
        • 调用流程
        • 优缺点
      • 3. 令牌环互斥算法
        • 调用流程
        • 优缺点
    • 三、三种算法对比

在分布式系统中,多个应用服务可能会同时访问同一个资源,导致互斥问题的出现。例如,在分布式数据库环境中,多个事务可能同时尝试对同一行数据加锁,导致锁争抢,影响系统性能。为了避免互斥现象,并保证数据的一致性,引入了分布式锁机制。而支撑分布式锁的理论基础,就是分布式互斥算法。

一、互斥问题及分布式系统的特性

以现实生活中的例子来类比,假设有两个小孩想玩同一个玩具,但玩具只能由一个小孩使用,另一个小孩必须等待。这种情况类似于计算机系统中的互斥问题:

  • 共享资源(玩具)只能由一个进程访问。
  • 竞争该资源的进程必须遵循一定的顺序。
  • 若资源被占用,其他进程必须等待。

在单机环境下,进程互斥问题可以通过线程同步等方式解决。但在分布式系统中,由于各个进程部署在不同的服务器上,互斥问题变得更为复杂,必须考虑以下特性:

  1. 互联网特性:分布式系统中的服务器通过网络连接,网络延迟、丢包等问题可能影响互斥操作。
  2. 没有统一时钟:不同服务器的时钟不同步,导致进程无法准确判断资源请求的先后顺序
  3. 服务器和网络可能故障:当某个服务器或进程发生故障,其他服务器需要感知并进行相应处理。

 

二、分布式互斥算法

针对分布式系统的互斥问题,研究者提出了不同的互斥算法。这些算法适用于不同的场景,例如,某些算法适合小规模系统,而另一些则更适用于高并发环境。主要包括:

1. 集中互斥算法

集中互斥算法的核心思想是引入一个全局协调者(类似于老师管理玩具的使用),由协调者统一管理资源访问请求。

在这里插入图片描述

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

在这里插入图片描述

优缺点
  • 优点:实现简单,协调者能有效控制资源的访问。
  • 缺点
    • 协调者可能成为系统瓶颈,影响性能。
    • 协调者的单点故障会导致系统不可用。

 

2. 基于许可的互斥算法(Lamport 算法)

在集中互斥算法中是通过协调者记录先后顺序的,而在 Lamport 算法中,每个节点进程都会维护一个逻辑时钟,当系统启动时,所有节点上的进程都会对这个时钟进行初始化,每当节点进程向其他节点进程发起临界资源访问申请的时候,就会将这个逻辑时间戳加 1。

即该算法不依赖单个协调者,而是由各个进程相互协商资源访问权。

 

调用流程
  1. 进程向所有其他进程发送资源访问请求(REQUEST)。
  2. 其他进程收到请求后,将其加入本地队列,并根据逻辑时钟更新顺序。
  3. 当请求进程收到所有进程的许可(REPLY)后,即可访问资源。
  4. 访问完成后,进程向所有等待的进程发送释放消息(RELEASE),其他进程更新队列。

在这里插入图片描述

 

优缺点
  • 优点
    • 解决了分布式系统时钟不同步的问题。
    • 适用于进程较少的场景。
  • 缺点
    • 需要进行大量消息传输,通信开销较大。
    • 资源请求多时,系统响应可能变慢。

 

3. 令牌环互斥算法

令牌环算法类似于小孩们围成一圈,轮流传递一个令牌(Token),拿到令牌的孩子才能玩玩具。

如下图令牌环互斥算法中的所有节点进程构成一个环结构,每个节点进程都有一个唯一 ID 作为标识,且都会记录对应前驱节点和后继节点的地址。

令牌作为访问临界资源的许可证,会按照一定方向(顺时针、逆时针)在节点进程之间传递,收到令牌的节点进程有权访问临界资源,访问完成后将令牌传送给下一个进程;若拿到令牌的节点进程不需要访问临界资源,则直接把令牌传递给下一个节点进程。
在这里插入图片描述

调用流程
  1. 进程形成一个逻辑环,并按固定方向传递令牌。
  2. 持有令牌的进程可以访问资源。
  3. 访问完成后,进程将令牌传递给下一个进程。
  4. 若进程不需要访问资源,则直接传递令牌。
优缺点
  • 优点
    • 令牌唯一,避免竞争冲突。
    • 进程不会长时间等待,保证公平性。
  • 缺点
    • 令牌丢失时,系统需要恢复令牌,增加复杂度。
    • 进程数量变化时,需要重构令牌环。
    • 即使没有进程访问资源,令牌仍在传递,造成资源浪费。

 

三、三种算法对比

算法优点缺点适用场景消息复杂度故障恢复能力
集中互斥算法实现简单,便于管理协调者可能成为瓶颈,单点故障风险高进程数量较少,资源访问请求不频繁低(协调者故障导致不可用)
基于许可的算法无单点故障,保证公平性通信开销大,进程数量多时性能下降进程较少,通信代价可接受的场景中(进程故障会影响队列排序)
令牌环算法令牌唯一,访问公平令牌丢失影响系统,进程变化需重构环资源访问频繁,系统规模较小中(需要令牌恢复机制)

在实际应用中,分布式锁(如 Zookeeper、Redis 分布式锁)通常结合了这些算法的思想,以提高系统的性能和可靠性。选择合适的互斥方案,可以有效提升分布式系统的稳定性和数据一致性。

 

参考:
《分布式原理与实践-崔皓》

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

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

相关文章

redo和binlog区别

事务是数据库区别于文件系统的最重要功能,数据库事务支持ACID四个特性,其中I:隔离性是通过锁的方式实现的,剩下的A:原子性 C:一致性 D:持久性是通过redo日志、undo日志、binlog日志来实现的。 我…

安宝特方案 | AR助力制造业安全巡检智能化革命!

引言: 在制造业中,传统巡检常面临流程繁琐、质量波动、数据难以追溯等问题。安宝特AR工作流程标准化解决方案,通过增强现实AR技术,重塑制造业安全巡检模式,以标准化作业流程为核心,全面提升效率、质量与…

芋道源码(无遮羞布版)Spring Boot 全景指南

芋道源码(无遮羞布版)Spring Boot 全景指南 项目地址:https://gitcode.com/gh_mirrors/ru/ruoyi-spring-boot-all 一、项目目录结构及介绍 芋道源码(ruoyi-spring-boot-all)项目基于Spring Boot构建,旨在提供一个全…

科技查新过不了怎么办

“科技查新过不了怎么办?” “科技查新不通过的原因是什么?” 想必这些问题一直困扰着各位科研和学术的朋友们,尤其是对于查新经验不够多的小伙伴,在历经千难万险,从选择查新机构、填写线上委托单到付费,…

【AI时代】Page Assist - 本地 AI 模型的 Web UI (谷歌浏览器) 本地DeepSeek启用联网功能

Page Assist - 本地 AI 模型的 Web UI 一、部署本地模型 参考教程:https://blog.csdn.net/Bjxhub/article/details/145536134二、安装插件 Page Assist 浏览器谷歌商店搜索 Page Assist ,安装该插件。 注意:需要一点科学的魔法。 三、使用…

SSM开发(十三) Spring的入门及demo应用(含完整源码)

目录 一、认识Spring框架 二、Spring框架优缺点 三、Spring框架体系结构 Spring结构图 核心容器Core Container模块 数据访问/集成Data Access/Integration Web AOP and Instrumentation 消息(Messaging)——Messaging 测试(Test) 四、Spring项目布局 五、Spring…

collabora online+nextcloud+mariadb在线文档协助

1、环境 龙蜥os 8.9 docker 2、安装docker dnf -y install dnf-plugins-core dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sed -i shttps://download.docker.comhttps://mirrors.tuna.tsinghua.edu.cn/docker-ce /etc/yum.repos.…

Spring MVC 拦截器(Interceptor)与过滤器(Filter)的区别?

1、两者概述 拦截器(Interceptor): 只会拦截那些被 Controller 或 RestController 标注的类中的方法处理的请求,也就是那些由 Spring MVC 调度的请求。过滤器(Filter): 会拦截所有类型的 HTTP …

音频知识基础

音频知识基础 声音属性声音度量人耳特性通道数音频数字化传输接口 声音属性 响度 响度是人耳对声音强弱的主观感受; 主要和声波的振幅相关,同时也和频率有一定关系; 音调 音调是人耳对声音高低的主观感受; 主要与频率相关&#…

SQL Server 逻辑查询处理阶段及其处理顺序

在 SQL Server 中,查询的执行并不是按照我们编写的 SQL 语句的顺序进行的。相反,SQL Server 有自己的一套逻辑处理顺序,这个顺序决定了查询的执行方式和结果集的生成。了解这些处理阶段和顺序对于优化查询性能和调试复杂查询非常重要。 SQL …

Ruby 日期 时间处理指南

Ruby 日期 & 时间处理指南 在软件开发中,日期和时间处理是不可或缺的一部分。对于Ruby这样的编程语言,它提供了强大的库来帮助开发者轻松处理日期和时间相关的任务。本文将详细介绍Ruby中的日期和时间处理,包括常用类、方法以及最佳实践。 Ruby日期与时间类 Ruby中处…

微信小程序文件流转base64文件,wx.arrayBufferToBase64()方法已弃用

wx.arrayBufferToBase64 方法在微信小程序的基础库版本 2.4.0 起已废弃,不建议继续使用。 我们可以将ArrayBuffer 转换为 base64,使用base64-js来实现转换。具体操作如下: 1、安装base64-js,可以通过npm进行安装,或者从github获取…

CTF中PHP的一些函数(学习记录)

isset()函数用于检查一个变量是否已经被设置并且非NULL empty()函数用于检查一个变量是否为空 strpos()函数用于查找一个字符串在另一个字符串中首次出现的位置 preg_match()函数是一个强大的工具,用于执行正则表达式匹配。它搜索字符串中与给定模式匹配的内容 va…

HTTP请求响应分析:HTTP/1.1→HTTP/2

1. HTTP协议概览 HTTP(HyperText Transfer Protocol)是客户端(浏览器)与服务器通信的基础协议,其核心由请求消息(Request)和响应消息(Response)构成。当前主流版本为HTT…

二、通义灵码插件保姆级教学-IDEA(使用篇)

一、IntelliJ IDEA 中使用指南 1.1、代码解释 选择需要解释的代码 —> 右键 —> 通义灵码 —> 解释代码 解释代码很详细,感觉很强大有木有,关键还会生成流程图,对程序员理解业务非常有帮忙,基本能做到哪里不懂点哪里。…

C# Basic

文章目录 项目地址一、基础501. What is CIL?2. What is CLR?3. What is the difference betweent value type and reference types?4. what is boxing and unboxing?5. How are exceptions handled in C#?6. What is the difference between a class and a struct?7. Wh…

Java 大视界 -- 5G 与 Java 大数据融合的行业应用与发展趋势(82)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

四、自然语言处理_08Transformer翻译任务案例

0、前言 在Seq2Seq模型的学习过程中,做过一个文本翻译任务案例,多轮训练后,效果还算能看 Transformer作为NLP领域的扛把子,对于此类任务的处理会更为强大,下面将以基于Transformer模型来重新处理此任务,看…

深入探索JavaCV:功能强大的Java计算机视觉库

🧑 博主简介:历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,…

FlutterWeb实战:03-与流行前端框架集成

与流行前端框架集成 前端有非常多的框架、工具、库,这些都要比 Dart Web 成熟、丰富。所以在将 Fluttter 编译成 Web 以后,若能使用现有的前端技术实现 web 端的特殊需求,肯定事半功倍。 搭建框架 在开始之前,确保你已经安装好了…