神秘使者到Java帝国传道协程,竟被轰了出去( 二 )


使者没有退让 , 却问道:“既然操作系统可以调度管理多个线程 , 那为何线程不可以调度管理函数的执行?”
群臣再次交头接耳 , 议论起来 。
“陛下 , 此番邦使者妖言惑众 , 微臣建议即刻逐出大殿 , 以正视听!”
国王应允 , 随即遣人上前 。
不待侍卫上前 , 使者自行离去 , 边走边说到:“可叹!堂堂Java帝国 , 却容不下一个新技术”
临别相会使者心灰意冷 , 打算离开Java帝国 , 却在半道上被人给拦了下来 。
“先生请留步 , 我家主人请先生府上相会”
使者来到府上 , 原来主人乃当地一富豪乡绅 。
“先生今日在朝堂之事 , 我已听说 , 在下对先生提到的函数执行过程中可中断和恢复的技术颇有兴趣 , 还请先生不吝赐教” , 主人说完拜了一拜 。
“赐教不敢当 , 我此次来Java帝国 , 所传之道名叫协程 , 是一种高并发开发的绝技 , 可无奈贵国国君与大臣皆不识货 , 无功而返 , 可惜啊 , 可惜!” , 使者叹息到 。
神秘使者到Java帝国传道协程,竟被轰了出去文章插图
“协程?这是何物?我只听说过进程和线程 , 却是从未听过协程”
使者起身说到:“线程是操作系统抽象出来的执行流 , 由操作系统统一调度管理 。 那在一个线程中 , 同样可以抽象出多个执行流 , 由线程来统一调度管理 。 这线程之上抽象的执行流就是协程”
主人有些不解 , 问到:“一个线程怎么会有多个执行流呢?”
“这便是我今日在朝堂上说的 , 线程执行函数遇到阻塞后 , 可以保存上下文后退出 , 转而执行别处的代码 , 这里就从一个执行流转向了另外的执行流” , 使者解释到 。
主人拍案而起 , “原来是这个意思 , 妙哉 , 妙哉啊!不过 , 这线程是操作系统在调度管理 , 那线程里抽象出来的执行流 , 也就是协程 , 该怎么调度管理呢?操作系统可以通过时钟中断和系统调用进入内核来剥夺线程的执行权 , 那线程该如何剥夺协程的执行权来实现调度管理呢?”
神秘使者到Java帝国传道协程,竟被轰了出去文章插图
“真是个好问题!线程的调度由操作系统来管理 , 是抢占式调度 。 而协程不同 , 协程需要互相配合 , 主动交出执行权 , 这也是协程的名字——协作式程序的来历”
“主动交出执行权?如何办到?” , 主人追问 。
“办法有很多 , 比如C++帝国有一协程框架 , 名叫libco , 他通过HOOK关键的系统函数来实现调度器的介入”
“那你们Golang是怎么做的?也是这样吗?”
“我们Golang帝国可不一样 , 我们先天设计就是支持协程 , 系统调用都被我们封装好了 , 应用程序调用时遇到需要阻塞的 , 像是文件读写Read/Write、Sleep我们的调度器就能有机会介入 , 去执行调度管理了” , 使者得意的说到 。
神秘使者到Java帝国传道协程,竟被轰了出去文章插图
主人思考片刻 , 问到:“那我们Java该如何实现呢 , 还请先生赐教”
“你们Java语言 , 是通过JVM在执行 , 字节码的执行都在JVM的掌控之中 , 要想实现对应用代码执行流的中断和恢复还不是易如反掌?” , 使者说到 。
主人点了点头 , 若有所思 。
新的征程主人与使者交谈甚欢 , 不知不觉已近黄昏 。
主人起身说到:“今蒙先生赐教 , 大慰平生 。 还请先生在府上多留时日 , 我好细细请教 。 ”
使者连连挥手 , 说到:“我还有要事在身 , 明日就要离去”
“不知先生欲往何处?”
“听说C++帝国又要发布新版本 , 我打算前往传道”
主人面露疑惑:“C++帝国不是有libco了吗?”
“libco终究不是朝廷之物 , 此番前去 , 希望可以让协程纳入新的官方标准”