图解:Go Mutex

Mutex 可能处于两种不同的模式:正常模式和饥饿模式。

正常模式下获取Mutex

在正常模式下,新来的G会尝试自旋获取锁,如果自旋获取失败,则会按照FIFO的顺序排队获取锁。

image-20221206093354569

当Mutex被释放,会唤醒等待队列中第一个等待者G,它需要和新来的 G们竞争Mutex的使用权。而新来的G会更有优势,它们已经在CPU上运行且它们的数量更多。因此一个刚被唤醒的等待者很大概率获取不到锁,在这种情况下,它会被放置到等待队列的队首。

Mutex进入饥饿模式

如果一个G等待Mutex的释放超过1ms,它就会将Mutex切换到饥饿模式

image-20221206093806043

处于饥饿模式中,Mutex的所有权直接从解锁的G递交给等待队列中排在最前方的G。

image-20221206093912714

处于饥饿模式中,新到达的G不再尝试自旋获取Mutex,而是直接置于等待队列尾部。

image-20221206093957088

Mutex切换到正常模式

以下两种情况下Mutex会被切换到正常模式

当一个G获得Mutex的所有权时,它的等待时间小于1ms,它便将Mutex切换回正常模式

image-20221206094143695

当一个G获得Mutex的所有权时,它是等待队列中的最后一个,它将Mutex切换回正常模式

image-20221206094257444

总结

Mutex 可能处于两种不同的模式:正常模式和饥饿模式。

在正常模式中,等待者按照 FIFO 的顺序排队获取锁,但是一个被唤醒的等待者有时候并不能获取 mutex, 它还需要和新到来的 goroutine 们竞争 mutex 的使用权。 新到来的 goroutine 存在一个优势,它们已经在 CPU 上运行且它们数量很多, 因此一个被唤醒的等待者有很大的概率获取不到锁,在这种情况下它处在等待队列的前面。 如果一个 goroutine 等待 mutex 释放的时间超过 1ms,它就会将 mutex 切换到饥饿模式

在饥饿模式中,mutex 的所有权直接从解锁的 goroutine 递交到等待队列中排在最前方的 goroutine。 新到达的 goroutine 们不要尝试去获取 mutex,即使它看起来是在解锁状态,也不要试图自旋, 而是排到等待队列的尾部。

如果一个等待者获得 mutex 的所有权,并且看到以下两种情况中的任一种:

  1. 它是等待队列中的最后一个,
  2. 它等待的时间少于 1ms,它便将 mutex 切换回正常操作模式

正常模式下的性能会更好,因为一个 goroutine 能在即使有很多阻塞的等待者时多次连续的获得一个 mutex,饥饿模式的重要性则在于避免了病态情况下的尾部延迟。

参考资料

  • https://golang.design/under-the-hood/zh-cn/part1basic/ch05sync/mutex/
  • https://www.bilibili.com/video/BV15V411n7fM/?spm_id_from=333.999.0.0
请根据我给的格式,使用markdown格式生成一篇文章,用于发布在csdn上面,主要目的是为了获取更多粉丝和浏览量,要求内容详细,易懂,并提供示例,回答不能太简单,示例如下:第 1 章 计算机系统概述 1.1 操作系统的基本概念 1.1.1 操作系统的概念、功能和目标(系统资源的管理者、提供接口、作为扩充机器、虚拟机) 1.1.2 操作系统的特征(并发、共享、虚拟、异步) 1.2 操作系统的发展和分类 1.2.1 操作系统的发展和分类(手工、单道/多道批处理、分时、实时、网络、分布式、嵌入式、个人计算机) 1.3 操作系统的运行机制和体系结构 1.3.1 操作系统的运行机制和体系结构(大内核、小内核) 1.3.2 中断和异常(内中断和外中断、中断处理过程) 1.3.3 系统调用(执行过程、访管指令、库函数与系统调用) 1.0.0 第一章操作系统概述错题整理 第 2 章 进程管理 2.1 进程与线程 2.1.1 进程的定义、特征、组成、组织 2.1.2 进程的状态(运行、就绪、阻塞、创建、终止)及转换(就绪->运行、运行->就绪、运行->阻塞、阻塞->就绪) 2.1.3 原语实现对进程的控制 2.1.4 进程之间的通信(共享通信、消息传递、管道通信) 2.1.5 线程概念与多线程模型 2.2 处理机的调度 2.2.1 处理机调度的概念及层次 2.2.2 进程调度的时机(主动放弃与被动放弃)、切换与过程(广义与狭义)、方式(非剥夺与剥夺) 2.2.3 度算法的评价指标(cpu利用率、系统吞吐量、周转时间、等待时间、响应时间) 2.2.4 作业/进程调度算法(FCFS先来先服务、SJF短作业优先、HRRN高响应比优先) 2.2.5 作业/进程调度算法(时间片轮转调度算法、优先级调度算法、多级反馈队列调度算法) 2.3 进程的同步与互斥 2.3.1 进程的同步与互斥 2.3.2 实现临界区进程互斥的软件实现方法 2.3.3 实现临界区进程互斥的硬件实现方法 2.3.4 信号量机制(整型信号量、记录型信号量P、V) 2.3.5 信号量机制实现进程的互斥、同步与前驱关系 2.3.6 进程同步与互斥经典问题(生产者-消费者问题、多生产者-多消费者问题、吸烟者问题、读者-写者问题、哲学家进餐问题) 2.3.7 管程和java中实现管程的机制 2.4 死锁 2.4.1 死锁详解(预防、避免、检测、解除)
最新发布
03-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值