golang MPG模型

线程与协程区别

  • 线程:是系统级线程,由系统自动创建,和销毁。
  • 协程:架设在系统级线程之上的,由用户级线程,由用户(或者程序)完全控制的代码执行流程。用户级线程的创建销毁调度状态变更以及其中的代码和数据完全需要我们的程序自己去实现和处理。

协程优势

  1. 协程创建和销毁并不用通过操作系统去做,所以速度会很快。
  2. 不用操作系统调度运行,所以往往很容易控制,所以很灵活。

协程劣势

  1. 最明显也最重要的一个劣势就是复杂。线程一切操作系统代劳,而协程必须自己实现操作。

GMP模型

M

machine:系统级线程

P

processor:而 P 指的是一种可以承载若干个 G,且能够使这些 G 适时地与 M 进行对接,并得到真正运行的中介。

G

goroutine:协程,用户态线程

从宏观上说,G 和 M 由于 P 的存在可以呈现出多对多的关系。当一个正在与某个 M 对接并运行着的 G,需要因某个事件(比如等待 I/O 或锁的解除)而暂停运行的时候,调度器总会及时地发现,并把这个 G 与那个 M 分离开,以释放计算资源供那些等待运行的 G 使用。

而当一个 G 需要恢复运行的时候,调度器又会尽快地为它寻找空闲的计算资源(包括 M)并安排运行。另外,当 M 不够用时,调度器会帮我们向操作系统申请新的系统级线程,而当某个 M 已无用时,调度器又会负责把它及时地销毁掉。

正因为调度器帮助我们做了很多事,所以我们的 Go 程序才总是能高效地利用操作系统和计算机资源。程序中的所有 goroutine 也都会被充分地调度,其中的代码也都会被并发地运行,即使这样的 goroutine 有数以十万计,也仍然可以如此。

golang MPG模型_第1张图片

 

 

你可能感兴趣的:(go语言核心36讲,go语言知识汇总)