zoukankan      html  css  js  c++  java
  • 协程 和 async await

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

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

     

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

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

     

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

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

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

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

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

     

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

     

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

     

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

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

     

  • 相关阅读:
    case when in sql server's stored procedure
    Hadoop-2.2.0中国文献—— MapReduce 下一代 -- 公平调度
    cocos2d-x游戏循环和日程安排
    归并+高速分拣
    【Nginx】启动过程
    IOS线程操作(3)
    Android最方便的数据库--LitePal
    Android采用Application总结一下
    POJ 2151 Check the difficulty of problems (动态规划-可能DP)
    乞讨N!到底有多少0
  • 原文地址:https://www.cnblogs.com/KSongKing/p/10799875.html
Copyright © 2011-2022 走看看