协程 goroutine,线程,进程,GPM,的介绍

发布时间 2023-04-07 22:50:33作者: yangphp

前言:

进程,线程,协程,并发,并行介绍

正文:

线程,进程介绍:

1. 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;

2. 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线

3. 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间

4. 调度和切换:线程上下文切换比进程上下文切换要快得多

5.一个进程可以创建和撤销多个线程,同一个进程中的多个线程之间可以并发执行。

6.一个程序至少有一个进程,一个进程至少有一个线程

7.线程上下文切换比进程上下文切换要快得多

8.进程拥有独立的虚拟内存地址空间,线程共享进程的虚拟地址空间

 

线程,协程介绍:

协程:一种比线程更加轻量级的存在,调度由用户自己控制,本质上有点类似于用户级线程正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。

线程:一个线程上可以跑多个协程,协程是轻量级的线程。

一个线程可以多个协程

线程进程都是同步机制,而协程则是异步。

协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态

线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程

 

并行,并发介绍:

并行(parallel)指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。在同一时间点,任务一定是同时运行。

并发(concurrency)指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。在同一时间点,任务并不会同时运行。

多线程程序在单核心的 cpu 上运行,称为并发;多线程程序在多核心的 cpu 上运行,称为并行。

并发与并行并不相同,并发主要由切换时间片来实现同时运行,并行则是直接利用多核实现多线程的运行,Go程序可以设置使用核心数,以发挥多核计算机的能力。

 

Go中的协程 Goroutine

Goroutine Go语言中的轻量级线程实现Go从语言层面支持了协程。可在单个进程里执行成千上万的并发任务,它是Go语言并发设计的核心。不同的是,Go 运行时(runtime)管理、系统调用等多方面对 Goroutine 调度进行了封装和处理,Go 程序会智能地将 Goroutine 中的任务合理地分配给每个 CPU

 

优雅的并发编程范式,完善的并发支持,出色的并发性能是Go语言区别于其他语言的一大特色。

GPM调度:

 

 

 

G: Goroutine我们所说的协程,为用户级的轻量级线程,里面除了存放本goroutine信息外 还有与所在P的绑定等信息。

P:ProcessorGM的调度对象,用来调度GM之间的关联关系,其数量可通过GOMAXPROCS()来设置,默认为核心数。

MMachineGo运行时(runtime)对操作系统内核线程的虚拟, M与内核线程一般是一一映射的关系, 一个groutine最终是要放到M上执行的。