【Golang 面试题】每日 3 题(三十三)

server/2025/1/20 20:59:26/

✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/UWz06
📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

97. Go 互斥正常模式和饥饿模式的区别?

在 Go 语言中,互斥(Mutex)有两种模式:正常模式和饥饿模式。

1、正常模式

在正常模式下,当多个 goroutine 请求时,会随机地分配给其中的一个 goroutine,其他 goroutine 则会被阻塞。当被释放后,等待goroutine 中的一个会被唤醒,并重新尝试获取

2、饥饿模式

在饥饿模式下,当多个 goroutine 请求时,会优先分配给等待时间最长的 goroutine,而其他 goroutine 则会被继续阻塞。这种模式下可以避免某些 goroutine 长时间无法获得的问题,但是会导致其他 goroutine 无法获得的饥饿现象。

在正常情况下,使用正常模式的互斥即可满足需求,因为它可以保证所有 goroutine 都有机会获得。但是在某些特殊情况下,饥饿模式可能更适合,例如,对于某些实时系统,为了保证某些关键任务及时完成,可能需要使用饥饿模式来保证这些任务获得足够的 CPU 资源。

在 Go 中,默认使用正常模式,但是可以通过在创建互斥时设置 Mutex 结构体的 MutexProfile 字段为 MutexProfile{Starvation: true} 来使用饥饿模式。

98. Go 互斥允许自旋的条件?

线程没有获取到时常见有 2 种处理方式:

  • 一种是没有获取到的线程就一直循环等待判断该资源是否已经释放,这种也叫做自旋,它不用将线程阻塞起来, 适用于并发低且程序执行时间短的场景,缺点是 cpu 占用较高。
  • 另外一种处理方式就是把自己阻塞起来,会释放 CPU 给其他线程,内核会将线程置为「睡眠」状态,等到被释放后,内核会在合适的时机唤醒该线程,适用于高并发场景,缺点是有线程上下文切换的开销。

Go 语言中的 Mutex 实现了自旋与阻塞两种场景,当满足不了自旋条件时,就会进入阻塞。

允许自旋的条件:

  1. 已被占用,并且不处于饥饿模式。
  2. 积累的自旋次数小于最大自旋次数(active_spin=4)。
  3. cpu 核数大于 1。
  4. 有空闲的 P。
  5. 当前 goroutine 所挂载的 P 下,本地待运行队列为空。

99. 如何自旋

go">if old&(mutexLocked|mutexStarving) == mutexLocked && runtime_canSpin(iter) {  ...runtime_doSpin()   continue  
}func sync_runtime_canSpin(i int) bool {  if i >= active_spin || ncpu <= 1 || gomaxprocs <= int32(sched.npidle+sched.nmspinning)+1 {  return false  }  if p := getg().m.p.ptr(); !runqempty(p) {  return false  }  return true  
}

自旋:

go">func sync_runtime_doSpin() {procyield(active_spin_cnt)
}    

如果可以进入自旋状态之后就会调用 runtime_doSpin 方法进入自旋, doSpin 方法会调用 procyield(30) 执行 30 次 PAUSE 指令,什么都不做,但是会消耗 CPU 时间。


http://www.ppmy.cn/server/159984.html

相关文章

安装指南:LLaMA Factory、AutoGPTQ 和 vllm

安装指南&#xff1a;LLaMA Factory、AutoGPTQ 和 vllm 在本文中&#xff0c;我们将详细介绍如何安装 LLaMA Factory、AutoGPTQ 和 vllm&#xff0c;这些工具在大型语言模型&#xff08;LLMs&#xff09;和视觉语言模型&#xff08;VLMs&#xff09;的微调和量化中非常有用。我…

JavaScript笔记APIs篇01——DOM获取与属性操作

黑马程序员视频地址&#xff1a;黑马程序员前端JavaScript入门到精通全套视频教程https://www.bilibili.com/video/BV1Y84y1L7Nn?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p78https://www.bilibili.com/video/BV1Y84y1L7Nn?…

什么是报文的大端和小端,有没有什么记忆口诀?

在计算机科学中&#xff0c;**大端&#xff08;Big-Endian&#xff09;和小端&#xff08;Little-Endian&#xff09;**是两种不同的字节序&#xff08;即多字节数据在内存中的存储顺序&#xff09;。理解这两种字节序对于网络通信、文件格式解析以及跨平台编程等非常重要。 1…

51c自动驾驶~合集47

我自己的原文哦~ https://blog.51cto.com/whaosoft/13083194 #DreamDrive 性能爆拉30%&#xff01;英伟达&#xff1a;时空一致下的生成重建大一统新方案~ 从自车的驾驶轨迹中生成真实的视觉图像是实现自动驾驶模型可扩展训练的关键一步。基于重建的方法从log中生成3D场景…

02、Redis从入门到放弃 之 常用命令和基本数据类型操作

Redis从入门到放弃 之 常用命令和基本数据类型操作 一、Redis通用命令 redis-cli -h 127.0.0.1 -p 6379 redis客户端登录 -h host -p 端口 -a 密码exit 退出当前客户端info 返回redis的一些相关信息&#xff08;包括端口、配置文件等&#xff09;flushdb 清空当前库…

【探寻C++之旅】第二章:类和对象(上)

请君浏览 前言1. 类和对象是什么2. 类的定义2.1 类定义的格式2.2 访问限定符2.3 类域 3. 实例化3.1 实例化概念3.2 对象大小 4. this指针5. C和C语言实现Stack&#xff08;栈&#xff09;的对比尾声 前言 今天&#xff0c;我们继续踏入追寻C的冒险历程。上一章我们简单介绍了C中…

C# OpenCV机器视觉:常用滤波算法

在一个电闪雷鸣的夜晚&#xff0c;阿强的实验室里却灯火通明&#xff0c;宛如黑暗中的科技孤岛。窗外狂风呼啸&#xff0c;大雨倾盆&#xff0c;仿佛是世界末日的序曲&#xff1b;而屋内&#xff0c;阿强正对着电脑屏幕愁眉苦脸&#xff0c;屏幕上是一张张 “惨不忍睹” 的图像…

高性能、并发安全的 Go 嵌入式缓存库 如何使用?

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…