Golang基础——GMP模型

G-M-P模型:M为线程(内核态),P为调度器,G为Goroutine

该模型是Golang的协程Goroutine的主要运作设计。P调度器实际上作为中间层,依一定条件持有M线程,对加入其持有的可运行G协程环形队列runq从队列头开始分配至M并运行。

P主要调度设计:基于协作(1.12~1.14)/信号(1.14~)的任务抢占式调度,目的是对多个P再分配实现任务平衡。


以用户态线程设计角度,对Golang中Goroutine协程思考,可发现:

Goroutine是用户态线程,其是相对与操作系统线程(内核态)的设计,是一种粒度更细的资源调度单元(其内存空间占用更小,一般在堆栈上初始分配4k并可动态调整;被线程大数量级多路复用),面向的是一些可以被多线程提高性能但操作系统线程创建、切换资源成本又相对高昂的任务,常常为一段代码、函数。

回忆操作系统的进程、线程、协程:

进程是程序的执行时单位、概念,设计包括【程序】、【数据集】、【程序控制块】。是系统运行分配、调度的独立单元。

线程是基本的CPU执行单元(轻量级进程),也是程序执行过程中的最小单元,多个线程可以同属一个进程并共享内存空间。设计包括【线程ID】、【程序计数器】、【寄存器集合】和【堆栈】共同组成。因为多线程不需要创建新的虚拟内存空间,所以它们也不需要内存管理单元处理上下文的切换,线程之间的通信也正是基于共享的内存进行的,与重量级的进程相比,线程显得比较轻量。但线程仍属于内核态,且占用内存空间不小,因而切换仍是系统调用且时间、空间资源消耗较大。

并行 | 并发 概念是理解进程、线程间设计目的与关系的一个切入点:并发是程序设计概念,其多进程被同时处理的现象(单核心CPU可以通过进程切换实现这一现象),一个程序是并发的即可被多进程、多线程利用实现该现象;而并行是多核心CPU实际多进程、线程同时处理的现象,其发生取决于系统核心数量、调度情况。因而 并发不一定并行,并行一定并发

协程是用户态实现的线程,其调度完全由用户控制,相比线程更轻量级(实际开销依赖协程具体设计实现,切换一般都无需进入内核态),任务常常为一段代码、函数。

上一篇
下一篇