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?
|
7天前
|
并行计算 安全 Go
Go语言的并发特性
【10月更文挑战第26天】Go语言的并发特性
5 1
|
7天前
|
Go 调度 开发者
Go语言的并发编程模型
【10月更文挑战第26天】Go语言的并发编程模型
8 1
|
12天前
|
Java 大数据 Go
Go语言:高效并发的编程新星
【10月更文挑战第21】Go语言:高效并发的编程新星
38 7
|
17天前
|
安全 Go 调度
探索Go语言的并发模式:协程与通道的协同作用
Go语言以其并发能力闻名于世,而协程(goroutine)和通道(channel)是实现并发的两大利器。本文将深入了解Go语言中协程的轻量级特性,探讨如何利用通道进行协程间的安全通信,并通过实际案例演示如何将这两者结合起来,构建高效且可靠的并发系统。
|
17天前
|
安全 Go 开发者
破译Go语言中的并发模式:从入门到精通
在这篇技术性文章中,我们将跳过常规的摘要模式,直接带你进入Go语言的并发世界。你将不会看到枯燥的介绍,而是一段代码的旅程,从Go的并发基础构建块(goroutine和channel)开始,到高级模式的实践应用,我们共同探索如何高效地使用Go来处理并发任务。准备好,让Go带你飞。
|
18天前
|
安全 Go 调度
探索Go语言的并发之美:goroutine与channel
在这个快节奏的技术时代,Go语言以其简洁的语法和强大的并发能力脱颖而出。本文将带你深入Go语言的并发机制,探索goroutine的轻量级特性和channel的同步通信能力,让你在高并发场景下也能游刃有余。
|
1天前
|
安全 测试技术 Go
Go语言中的并发编程模型解析####
在当今的软件开发领域,高效的并发处理能力是提升系统性能的关键。本文深入探讨了Go语言独特的并发编程模型——goroutines和channels,通过实例解析其工作原理、优势及最佳实践,旨在为开发者提供实用的Go语言并发编程指南。 ####
|
15天前
|
安全 程序员 Go
深入浅出Go语言的并发之道
在本文中,我们将探索Go语言如何优雅地处理并发编程。通过对比传统多线程模型,我们将揭示Go语言独特的goroutine和channel机制是如何简化并发编程,并提高程序的效率和稳定性。本文不涉及复杂的技术术语,而是用通俗易懂的语言,结合生动的比喻,让读者能够轻松理解Go语言并发编程的核心概念。