「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战」。
由于最近看源码有点吃力,所以先稍微研究下GPM模型这类基础知识(倒叙学习法)
预备知识
在单线程的程序中,是不需要考虑这些的,但是人们为了更好的利用CPU,平衡CPU效率与硬盘IO效率之间的差异,使用并发的方式来解决问题,然而进程作为切换的对象显得过于臃肿,因此人们用线程来代替进程成为占用CPU的最小单位。
然而随着时代的变化,几m的线程在满足互联网高并发的同时,依旧会使用大量的资源。因此我们使用协程来代替线程。
那么,协程的好处是什么?
我们将一个线程分为“内核态“线程和”用户态“线程。一个“用户态线程”必须要绑定一个“内核态线程”,但是CPU并不知道有“用户态线程”的存在,它只知道它运行的是一个“内核态线程”(Linux的PCB进程控制块)。我们将“内核态“线程依旧命名为线程,”用户态“线程命名为协程。
之前是一个协程对应一个线程,导致线程切换消耗比较大,那么可不可以多个协程对应一个线程呢?绑定同一线程的多个协程切换时,不需要针对线程的操作,切换变得轻量快速,但是如果一个协程发生了阻塞,那么与他绑定一个线程的协程们的工作就都被阻塞了。
因此我们使用N个线程绑定M个协程,这样可以既轻量快速的切换协程,也不会出现一个阻塞导致多个协程阻塞的问题。
协程调度器(被废弃)
约定:我们用G代表一个协程,用M代表一个线程
M要执行或者放回G都需要获得全局go协程队列的互斥锁,这就造成了频繁的锁竞争,同时不同G没有任何的局部性,绑定本身没有任何规律,也是对资源的一种浪费。因此这个协程调度器很快被废弃了。