并发与并行:
并发是 指同时管理很多事情,很多事物同时对同一数据进行操作。
并行是 同时做很多事情,让不同的代码片段同时在不同的处理器上执行.
goroutine运行过程:
1. golang运行时默认会为每个可用的物理处理器分配一个逻辑处理器,每个逻辑处理器都会绑定单个操作系统线程。
创建一个goroutine -------> 加入到全局运行队列
准备运行goroutine -------->
1.调度器为其分配逻辑处理器,将其加入该逻辑处理器对应的本地运行队列中
2. 等待逻辑处理器调度运行。
如果goroutine运行中执行了一个阻塞的系统调用(非网络IO) -------->
1. 操作系统线程 O1 与 逻辑处理器分离, 逻辑处理器与正在运行的goroutine G1分离
2. golang调度器会创建一个新的线程N1绑定到逻辑处理器上,开始执行本地其他的goroutine, O1运行中G1等待系统调用执行完.
3. G1系统调用执行完成之后,G1放回全局运行队列中,O1线程保留,以便后续使用。
网络IO阻塞流程上有点不同:
1. goroutine 会与逻辑处理器分离, goroutine移到网路轮询器中运行,网络准备就绪,对应的gorouttine会重新分配到逻辑处理器中完成操作。
golang的并行是将多个goroutine 分配到多个逻辑处理上执行。