8小时golang速成(五)Golang高阶 goroutine调度机制
1、goroutine调度机制
协程并发
协程:coroutine。也叫轻量级线程。
与传统的系统级线程和进程相比,协程最大的优势在于“轻量级”。可以轻松创建上万个而不会导致系统资源衰竭。
协程:coroutine。也叫轻量级线程。
与传统的系统级线程和进程相比,协程最大的优势在于“轻量级”。可以轻松创建上万个而不会导致系统资源衰竭。
而线程和进程通常很难超过1万个。这也是协程别称“轻量级线程”的原因。
一个线程中可以有任意多个协程,但某一时刻只能有一个协程在运行,多个协程分享该线程分配到的计算机资源。
多数语言在语法层面并不直接支持协程,而是通过库的方式支持,但用库的方式支持的功能也并不完整,
一个线程中可以有任意多个协程,但某一时刻只能有一个协程在运行,多个协程分享该线程分配到的计算机资源。
多数语言在语法层面并不直接支持协程,而是通过库的方式支持,但用库的方式支持的功能也并不完整,
比如仅仅提供协程的创建、销毁与切换等能力。如果在这样的轻量级线程中调用一个同步 IO 操作,
比如网络通信、本地文件读写,都会阻塞其他的并发执行轻量级线程,从而无法真正达到轻量级线程本身期望达到的目标。
在协程中,调用一个任务就像调用一个函数一样,消耗的系统资源最少!但能达到进程、线程并发相同的效果。
在一次并发任务中,进程、线程、协程均可以实现。从系统资源消耗的角度出发来看,进程相当多,线程次之,协程最少。
在协程中,调用一个任务就像调用一个函数一样,消耗的系统资源最少!但能达到进程、线程并发相同的效果。
在一次并发任务中,进程、线程、协程均可以实现。从系统资源消耗的角度出发来看,进程相当多,线程次之,协程最少。
1、创建、销毁、调度G 都需要每个M获取锁,这就形成了激烈的锁竞争
2、M转移G会造成延迟和额外的系统负载
3、系统调用CPU在M之间的切换 导致频繁的线程阻塞和取消阻塞操作增加了系统开销
1、调度器的设计策略: 复用线程 利用并行 抢占 全局G队列
1、复用线程 work stealing机制 从全局偷取,hand off 机制
M2空闲 本地没有协程 所以从M1中取偷取一个协程过来
如果协程阻塞了
则会创建一个新的线程 把p1先移动到线程3中
之前的线程可以阻塞 但是我cpu先切换到新的线程上先交手到这边来
2、利用并行
GOMAXPROCS 限定P的个数 CPU核数/2
3、抢占策略
如果有其他G在等待运行 10ms轮训 10ms会释放 下一个G 会抢占
4、全局G队列
如果其他的P 的 没有G 会从全局队列中 解锁 到 新的P使用 并 加锁
声明 欢迎转载,但请保留文章原始出处:) 博客园:https://www.cnblogs.com/chenxiaomeng/
如出现转载未声明 将追究法律责任~谢谢合作