go并发奥秘:GMP模型|Go主题月

简介: 为什么go能支持高并发,它和Java的多线程有什么不同?常规的多线程是由CPU直接调度的,其中大部分时间花在了上下文切换上面,所以后面就了了协程(co-routine),用于减少上下文切换。

为什么这么快?


为什么go能支持高并发,它和Java的多线程有什么不同?

常规的多线程是由CPU直接调度的,其中大部分时间花在了上下文切换上面,所以后面就了了协程(co-routine),用于减少上下文切换。

网络异常,图片无法展示
|

GMP模型

go的高并发特性秘密就是GMP模型

网络异常,图片无法展示
|

M0和G0

M0

M0是启动程序后的编号为0的主线程,这个M对应的实例会在全局变量runtime.m0中,不需要在heap上分配,M0负责执行初始化操作和启动第一个G, 在之后M0就和其他的M一样了。

G0

G0是每次启动一个M都会第一个创建的gourtineG0仅用于负责调度的GG0不指向任何可执行的函数, 每个M都会有一个自己的G0。在调度或系统调用时会使用G0的栈空间, 全局变量的G0M0G0

网络异常,图片无法展示
|

新的协程被创建和执行

当有新的协程G被创建时,会优先放入被创建的当前P本地队列,如果本地P队列满了,则放入全局G队列。然后P通过G0调度到新的G,然后G0退出,P执行新的G。

网络异常,图片无法展示
|

自旋线程

当本地P队列为空,当前线程就会变成自旋线程,此时G0不断的寻找可执行的G(优先从全局G队列查找),然后找到后放入本地P队列,然后P切换到新找到的G继续执行。

网络异常,图片无法展示
|

work stealing机制

上面的自旋线程是优先从全局G队列里查找可执行的G,当全局G队列也为空时,他就会从其它的P队列里偷取G,然后放入本地P队列。

网络异常,图片无法展示
|

hand off机制

如果当前线程的G进行系统阻塞调用时,如进行time.sleep,则当前线程就会释放P,然后把P转交给其它空闲的线程执行,如果没有闲置的线程,则创建新的线程

网络异常,图片无法展示
|

本地P队列已满

如果本地P队列满了,将本地P队列前一半打乱顺序,然后和新的G一起放入全局G队列

网络异常,图片无法展示
|


目录
相关文章
|
2月前
|
Shell Go API
Go语言grequests库并发请求的实战案例
Go语言grequests库并发请求的实战案例
|
3月前
|
Go
Go 语言为什么不支持并发读写 map?
Go 语言为什么不支持并发读写 map?
|
5天前
|
Go 调度 开发者
探索Go语言中的并发模式:goroutine与channel
在本文中,我们将深入探讨Go语言中的核心并发特性——goroutine和channel。不同于传统的并发模型,Go语言的并发机制以其简洁性和高效性著称。本文将通过实际代码示例,展示如何利用goroutine实现轻量级的并发执行,以及如何通过channel安全地在goroutine之间传递数据。摘要部分将概述这些概念,并提示读者本文将提供哪些具体的技术洞见。
|
16天前
|
并行计算 安全 Go
Go语言的并发特性
【10月更文挑战第26天】Go语言的并发特性
8 1
|
16天前
|
Go 调度 开发者
Go语言的并发编程模型
【10月更文挑战第26天】Go语言的并发编程模型
9 1
|
21天前
|
Java 大数据 Go
Go语言:高效并发的编程新星
【10月更文挑战第21】Go语言:高效并发的编程新星
45 7
|
26天前
|
安全 Go 调度
探索Go语言的并发模式:协程与通道的协同作用
Go语言以其并发能力闻名于世,而协程(goroutine)和通道(channel)是实现并发的两大利器。本文将深入了解Go语言中协程的轻量级特性,探讨如何利用通道进行协程间的安全通信,并通过实际案例演示如何将这两者结合起来,构建高效且可靠的并发系统。
|
26天前
|
安全 Go 开发者
破译Go语言中的并发模式:从入门到精通
在这篇技术性文章中,我们将跳过常规的摘要模式,直接带你进入Go语言的并发世界。你将不会看到枯燥的介绍,而是一段代码的旅程,从Go的并发基础构建块(goroutine和channel)开始,到高级模式的实践应用,我们共同探索如何高效地使用Go来处理并发任务。准备好,让Go带你飞。
|
27天前
|
安全 Go 调度
探索Go语言的并发之美:goroutine与channel
在这个快节奏的技术时代,Go语言以其简洁的语法和强大的并发能力脱颖而出。本文将带你深入Go语言的并发机制,探索goroutine的轻量级特性和channel的同步通信能力,让你在高并发场景下也能游刃有余。
|
10天前
|
安全 测试技术 Go
Go语言中的并发编程模型解析####
在当今的软件开发领域,高效的并发处理能力是提升系统性能的关键。本文深入探讨了Go语言独特的并发编程模型——goroutines和channels,通过实例解析其工作原理、优势及最佳实践,旨在为开发者提供实用的Go语言并发编程指南。 ####