Linux协程的回顾随笔

回顾协程

一、协程简介

1.协程定义

协程的定义可以通过它与函数和线程的不同来进行界定,来加深其特点印象的效果。

协程与函数的区别
函数不能中断,协程可以转换

协程和函数的不同之处是,函数一旦被调用,只能从头开始执行,直到函数执行结束退出,而协程可以执行到一半就退出(称为yield),但此时协程并未真正结束,只是暂时让出CPU执行权,在后面适当的时机协程可以重新恢复运行(称为resume),在这段时间里其他的协程可以获得CPU并运行,所以协程也称为轻量级线程。也同样因此,协程使用时最好使用一些表示状态的参数,用来判断是否切出等问题。

函数空间为栈,协程空间要算

函数一般不需要申请空间,可以直接执行。对于协程来说,需要具体的大小,需要申请具体的空间。由于需要提前设置空间,那么就可能会有空间不足等情况会造成不可预知的后果。

协程与线程的区别
线程并发执行,协程不能并发

协程虽然被称为轻量级线程,但在单线程内,协程并不能并发执行,只能是一个协程结束或yield后,再执行另一个协程,而线程则是可以真正并发执行的。其实这点也好理解,毕竟协程只是以一种花里胡哨的方式去运行一个函数,不管实现得如何巧妙,也不可能在单线程里做到同时运行两个函数,否则还要多线程有何用?这也同样说明了协程不需要用锁,若是使用锁可能会造成死锁。

线程切换消耗多,协程切换耗费小

线程在进行切换时,需要切换到内核态来进行转换,协程可以直接通过用户态进行转换。协程切换时,上下文包含了函数在当前执行状态下的全部CPU寄存器的值,这些寄存器值记录了函数栈帧、代码的执行位置,线程需要切换的消息就更多了。

2.协程的使用方式

对称协程

对称协程一般时指协程之间的地位,也就是说不分,所有协程都是平等的。协程可以创建协程进行其他操作

非对称协程

非对称协程则是地位上的不对称,有一个主协程来管理其他的协程。这也就意味着子协程再创建子协程可能会导致混乱。并且协程执行完后必须要切换到主协程,主协程再切换到别的需要的完成的协程。

sylar库里的协程

sylar库使用的是非对称协程的用法,而协程分为了不同的两种状态。

协程的形式

协程两种不同状态,其中最重要的区别在于主协程的位置。

1.用户自己使用的形式

用户自己创建协程并使用,用户自己使用协程时会自动创建当前线程的主协程,通过主协程控制当前协程和后续子线程里其他创建的协程。

2.管理器使用的协程形式

管理器可能需要使用多个线程内部的多个协程,而这些信息需要在管理器中进行统一。因此主协程的信息或者协程的后续切换信息都需要放入管理器内。

协程的结构
1.状态

由于协程可以切入切出的特性,协程的状态是非常有必要的,通过状态将协程的情况进行了表示在这里分为了
INIT:协程内的函数还未开始运行
HOLD:协程已经转换出去,本协程内的函数暂停转换到其他的协程去了
EXEC: 函数正在运行
TERM:函数已经运行完成
READY:一般使用时和INIT相同,但应该是表示有耗费时间程序在运行时切换出去的标志
EXCEPT:函数运行时有异常

2.结构图
非对称协程结构
主协程 子协程1 子协程2 子协程3 EXEC 主协程切换 HODE EXEC 子协程切回主协程 EXEC TERM 主协程切换 HODE EXEC 子协程切回主协程 EXEC TERM 主协程切换 EXEC HODE 子协程切回主协程 TERM EXEC 主协程 子协程1 子协程2 子协程3
协程简要结构

协程结构主要是将申请内存部分与整体分开
简单的介绍

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值