Golang的高并发

Golang的调度器有三个核心的元素:

  1. 物理处理器
  2. 逻辑处理器
  3. goroutine

物理处理器更接近cpu核的概念,主要包括

  1. 调度线程来运行。
  2. 分配逻辑处理器的基础, 每个物理处理器默认分配一个逻辑处理器。
  3. 实现并行运行的关键。

逻辑处理器:

  1. 线程和逻辑处理器来绑定.
  2. 从本地队列调度goroutine来运行。
  3. 运行goroutine。

goroutine:编程端的任务

goroutine调度的核心机制:
Go调度器管理goroutine
逻辑处理器是Golang编译器实现的非常灵活的异步调度goroutine的核心处理器。Golang高并发是协程的机制也是基于此核心处理器的功能。

逻辑处理器需要线程来绑定的【底层依赖线程】,Go语言限制每个程序最多1000个线程, 基于此核心机制,即使单个的逻辑处理器也能调度无数个goroutine高效运行。

实际上,可以支持多个逻辑处理器。
并发和并行的区别
上图这里将的是针对Golang的并发和并行,实际上广义的并发概念是包括并行的,还是看我们所看问题的角度,如果针对CPU和任务,那这些都是并发。如果再究其细节,两个逻辑处理器和一个逻辑处理器的区别,那么从单位时间角度考虑,我们可以说两个逻辑处理器在执行任务方面达到了并行。

支持多个逻辑处理器能达到并行的效果, 并行的效果还需要计算机拥有多个物理处理器,其实还是每个物理处理器分配一个逻辑处理器,不然的就是逻辑处理器在线程间切换,线程又只在一个CPU核上不断的轮训, 达不到真正并行的效果。

多个逻辑处理器适配多个物理处理器才能实现多cpu核心的利用。现在的计算机都是多核心的,所以golang能充分的利用CPU的资源。

一些概念来自《Go语言实战》
有需要这本电子书的可以私信我,我已经将此书熟读两遍了,质量还是不错的,有笔记的版本和无笔记的版本我都有。