协程 goroutine,线程,进程,GPM,的介绍
前言:
进程,线程,协程,并发,并行介绍
正文:
线程,进程介绍:
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:Processor为G和M的调度对象,用来调度G和M之间的关联关系,其数量可通过GOMAXPROCS()来设置,默认为核心数。
M:Machine是Go运行时(runtime)对操作系统内核线程的虚拟, M与内核线程一般是一一映射的关系, 一个groutine最终是要放到M上执行的。
但行好事,莫问前程!
本文来自博客园,作者:yangphp,转载请注明原文链接:https://www.cnblogs.com/ypeih/p/17297616.html