LiSheng's blog LiSheng's blog
首页
笔记
个人简历
随笔集
GitHub (opens new window)
首页
笔记
个人简历
随笔集
GitHub (opens new window)
  • golang

    • 并发编程

      • GMP并发模型
        • 锁相关
        • groutine并发相关
        • go如何实现原子操作
      • 内存管理

      • 数组和切片的区别
      • new和make
      • go defer
      • context
      • channel
      • go map
      • interface
      • 对象系统
      • rune 类型
      • 字符串拼接的几种方式
    • cplus

    • leetcode

    • 存储技术

    • 分布式系统

    • 计算机网络

    • Linux操作系统

    • Redis

    • 其他

    • 笔记
    • golang
    • 并发编程
    lisheng
    2024-09-10
    目录

    GMP并发模型

    Go语言的GMP模型是Go语言实现并发编程的重要基础。GMP模型由三个核心部分组成:G(Goroutine)、M(Machine/OS线程)、P(Processor)。

    # 1. G:Goroutine

    • Goroutine是Go语言中的轻量级线程。它是一个独立执行的函数,拥有自己的栈空间,可以独立运行。Goroutine非常轻量,可以在一个应用程序中创建成千上万的Goroutine,而不会占用太多资源。

    # 2. M:Machine/OS线程

    • M代表的是操作系统的线程。Go语言的运行时会将Goroutine分配给M去执行。一个M可以同时执行多个Goroutine,但一个M只能绑定一个P。

    # 3. P:Processor

    • P表示的是逻辑处理器。它用来管理Goroutine队列,并负责调度Goroutine到M上执行。P的数量决定了程序中可以并行执行的Goroutine数量。Go语言的运行时系统会动态地调整P的数量,通过runtime.GOMAXPROCS函数可以控制P的数量。

    # 4. GMP模型的工作流程

    • 当一个Go程序启动时,运行时会创建固定数量的P,每个P持有一个Goroutine队列。Goroutine在运行时创建后会被放入P的本地队列中等待调度。P会从队列中取出Goroutine,并将其分配给一个M执行。如果P的Goroutine队列为空,它会从其他P的队列或全局队列中窃取Goroutine来执行。

    # 5. GMP模型的优势

    • 高效调度:GMP模型允许Go语言在不需要操作系统干预的情况下进行高效的Goroutine调度,减少了线程上下文切换的开销。
    • 轻量级并发:由于Goroutine比传统的操作系统线程更加轻量,因此可以创建大量Goroutine,而不会产生高昂的资源消耗。
    • 简单易用:Go语言的并发编程模型极其简洁,开发者可以很容易地创建和管理Goroutine,而不需要过多关心底层实现细节。

    # 7. 总结

    • GMP模型通过P(Processor)的调度将G(Goroutine)分配给M(Machine/OS线程)执行,充分利用多核CPU的资源,实现了Go语言高效的并发编程。

    1、什么是 GMP?(必问)

    2、进程、线程、协程有什么区别?

    3、抢占式调度是如何抢占的?

    4、M 和 P 的数量问题?

    编辑 (opens new window)
    上次更新: 2024/09/13, 11:59:12
    锁相关

    锁相关→

    最近更新
    01
    ceph分布式存储-对象存储(RGW)搭建
    10-27
    02
    ceph分布式存储-集群客户端连接
    10-27
    03
    ceph分布式存储-管理crushmap
    10-27
    更多文章>
    Theme by Vdoing
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式