当前位置: 首页 > article >正文

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

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

160. MP 中 work stealing 机制

GMP 中的 work stealing 机制是指在某个 M 线程的本地队列中没有 Goroutine 可供执行时,它会从其他 M 线程的本地队列中偷取 Goroutine 来执行。

具体地,work stealing 机制的实现过程如下:

  1. 每个 M 线程都有一个本地队列,用于存储待执行的 Goroutine。当一个 Goroutine 被创建时,它会被加入到一个本地队列中等待调度。
  2. 当一个 M 线程的本地队列中没有 Goroutine 可供执行时,它会从其他 M 线程的本地队列中随机选择一个队列,并尝试从该队列中偷取一些 Goroutine 来执行。在此期间,当前 M 线程会不断尝试从全局队列中获取 Goroutine 并将其调度到本地队列中执行。
  3. 当一个 M 线程偷取了其他 M 线程的 Goroutine 后,它会将这些 Goroutine 添加到自己的本地队列中,并将它们调度到绑定的 P 上执行。

work stealing 机制的好处是可以避免线程饥饿,提高 Goroutine 的调度效率。当某个 M 线程的本地队列中没有 Goroutine 可供执行时,它可以从其他 M 线程的队列中偷取 Goroutine 来执行,从而提高整个系统的并发能力和负载均衡性。同时,由于 work stealing 机制的实现比较复杂,因此在高并发场景下可能会增加一些额外的开销,需要谨慎使用。

161. 如何实现 MP 中的 work stealing 机制?

下面给出一个简单的示例代码,演示 GMP 中的 work stealing 机制:

package main
import (
    "fmt"
    "runtime"
    "sync"
    "time"
)
func main() {
    runtime.GOMAXPROCS(2) // 启用两个 P
    var wg sync.WaitGroup
    wg.Add(10)
    for i := 0; i < 10; i++ {
        go func() {
            time.Sleep(time.Second) // 模拟 Goroutine 的耗时操作
            fmt.Println("Goroutine executed.")
            wg.Done()
        }()
    }
    wg.Wait()
}

在上述代码中,我们启用了两个 P,并创建了 10 个 Goroutine。每个 Goroutine 都会执行一个耗时操作(这里用 time.Sleep() 来模拟),然后输出一条信息。

当这些 Goroutine 执行完毕后,我们可以观察到它们是如何在不同的 P 上执行的。由于 work stealing 机制的存在,每个 P 可能会从其他 P 的队列中偷取 Goroutine 来执行,从而达到负载均衡的目的。

162. Go hand off 概念是什么?

也称为 P 分离机制,当本线程 M 因为 G 进行的系统调用阻塞时,线程释放绑定的 P,把 P 转移给其他空闲的 M 执行,也提高了线程利用率(避免站着茅坑不拉 shi)。


http://www.kler.cn/a/550948.html

相关文章:

  • Lombok未生效解决办法
  • 云轴科技ZStack+神州鲲泰,全面支持企业私有化部署DeepSeek模型
  • 2.17寒假作业
  • Python 基础-循环
  • Go 语言编译的原理
  • Python elasticsearch客户端连接常见问题整理
  • PHP 数组与数据结构详解
  • SQL高级技巧之埋点解析
  • Linux之kernel(1)系统基础理论(3)
  • GPT-4与内容生成:从写作到编程的跨越
  • Rust学习总结之所有权(三)
  • 深入解析 VIE(Variable Interest Entity,可变利益实体)架构:中国公司如何在海外上市?
  • Supabase全面介绍与使用指南
  • 【合集】Java进阶——Java深入学习的笔记汇总 再论面向对象、数据结构和算法、JVM底层、多线程、类加载、
  • Debezium同步之如何同步GIS数据
  • 字节跳动AI编辑器Trae基本配置教程
  • Retrofit+OkHttp+ViewModel
  • Web后端 Tomcat服务器
  • 基于pytest+requests+allure+yaml实现接口自动化测试框架
  • LeetCode 1287.有序数组中出现次数超过25%的元素:遍历