【分布式理论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.rhkb.cn/news/16449.html

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

相关文章

VMware Windows_10_x64 安装 VM Tools 后无法将本机文件复制到虚拟机

有一种情况,安装VM Tools死活安装不上去。这时不要急不要慌,重启本机就好了(本人情况就是如此)。 windows键 R 输入 service.msc 打开服务管理器 找到Virtual Disk服务,选择属性设置为自动,应用后启用服…

uniapp 编译生成鸿蒙正式app步骤

1,在最新版本DevEco-Studio工具新建一个空项目并生成p12和csr文件(构建-生成私钥和证书请求文件) 2,华为开发者平台 根据上面生成的csr文件新增cer和p7b文件,分发布和测试 3,在最新版本DevEco-Studio工具 文…

AI+智能中台企业架构设计_重新定义制造(46页PPT)

本文档主要探讨了“中台”的概念及其在制造领域的应用,通过百度中台技术案例,展示了如何利用ABCIOT(人工智能、大数据、云计算和物联网)重新定义制造业。中台被定义为企业内部核心管理平台,包括微服务业务平台、组织创…

基于Java的分布式系统架构设计与实现

Java在大数据处理中的应用:基于Java的分布式系统架构设计与实现 随着大数据时代的到来,数据处理的规模和复杂性不断增加。为了高效处理海量数据,分布式系统成为了必不可少的架构之一。而Java,凭借其平台独立性、丰富的生态系统以…

MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 基础篇 part 11

第11章_数据处理之增删改 首先得先有一个表: #0. 储备工作 USE atguigudb;CREATE TABLE IF NOT EXISTS emp1( id INT, name VARCHAR(15), hire_date DATE, salary DOUBLE(10,2) );DESC emp1;SELECT * FROM emp1; 1.增加数据 #方式1:一条一条的添加…

Java多线程——线程池的使用

线程饥饿死锁 在单线程的Executor中,如果任务A将任务B提交给同一个Executor,并且等待任务B的结果,就会引发死锁线程池中所有正在执行任务的线程由于等待其他仍处于工作队列中的任务而阻塞 执行时间较长的任务 执行时间较长的任务不仅会造成…

通过C模块中的Python API访问数组的数组

在 C 模块中通过 Python API 访问数组的数组(即多维数组)涉及到使用 Python C API 来处理 Python 对象和数据结构。在 C 代码中访问这种数据结构时,我们可以使用 Python 的对象访问方式,例如 PyList 或 PyArray(如果你…

【IDEA】2017版本的使用

目录 一、常识 二、安装 1. 下载IDEA2017.exe 2. 安装教程 三、基本配置 1. 自动更新关掉 2. 整合JDK环境 3. 隐藏.idea文件夹和.iml等文件 四、创建Java工程 1. 新建项目 2. 创建包结构,创建类,编写main主函数,在控制台输出内容。…

物联网智能语音控制灯光系统设计与实现

背景 随着物联网技术的蓬勃发展,智能家居逐渐成为现代生活的一部分。在众多智能家居应用中,智能灯光控制系统尤为重要。通过语音控制和自动调节灯光,用户可以更便捷地操作家中的照明设备,提高生活的舒适度与便利性。本文将介绍一…

利用HTML和css技术编写学校官网页面

目录 一,图例展示 二,代码说明 1,html部分: 【第一张图片】 【第二张图片】 【第三张图片】 2,css部分: 【第一张图片】 【第二张图片】 【第三张图片】 三,程序代码 一,…

学习笔记十九:K8S生成pod过程

K8S生成pod过程 流程图具体生成过程用户提交 Pod 定义API Server 处理请求调度器分配节点(Scheduling)目标节点上的 Pod 创建网络配置状态上报与监控控制器管理(Controller Manager)就绪与服务发现 关键错误场景高级特性 流程图 具…

(一)Axure制作移动端登录页面

你知道如何利用Axure制作移动端登录页面吗?Axure除了可以制作Web端页面,移动端也是可以的哦,下面我们就一起来看一下Axure制作移动端登录页面的过程吧。 第一步:从元件中拖入一个矩形框,并设置其尺寸为:37…

【C++】——精细化哈希表架构:理论与实践的综合分析

先找出你的能力在哪里,然后再决定你是谁。 —— 塔拉韦斯特弗 《你当像鸟飞往你的山》 目录 1. C 与哈希表:核心概念与引入 2. 哈希表的底层机制:原理与挑战 2.1 核心功能解析:效率与灵活性的平衡 2.2 哈希冲突的本质&#x…

第5章 数据库系统(选择|案例|论文)(重点★★★★★)

5.1 数据库管理系统1 数据库是长期存储在计算机内的、有组织的、可共享的数据集合,数据库系统是指在计算机信息系统中引入数据库后的系统,一般由数据库、数据库管理系统 (DataBaseManagement System,DBMS)、应用系统、数据库管理员(DataBase…

jenkins备份还原配置文件

下载ThinBackup插件 方式1 从插件市场直接下载 Manage Jenkins->Manage Plugins->可选插件搜索 注意:有时可能因为网络或者版本问题下载不了,好像是默认下载最新版本,可选择手动安装! 方式二 手动安装插件 点击查看手…

Vue笔记(八)

一、Pinia (一)手动添加Piaia到Vue项目 1.安装Pinia:使用包管理器进行安装,在项目目录下运行 npm install pinia 或 yarn add pinia ,为项目引入Pinia状态管理库。 2.创建Pinia实例:在项目的JavaScript代…

vue纯静态实现 视频转GIF 功能(附源码)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、实现后的效果二、使用步骤1.引入库2.下载or复制出来js3. 前端实现 总结 前言 一天一个小demo 今天来一个vue纯静态实现 视频转GIF 功能 上一篇我们讲到了…

嵌入式八股文面试题(二)C语言算法

相关概念请查看文章&#xff1a;C语言概念。 1. 如何实现一个简单的内存池&#xff1f; 简单实现&#xff1a; #include <stdio.h> #include <stdlib.h>//内存块 typedef struct MemoryBlock {void *data; // 内存块起始地址struct MemoryBlock *next; // 下一个内…

【Python】集合

个人主页&#xff1a;GUIQU. 归属专栏&#xff1a;Python 文章目录 1. 集合的创建2. 集合的基本操作2.1 访问集合元素2.2 添加元素2.3 删除元素 3. 集合的数学运算3.1 交集&#xff08;& 或 intersection() 方法&#xff09;3.2 并集&#xff08;| 或 union() 方法&#xf…

Flutter_学习记录_基本组件的使用记录_2

1. PopupMenuButton的使用 代码案例&#xff1a; import package:flutter/material.dart;// ----PopupMemuButtonDemo的案例---- class PopupMemuButtonDemo extends StatefulWidget {const PopupMemuButtonDemo({super.key});overrideState<PopupMemuButtonDemo> crea…