首页 > 系统相关 >Linux下的分布式锁

Linux下的分布式锁

时间:2024-08-22 09:24:52浏览次数:14  
标签:线程 Linux mutex pthread cond 唤醒 分布式

一:什么是分布式锁

1、定义

        在分布式系统中,一个应用部署在多台机器当中,在某些场景 下,为了保证数据一致性,要求在同一时刻,同一任务只在一 个节点上运行,即保证某个行为在同一时刻只能被一个线程执行;在单机单进程多线程环境,通过锁很容易做到,比如 mutex、spinlock、信号量等;而在多机多进程环境中,此时就需要分布式锁来解决了。

2、什么类型的锁

        我们要在分布式场景中实现互斥类型的锁,但是对于分布式方式,运行的结点很可能不在相同的机器和不同的网段中,因此节点之间需要通过socket通信。而对于互斥类型在同一时刻只允许一个执行体进入临界资源。

3、虚假唤醒问题

        在多处理机上,pthread_cond_signal 的实现可能无法避免地唤醒多个阻塞在条件变量的线程。这样我们就碰到了虚假唤醒,因此为了避免这种情况。我们在每次被唤醒后要再次判断是否可以读取数据。下面我们讨论为什么会出现虚假唤醒问题。

        首先线程一想通过pthread_cond_wait 进行阻塞等待在条件变量中,但是进行到第二步,这个锁被解开之后,正好线程二被唤醒,将这个条件变量的空余锁进行加锁操作,然而线程一要在那里阻塞等待这个锁的释放。

        在线程二中,这时候条件变量的值发生了变化,,然后继续进行执行,试图唤醒线程三,当线程二条件变量的锁被释放,线程一继续使用这个锁,对条件变量进行加锁,这时候进行判断条件变量的值,发现这个value与之前的value不同了,因为线程二中进行++操作了,这样线程一无法进行休眠操作。这样线程三也就被线程二所唤醒。

        对于这种问题该怎么解决呢?我们通过在程序中添加while循环,重复检查条件,比如队列是否为空,这样保证程序更加健壮。

//线程一
pthread_cond_wait(mutex, cond)
{
	value = cond->value;	/* 1 */
	pthread_mutex_unlock(mutex); /* 2 */
	pthread_mutex_lock(cond->mutex); /* 10 */
	if (value == cond -> value) /* 11 */
	{
		me->next_cond = cond->waiter;
		cond->waiter = me;
		pthread_mutex_unlock(cond->mutex);
		ubable_to_run(me);        //线程三在这里休眠
	}
	else
	{
		pthread_mutex_unlock(cond->mutex); /* 12 */
	}
	pthread_mutex_lock(mutex); /* 13 */
}

//线程二
pthread_cond_signa(cond)
{
	pthread_mutex_lock(cond->mutex); /* 3 */
	cond->vallue++; /* 4 */
	if (cond->waiter) /* 5 */
	{
		slleeper = cond->waiter; /* 6 */
		cond->waiter = sleeper->next_cond; /* 7 */
		able_to_run(sleeper); /* 8 */
	}
	pthread_mutex_unlock(cond->mutex); /* 9 */
}

二、分布式锁的特性

1、互斥性

        我们通过在数据库中创建一张表,其中对于这个锁的标记设置为唯一标识,当我们对锁进行加锁,那么向数据库中插入一条读独属于它自己的标志,代表这个锁有进程正在使用,当我们解锁,需要在数据库中将这个锁的信息进行删除操作。

        通过上面的操作,我们可以保证同时只允许一个持锁对象进入临界资源,而其他持锁对象要么等待,要么轮询检测是否能获取锁。

2、锁超时

        允许持锁对象持锁最长时间,如果持锁对象宕机,我们可以使用外力进行解除锁定,方便其他持锁对象获取锁。

3、高可用性

        所谓高可用性也就是在合理时间内得到合理的回复。那怎么实现呢?锁存储位置如果宕机,可能引发整个系统不可用,所以应该有备份存储位置和切换备份存储的机制。对于计算型那就开多个备份点,而对存储型也多个备份点加上主从切换。

4、容错性

        如果锁存储的位置宕机,恰好锁丢失,能否正确处理。我们通过raft一致性算法和redlock进行一致性来解决(半数以上)。

对于分布式锁就讲到这里,感谢大家观看!https://xxetb.xetslk.com/s/2D96kH

标签:线程,Linux,mutex,pthread,cond,唤醒,分布式
From: https://blog.csdn.net/2301_76446998/article/details/141323458

相关文章

  • 分布式事务解决方案
    背景分布式事务,后端开发中比较常见啦。因为在面试的时候,总是有interviewers让我给他普及一下分布式事务,虽然我会的也不多呀但是还是浅浅说一说;今天心血来潮,好好地总结一下分布式事务,希望每一位后端工程师都能彻底理解分布式事务。什么是分布式事务?答:既然是分布式,首先必然是分......
  • C#winform软件实现一次编译,跨平台windows和linux、mac兼容运行
    一、背景:微软的.netcore开发工具,目前来看,winform界面软件还没有打算要支持linux系统下运行的意思,要想让c#桌面软件在linux系统上运行,开发起来还比较麻烦。微软只让c#的控制台软件支持在linux运行。二、解决方案:我想到的一个方案是自定义封装软件的System.Windows.Forms组件,把......
  • Linux系统下CUDA与tensorflow与python的版本对应关系
    LinuxCPUVersionPythonversionCompilerBuildtoolstensorflow-2.16.13.9-3.12Clang17.0.6Bazel6.5.0tensorflow-2.15.03.9-3.11Clang16.0.0Bazel6.1.0tensorflow-2.14.03.9-3.11Clang16.0.0Bazel6.1.0tensorflow-2.13.03.8-3.11Clang16.0.0Bazel5.3.0tensorflow-2.......
  • 世上最好的共享内存(Linux共享内存最透彻的一篇)------宋宝华
    共享单车、共享充电宝、共享雨伞,世间的共享有千万种,而我独爱共享内存。早期的共享内存,着重于强调把同一片内存,map到多个进程的虚拟地址空间(在相应进程找到一个VMA区域),以便于CPU可以在各个进程访问到这片内存。现阶段广泛应用于多媒体、Graphics领域的共享内存方式,某种意义......
  • linux的lcd驱动(framebuffer)---点屏
    一.设定屏幕参数1.更改设备树下的lcd节点参数目录:arch/arm/boot/dts/imx6ull-14x14-nand-7-1024x600-c.dts点击查看代码&i2c2{ goodix_ts@5d{ reg=<0x5d>; };};&lcdif{ display0:display{ bits-per-pixel=<32>;//16 bus-width=<24>; display-......
  • 【Linux】分区向左扩容的方法
    @目录为什么是向左扩容操作前的备份方法:启动盘试用Ubuntu后进行操作为什么是向左扩容Linux向右扩容非常简单,无论是系统自带的disks工具还是apt安装的gparted工具,都有图像化的界面可以操作。但是,都不支持向左扩容。笔者这里的磁盘情况如下:其中磁盘1的99.5GB是我的Linux系统分......
  • Linux学习之进程
    进程进程process是指正在执行的程序;是程序正在运行的一个实例。它由程序指令,和从文件、其它程序中读取的数据或系统用户的输入组成。进程状态在进程的生命周期内,进程总会从一个状态转变到另一个状态。Linux中,一个进程有下面的可能状态:Running:正在运行(它是系统中的当前进程)或......
  • 分布式系列之ID生成器
    背景在分布式系统中,当数据库数据量达到一定量级后,需要进行数据拆分、分库分表操作,传统使用方式的数据库自有的自增特性产生的主键ID已不能满足拆分的需求,它只能保证在单个表中唯一,所以需要一个在分布式环境下都能使用的全局唯一ID。应用场景用户ID、图片ID等各种业务场景分库......
  • 分布式资源管理和调度架构
    概述不管是计算任务还是数据存储都会涉及资源分配,资源包括但不限于硬件资源如CPU、内存、硬盘、网口。在单机环境中,资源管理相对简单;分布式环境中,资源分布相对分散,如何协调资源应对计算任务和数据存储就是亟待解决的问题。资源管理和调度是将计算任务分配到资源的过程,为了处理并......
  • 【Linux】python版本控制和环境管理
    @目录1.查看目前python的版本2.添加软件源并更新3.选择你想要下载的版本4.警示:没必要设置默认版本误区千万千万不要覆盖python3软链接解决办法5.pip软件包管理最省心稍微麻烦换源网上有很多教程都是教导小白去官方下载之后编译安装。但是,小白连cmake是什么都不知道,这种教导方式......