【golang学习】对于GMP模型的一些理解

1 前言

对于GMP模型的具体细节以及goroutine协程的调度方案,在这篇文章中已经讲述得非常清晰了,我也是通过看这篇文章,私以为差不多懂了GMP模型。而接下来得内容,就浅谈谈自己对于GMP模型的理解。
Golang GMP 原理

2 进程、线程、协程

简单来讲,GMP模型就是如何调度golang程序中的协程,将协程与线程相绑定的一个模型,因此,我们先简单了解一下进程、线程和协程。

进程

不难知道,现在我们的软件程序都是运行在操作系统上的,Windows系统也好、Linux系统也好,操作系统封装了计算机底层的硬件资源(比如内存、CPU等)。对于计算机来说,这些资源是相当宝贵的,并且一台计算机上可能同时运行着多个程序,不可能让某一个程序独占这些资源,故操作系统提供了一个抽象概念即为进程。程序运行在进程上,进程使得程序认为自己独占了整个系统资源,且一个操作系统可以同时运行多个进程。

线程

一般来说,进程是系统资源分配和调度的基本单位吗,是对于操作系统而言的。而线程,是CPU资源分配和调度的基本单位。线程被进程调度,运行在进程的上下文中,一个进程可以调度多个线程,故实现不同线程之间的通信比实现进程之间的通信要容易。在Window系统中,有线程的概念,实现了线程,但在Linux系统中,线程被定义为一个轻量级的进程,通过进程之间共享数据来实现线程。

协程

协程出现得很早,在上世纪60年代就被应用于汇编语言之中,但近些年由于go语言等新势力才火热了起来。协程存在于用户态视角,也就是说对于操作系统而言,它并不知道什么是协程,它只认识进程和线程。协程是用户态视角的轻量级线程,在高性能、高并发场景下使用的概念,完全由程序控制。一个线程中可以有多个协程,但同一个时间只能由一个协程在运行,也就是说多个协程在线程中是串行运行的。

更多关于进程、线程、协程的知识,可以见这篇文章进程、线程和协程详解

3 GMP是什么

G = goroutine 表示 go程序中的协程,是专属于go语言的协程
M = Thread/Machine 表示 操作系统中/CPU 中的线程
P = Processor 表示 一套处理机制,可以理解为goroutine的调度器

前面我们已经说过,在操作系统中,进程是资源分配和调度的最小单位,而在当今计算机中,线程的粒度比进程更小,故可以理解为线程是更小的单位。程序运行在进程上,一段程序可以使用多个线程,且程序的一部分(协程)必须运行在线程之上,故有以下的对应关系:一个进程对应多个线程,而一个线程对应多个协程。但要知道的是,在进程中,多个线程可以并行,而在线程中,多个协程只能串行。

那么问题来了,假设我有 m m m个goroutine需要执行,我有 n n n个thread可以用来执行goroutine,我该怎么分配才合适,才合理呢? 因此,有了Processor这套处理机制来动态的绑定每一个goroutine到thread上。

所以GMP就是一套将go协程绑定到线程上的模型,通过P也就是go协程的调度机制来实现动态绑定。这里借用一张图(来源 微信公众号:小徐先生的编程世界)来说明,GMP就是实现了go协程与thread中的动态绑定。

至于GMP更多底层的实现方式以及具体的调度方案,还是推荐大家去看这篇文章。
Golang GMP 原理
【golang学习】对于GMP模型的一些理解_第1张图片

4 总结

以上是自己阅读学习后对于GMP模型的简单理解,当然有错误或者有值得探讨的地方还请大家在评论中指出,多谢。

你可能感兴趣的:(golang,学习,java)