协程原理浅析,包括activation frame和相关操作

本文详细解释了在协程操作中,ActivationFrame的作用是存储暂停点和返回地址,分为CoroutineFrame(挂起时保持)和StackFrame(挂起时释放)。CallOperation负责准备暂停,ReturnOperation涉及返回值处理和额外逻辑。协程的核心是资源的释放与使用,强调了所有权管理的重要性。
摘要由CSDN通过智能技术生成

原文
对上述链接的解析,感觉这篇文章写得挺好的,特此记录以供分析。

Activation Frame

这玩意儿我也没想出来什么翻译好一点,总觉得激活帧差点意思。可以把该帧当作一个内存块,专门用来存储suspend point(暂停点,该概念将会在下文进一步讲解)和返回地址(协程的返回值的地址)。相当于是当程序暂停去执行其他操作的时候,激活帧用来存储被执行的操作回来的地址。

所以其实激活帧可以理解为,提供激活信息的帧(包括执行的参数,返回的地址等),主要是为暂停操作服务。

该帧的分配位置主要取决于协程操作的生命周期,由于协程可以在不销毁激活帧的时候进行暂停,也就无法确保暂停时是否有必要将所有的资源全都保存在内存里,毕竟对于计算机来说内存资源就是生命,所以将之分为了两块以满足不同的需求:

  1. coroutine frame: 挂起时持续存在
  2. stack frame: 挂起时资源将被释放

Call Operation

调用操作,主要是为暂停操作进行一些准备工作,也可以理解为,你家孩子要出门了,你要为他打包点行李(哈哈哈哈哈也可以这么理解吧),首先要将被调用函数所需要的参数写到一个新的激活帧里以供使用,其次,在执行被调用函数前,还需要调用者把恢复操作的地址写到新的激活帧里。

Return Operation

返回操作,主要执行三个步骤:

  1. 先将返回值存储
  2. 释放本地变量(保存在堆上)
  3. 在返回前允许additional logic(可以实现自定义)

协程操作

协程操作主要有三点,suspend, resume, destroy, 接下来将一个一个进行分析。

suspend

暂停操作,也就是所谓的挂起操作,会在suspend_point的位置进行暂停,该暂停点主要通过co_awaitco_yield来进行标注。在暂停操作前,需要先做到以下两点:

  1. 确保寄存器中的值都被写入了coroutine frame中(在挂起时不会被释放)
  2. 在coroutine frame中记录暂停点(可能有好几个暂停点)。还需要为恢复操作销毁操作提供信息,恢复的地址和所需要销毁的资源。

resume

恢复操作,根据上文所述的coroutine frame中保存的suspend point来决定返回的位置。在调用时将会分配一个新的stack frame用于暂时性地存储资源,并将在返回时释放。

destroy

销毁操作恢复操作类似:

  1. 都需要重新激活激活帧
  2. 都会分配一个stack_frame
    区别在于销毁操作并不会回到suspend point,而会在释放内存前调用范围内地所有本地变量的析构函数,因为这些资源都被保存在堆上,需要手动释放。

说得简单点就是,你家孩子出门上大学了,这个出门的操作就是暂停操作,你需要在你家的激活帧里存储一些信息,比如说孩子上大学的时间,孩子想要回家的地址。当孩子不在家的时候(也就是当前函数被暂停后),家里的有些东西就可以扔掉了,比如说家里给孩子订的牛奶,就可以停掉了,这就是stack frame,而有些东西是不能扔掉的,比如说孩子的床,不然等孩子回来了(恢复操作),他就没地方住了,这个资源就是coroutine frame。

恢复操作就是孩子还是回到了自己的家,但是他在上大学期间,住在学校宿舍的床上(stack frame),回家之后仍然会释放床位,而销毁操作就是孩子大学毕业之后找到了工作,不回家了,但是仍然需要把学校宿舍的床释放出来(释放资源)。

协程主要是关于资源的释放和使用,以及资源的所有权的问题,在使用过程中需要注意这一点。

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
缺失mail.jar和activation.jar 是指在编译和运行Java程序时,需要使用到JavaMail API和JavaBeans Activation Framework (JAF)的相关库文件,但是这两个库文件在系统中不存在或者没有正确配置的情况。 JavaMail API是用于发送和接收电子邮件的Java编程接口,而JAF是用于处理多媒体数据的框架。这两个库文件通常由Java的开发环境(如Eclipse、IntelliJ IDEA等)或Java Development Kit(JDK)提供。 若缺失mail.jar和activation.jar,会导致编译错误或运行时错误,具体表现为找不到JavaMail API或JAF的相关类或方法。解决这个问题的方法如下: 1. 检查开发环境或JDK的安装:确保已正确安装Java的开发环境或JDK,并且版本是符合要求的。确保安装的环境或JDK包含了JavaMail API和JAF的库文件。 2. 导入库文件:如果确保开发环境或JDK中有mail.jar和activation.jar文件,但是没有正确导入到项目中,可以在项目的构建路径或依赖管理工具中进行配置,将这两个库文件添加到项目的依赖中。 3. 更新库文件版本:在某些情况下,可能会因为使用的库文件版本不兼容而导致问题。可以尝试更新mail.jar和activation.jar到最新的稳定版本,并重新配置项目的依赖。 4. 下载并添加库文件:如果系统中完全没有mail.jar和activation.jar,可以从Java官方网站或其他可靠的来源下载这两个库文件,并将其添加到项目的依赖中。 总结起来,解决缺失mail.jar和activation.jar的问题需要确保正确安装了Java的开发环境或JDK,并且将这两个库文件正确导入项目中或添加到项目的依赖中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值