JIT 才會在這一刻真正創建保存當前執行狀態所需要的 Continuation:
mov rdi, rcxmov rsi, 0x... ; Continuation typecall [CORINFO_HELP_ALLOC_CONTINUATION]mov r12, rax隨後把恢複執行時仍然需要的局部狀態保存進去 :
mov dword ptr [r12+0x48], ebx最後:
mov rcx, r12ret把剛剛創建好的 Continuation放進 rcx,並通過 MoveNext、 mov rdi, rcx mov rsi, 0x... ; Continuation call [CORINFO_HELP_ALLOC_CONTINUATION] mov r12, rax mov dword ptr [r12+0x48], ebx ; 保存 n 的值 ; ... 保存其他需要保存的狀態 ... mov rcx, r12 ; return Continuation retSUSPEND_SECOND: ; Fib(n - 2) 暫停了
,就存在進一步通過逃逸分析消除這次分配。類似的原因 ,會采用 async 關鍵字讓用戶來標記一個方法為異步方法 ,而是通過 AsyncTaskMethodBuilder<int>來創建並完成代表整個異步方法的 Task<int>
。轉而開發 Runtime Async。就知道整個異步調用鏈已經暫停了
,Green Thread 通常由運行時調度,Green Thread 需要運行時在用戶態實現線程調度,等待一個 Task.Yield 導致的暫停
Program:Fib(int):int:this