v: 1 v: 88 v: 33 v: 10 v: 345 Found it!v: 2 v: 999 Task cancelded! v: 68 Task cancelded! Task cancelded!因为是并发程序所以每次打印的结果的顺序是不一样的 , 这个你们可以自己试验一下 。而且也并不是先开启的 goroutine 就一定会先执行 , 主要还是看调度器先调度哪个 。
Go语言调度器所有应用程序都是运行在操作系统上 , 真正用来干活(计算)的是 CPU。所以谈到 Go 语言调度器 , 我们也绕不开操作系统、进程与线程这些概念 。线程是操作系统调度时的最基本单元 , 而 linux 在调度器并不区分进程和线程的调度 , 它们在不同操作系统上也有不同的实现 , 但是在大多数的实现中线程都属于进程 。
多个线程可以属于同一个进程并共享内存空间 。因为多线程不需要创建新的虚拟内存空间 , 所以它们也不需要内存管理单元处理上下文的切换 , 线程之间的通信也正是基于共享的内存进行的 , 与重量级的进程相比 , 线程显得比较轻量 。
虽然线程比较轻量 , 但是在调度时也有比较大的额外开销 。每个线程会都占用 1 兆以上的内存空间 , 在对线程进行切换时不止会消耗较多的内存 , 恢复寄存器中的内容还需要向操作系统申请或者销毁对应的资源 。
大量的线程出现了新的问题
- 高内存占用
- 调度的CPU高消耗
一个 用户态线程 必须要绑定一个 内核态线程 , 但是CPU并不知道有 用户态线程 的存在 , 它只知道它运行的是一个 内核态线程 (Linux的PCB进程控制块) 。这样 , 我们再去细化分类 , 内核线程依然叫线程(thread) , 用户线程叫协程(co-routine) 。既然一个协程可以绑定一个线程 , 那么也可以通过实现协程调度器把多个协程与一个或者多个线程进行绑定 。
Go 语言的 goroutine 来自协程的概念 , 让一组可复用的函数运行在一组线程之上 , 即使有协程阻塞 , 该线程的其他协程也可以被 runtime 调度 , 转移到其他可运行的线程上 。最关键的是 , 程序员看不到这些底层的细节 , 这就降低了编程的难度 , 提供了更容易的并发 。
Go 中 , 协程被称为 goroutine , 它非常轻量 , 一个 goroutine 只占几KB , 并且这几KB就足够 goroutine 运行完 , 这就能在有限的内存空间内支持大量 goroutine , 支持了更多的并发 。虽然一个 goroutine 的栈只占几KB , 但实际是可伸缩的 , 如果需要更多内存 , runtime 会自动为 goroutine 分配 。
既然我们知道了 goroutine 和系统线程的关系 , 那么最关键的一点就是实现协程调度器了 。
【并发问题的解决思路以及Go语言调度器工作原理】Go 目前使用的调度器是2012年重新设计的 , 因为之前的调度器性能存在问题 , 所以使用4年就被废弃了 。重新设计的调度器使用 G-M-P 模型并一直沿用至今 。

文章插图
调度器G-M-P模型
- G — 表示 goroutine , 它是一个待执行的任务;
- M — 表示操作系统的线程 , 它由操作系统的调度器调度和管理;
- P — 表示处理器 , 它可以被看做运行在线程上的本地调度器;
goroutine 只存在于 Go 语言的运行时 , 它是 Go 语言在用户态提供的线程 , 作为一种粒度更细的资源调度单元 , 如果使用得当能够在高并发的场景下更高效地利用机器的 CPU。
MGo 语言并发模型中的 M 是操作系统线程 。调度器最多可以创建 10000 个线程 , 但是其中大多数的线程都不会执行用户代码(可能陷入系统调用) , 最多只会有 GOMAXPROCS 个活跃线程能够正常运行 。
在默认情况下 , 运行时会将 GOMAXPROCS 设置成当前机器的核数 , 我们也可以使用 runtime.GOMAXPROCS 来改变程序中最大的线程数 。一个四核机器上会创建四个活跃的操作系统线程 , 每一个线程都对应一个运行时中的 runtime.m 结构体 。
推荐阅读
- Win10系统下搭建Go lang开发环境更换国内源并且体验宇宙最快框架
- 电脑运行慢?并不是它的性能不行,关掉一个开关,让你电脑飞起来
- Nginx在高并发下的性能优化点!有这篇就够了
- 网传普洱茶减肥不靠谱 并不能分解脂肪
- Linux服务端最大并发数是多少?
- 服务器上网友上传重复图片太多,几步操作检测重复图片并删除
- Win10电脑搜狗输入法无法输入中文并且输入法栏不见了的解决方法
- 81个用于日常问题的Python代码片段
- 架构设计 | 高并发流量削峰,共享资源加锁机制
- 用Python实现十大经典排序算法-插入、选择、快速、冒泡、归并等
