8小时golang速成(五)Golang高阶 goroutine调度机制

1、goroutine调度机制

协程并发
协程: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使用 并 加锁

 

posted @ 2024-02-13 22:05  陈晓猛  阅读(87)  评论(0编辑  收藏  举报