• 协程 和 async await


    协程, 是 为了 避免 闭包传递变量 的 性能损耗 而产生  。

    如果不是 为了 避免 闭包传递变量 的 性能损耗 ,    线程池 和 Task 已经够了,  不需要 再设计 出 协程 来  。

     

    闭包, 会 让 所有共享 的 变量 变成 引用 访问 的 方式,包括 值变量  。

    因为 闭包 是将 变量 放到 堆 里 共享  。

     

    协程 就是在 堆 里  模拟出一个   堆栈 和 协程“上下文”  存储区,  这和 操作系统 的 线程 堆栈 和 上下文 架构 是 相似  的  。

    上下文存储区 保存 每个 协程 的  堆栈 的 栈顶 栈底,   在 切换 协程 时,  将 栈顶 栈底 存入 CPU 寄存器, 

    这样,  代码 中 对 变量 的 访问 就可以 和 线程 一样,  通过 编译在 指令中 的 偏移量 操作数 加上 栈底  的 地址 就可以得到 变量 的 地址  。

    这样 对  函数  局部变量 的 访问 就和 线程 一样 ,  指令 偏移量 操作数 +  栈底 ,    这样 一次 寻址  。

    避免了   闭包     将 变量 变成 引用访问 的 二次寻址 带来 的 性能损耗   。

     

    所以,  C#   的    async  await      本身 就 包含了 一个 协程 的 实现,    这大概也是  C#  async  await     要通过 编译器  把 代码 编译为 状态机 而不是      Task.ContinueWith()    的  原因   。

     

    协程 需要  编译器 在 汇编 层面  实现,   不能 通过 高级语言 的 类库 / 封装 / 设计模式   的  方式实现  。

     

    InnerC   还不能 描述 协程,    可以考虑 给 InnerC 增加    协程   的 语法支持  。

    在 现阶段,    协程 是一个 有 技术含量 和 竞争力 的 技术  。

     

  • 相关阅读:
    java编程题古典算法之兔子问题
    java基础之final关键字
    java基础之final关键字
    java基础之静态代码块,局部代码块,构造代码块区别。
    java基础之静态代码块,局部代码块,构造代码块区别。
    java基础之完数判断
    java基础之完数判断
    java基础之二维数组不定义列数
    正则表达式快速入门
    深入理解JSON对象
  • 原文地址:https://www.cnblogs.com/KSongKing/p/10799875.html
Copyright © 2020-2023  润新知