Golang的高并发
Golang的调度器有三个核心的元素:
- 物理处理器
- 逻辑处理器
- goroutine
物理处理器更接近cpu核的概念,主要包括
- 调度线程来运行。
- 分配逻辑处理器的基础, 每个物理处理器默认分配一个逻辑处理器。
- 实现并行运行的关键。
逻辑处理器:
- 线程和逻辑处理器来绑定.
- 从本地队列调度goroutine来运行。
- 运行goroutine。
goroutine:编程端的任务
goroutine调度的核心机制:
逻辑处理器是Golang编译器实现的非常灵活的异步调度goroutine的核心处理器。Golang高并发是协程的机制也是基于此核心处理器的功能。
逻辑处理器需要线程来绑定的【底层依赖线程】,Go语言限制每个程序最多1000个线程, 基于此核心机制,即使单个的逻辑处理器也能调度无数个goroutine高效运行。
实际上,可以支持多个逻辑处理器。
上图这里将的是针对Golang的并发和并行,实际上广义的并发概念是包括并行的,还是看我们所看问题的角度,如果针对CPU和任务,那这些都是并发。如果再究其细节,两个逻辑处理器和一个逻辑处理器的区别,那么从单位时间角度考虑,我们可以说两个逻辑处理器在执行任务方面达到了并行。
支持多个逻辑处理器能达到并行的效果, 并行的效果还需要计算机拥有多个物理处理器,其实还是每个物理处理器分配一个逻辑处理器,不然的就是逻辑处理器在线程间切换,线程又只在一个CPU核上不断的轮训, 达不到真正并行的效果。
多个逻辑处理器适配多个物理处理器才能实现多cpu核心的利用。现在的计算机都是多核心的,所以golang能充分的利用CPU的资源。
一些概念来自《Go语言实战》
有需要这本电子书的可以私信我,我已经将此书熟读两遍了,质量还是不错的,有笔记的版本和无笔记的版本我都有。