rcore-os / rCore-Tutorial-v3

Let's write an OS which can run on RISC-V in Rust from scratch!
https://rcore-os.github.io/rCore-Tutorial-Book-v3/index.html
GNU General Public License v3.0
1.58k stars 452 forks source link

协程的一些想法 #124

Open Andre-HJR opened 1 year ago

Andre-HJR commented 1 year ago

无栈协程的方案之一 -- 达夫设备 ( 从语言的角度来看 )

这是属于第八章的主题,是自己学习协程的一点心得,希望对相应的工作有所帮助.

前置的一些文章 ( 建议看一下 )

达夫设备的出现是个十分偶然的"故事",但是这个"故事"却比较好的给出了一个在栈中捕获状态机的方案, 即无栈协程的方案: 在栈中利用 switch(in C++), loop(Rust) . 前者Boost(v1.66)已经有相关的设计实现,其源码在boost/asio/coroutine.hppboost/asio/yield.hpp,中, 后者则是自己偶然的一个Rust尝试,见如下代码:

#[allow(unreachable_code)]

const STATE_NUM: i32 = 68;

fn _fun_duff_device_coroutine() {
  let mut state: i32 = 0;
  let mut i: i32 = 0;
  'outer: loop {
    loop {
      match state {
        0 => {
          state = 1;
          continue 'outer;
        }
        _ => {
          loop {
            state = 1; i += 1;
            if i >= STATE_NUM { break 'outer; }
            else { continue 'outer; }
          }
        }
      }
    }
  }
}

协程是为了更好复用线程资源.对于有栈线程,代码工作者,往往需要自行设计合适的异步结构,同步结构的存储队列,唤醒机构和执行机构,工作的难度主要也来自前述的四个方面,需要应对不同的现实环境组织四个方面的"交互".而无栈的协程,从代码上看,虽然没有有栈的复杂,但也需要控制好相应的状态转换,无栈的方案(达夫设备)依赖语言设计者或无意或有意留下的"语言缺口".