看着有点蒙,你这是把协当线程用了?
Yield从用户显式调用变成了随时打断。
几个问题
1. 进入yield时 寄存器保存的细节。随时打断的方式下,寄存器得全部保存吧?
2. 如果协程持锁时因为cache miss被打断了,会怎么样?
3. 很多协程yield出去的时候是要传递参数的,比如generator模式。
【 在 MaLing (uranus) 的大作中提到: 】
: 协程之间的切换是一个物理线程/进程内部,用户态进行上下文之间的切换。通常协程上下文用使用双向链表链接,其个数由程序员决定。协程切换(设定为yield_thread函数)的代价+ 跳转延迟大约在20个周期左右,L2 延迟在 12个周期,L3延迟基本在50个周期,内存延迟在100ns(3GHZ,300个周期 ), 所以我们在一个进程内部引入多个协程,例如15个协程?(15 *20 周期等于内存访问 300个周期)
:
: 数据会由于三种原因执行 yield_thread函数:
: 1. 在取指令之后,根据指令地址预测是否产生数据L2缓存缺失,如果预测缺失,允许当前指令继续运行,但是对于内存的操作改为prefetch, 协程再切回来后重新执行该指令。
--
FROM 111.193.209.*