其实最早在操作系统里没有协程的概念,大家都是通过协程做逻辑上抽象来帮助我们写并发代码。
比如说这里有两段code,一段是解压的code,一段是 parser的code。大家要从解压数据结构里面去解析数据,这里对数据进行简单的encode,如果char是普通字符,会直接返回。若是特殊字符,可能就进行一个长度encode。用协程来组织逻辑,emit() 和 parser::getchar()会切换到另一个协程,如果没有协程需要两个线程结合pipe来组织,但如果有协程,我们可以在 frame里面直接控制,逻辑清晰且性能高。 我们看怎么实现协程。协程的执行上下文其实包括这几个部分,当前的站、局部变量、当前代码位置,这些其实都可以通过数据表示。
与OS内的线程切换方式一致
(1) 保存pc (2) 保存sp (3) 保存callee-save寄存器
保存完这些后,将来想回去,只要通过反向计算器pop出来,就会回到之前上下文。协程场景下,emit和 getchar都是通过这种方式去实现的。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。