golang 中的并发和并行

并发与并行: 

     并发是 指同时管理很多事情,很多事物同时对同一数据进行操作。

     并行是  同时做很多事情,让不同的代码片段同时在不同的处理器上执行.

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 分配到多个逻辑处理上执行。

          

猜你喜欢

转载自blog.csdn.net/weixin_39594447/article/details/88383269