协程
从事软件开发的同学,一般都对进程和线程有一些认识。但协程可能很少遇到或讲到,当然有些语言天生就有协程的使用概念,比如lua、python等。
有人讲,历史上是先有协程的,是OS用来模拟多任务并发。这一点学过OS的应该都能领悟。概念上讲,它是非抢占式的,所以存在多任务时间片使用不公平的问题。就个人理解而言,现在人们通常将,用户态的调度单位称为“协程”,也称作“用户态线程”。进程它与进程、线程的显著差异就是,1)它是非抢占的;2)它的切换不会陷入内核态。
抢占比较好理解,比如:中断抢占、高优先抢占低优先等。
陷入内核。进程和线程的切换都会在切换时陷入内核,它们的调度都是由内核调度完成的。不同的是,进程的切换,倒腾的资源是最多,进程的页表、TLB等全部要进行切换;线程的切换稍微简单点,需要把相关寄存器内容切换下就可以了。
如果仅仅是一些业务逻辑或计算,不需要IO、时钟阻塞等等,那就可以用协程来工作。在复杂的业务系统里面,如果有成千上万、甚至更多的进程/线程的话,系统耗费在进程/线程上面的切换将是巨大的。所以,协程在某些业务场景下应用,就可以极大的利用系统的资源,提高系统的利用率。
Notice,协程有其的特长,但是不会取代进程/线程的,是有使用局限性的。一般来讲,协程的逻辑中是不可以调用阻塞式系统接口的,除非使用的协程库内封装的阻塞接口,否则会导致其所在的进程/线程被挂起。另,使用时,1个协程需要显式的调用切换/出让接口以让其他协程进行工作。