操作系统 — 协程的简单理解

协程的简单理解



协程是一种用户态的轻量级线程, 我们的server的发展如下:IO密集型应用:多进程 -> 多线程 ->事件驱动 ->协程  

CPU密集型应用:多进程->多线程 如果说多进程对应多CPU,多线程对应多核CPU,那么事件驱动和协程则是在充分挖掘不断提高性能的单核CPU

的潜力. 异步事件驱动模型中,把会导致阻塞的操作转化为一个异步操作,主线程负责发起这个异步操作,并处理这个异步操作的结果. 由于所有

阻塞的操作都转化为异步操作,理论上主线程的大部分时间都是在处理实际的计算任务,少了多线程的调度时间,所以这种模型的性能通常会比较

好. 总的来说,当单核CPU性能提升,CPU不在成为性能瓶颈时,采用异步server能简化编程模型,也能提高IO密集型应用的性能.


协程拥有自己的寄存器上下文和栈. 协程调度切换时,将寄存器上下文和栈保存到其他地方,然后去做其他工作,当你的IO解除之后切回原来的状

态,恢复先前保存的寄存器上下文和栈.因此:


协程能保留上一次调用时的状态(既所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态. 也就是相当于LOL艾克的R.

(不懂得可以去百度一下~  艾克的R技能) 在并发编程中,协程与线程类似,每一个协程表示一个执行单元,有自己的本地数据,与其他协程共享数

据和其他资源. 目前主流语言基本都选择多线程作为并发设施,与线程相关的概念是抢占式多任务,而与协程相关的是协作式多任务.

不管是进程还是线程,每次阻塞,切换都需要陷入系统调用,先让CPU跑操作系统的调度程序,然后再由调度程序决定该跑哪一个进程.

而且由于抢占式调度执行顺序无法确定的特点,使用线程时需要非常小心地处理同步问题,而协程完全不存在这个问题(事件驱动好异步程序)


我们在自己的进程里面完成逻辑流调度,碰到IO我就用非阻塞式的,那么我们既可以利用到异步优势,又可以避免反复系统调用,还有进程切换造成

的开销,分分钟给你上千个逻辑流不费力,这就是协程.

基于事件驱动的编程是单线程思维,其特点是异步+回调. 协程也是单线程,但是它能让原来要使用异步+回调方式写的非人类代码,可以用看似

同步的方式写出来,它是实现推拉互动的所谓非抢占式协作的关键.


协程的优点:

1.跨平台

2.无需线程上下文切换的开销

3.无需原子操作锁定及同步的开销

5.方便切换控制流,简化编程模型

6.高并发+高扩展行+低成本: 一个CPU支持上万的协程都不是问题,所以很适合用于高并发处理

.

协程的缺点:

1.无法利用多核资源:协程的本质是一个单线程,它不能同时将单个CPU的多个核作用上,协程需要和进程配合才能运行在多CPU上.

2.进行阻塞(BLOCKing)操作会阻塞到整个程序; 这一点和事件驱动一样,可以使用异步IO操作来解决.

猜你喜欢

转载自blog.csdn.net/dawn_sf/article/details/79509433
今日推荐