• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

Recommended Posts

写这篇文章的原因是我刚刚看到https://zhuanlan.zhihu.com/p/497224333,知乎《C++20协程原理和应用》。

103010的开头一段

"

教练可以分为两种类型:无堆叠教练和堆叠教练。无栈缓存是指可以挂起/恢复的函数,而可栈缓存相当于用户态线程。栈协调切换的代价是用户态线程切换的代价,非栈协调切换的代价相当于函数调用的代价。

无栈协同例程和线程的区别:无栈协同例程只能被线程调用,不抢占内核调度,但是线程可以抢占内核调度。

"

我低头看了一些内容。在我看来,无栈协程是状态机,栈协程是协程。关于状态机和协程的比较,我在前几天写的https://www.cnblogs.com/KSongKing/p/16181359.html 《C++20协程原理和应用》里讲过。

状态机允许编译器进行尽可能深的内联和寄存器优化(寄存器布局),以实现函数统一。

现在,你还可以加一个,状态机可以减少缓存未命中,《协程 的 主要作用 是 让 单核 GC 变成 单线程 GC》中有提到。

当然,状态机也可以减少进程/线程切换时堆栈加载和加载缓存的次数。

与线程相比,大概是协同切换的工作只需要保存/恢复上下文,而线程切换除了保存/恢复上下文还需要调度,也就是操作系统要计算线程的优先级,比如“抢占式多任务”。也就是说,在过去的一段时间内,哪个线程使用CPU多,就优先运行哪个线程。换句话说,线程使用CPU越多,可以获得的时间片就越多,优先运行。

这个计算优先级的算法是检查一个二叉树。

也就是说,线程切换除了保存/恢复上下文之外,还要做更多查找二叉树的工作。实际上可能会有一些其他的工作和性能开销,比如线程切换需要先切换到系统进程,本身就是一个切换,需要保存/恢复上下文,然后系统进程调度,查找二叉树,再切换线程。性能开销,比如将系统进程的一些数据加载到缓存中,比如二叉树。

比线程协调多了一项检查二叉树的工作,2020年底到2021上半年QQ群讨论ILBC/D的时候提到过。

Link to comment
Share on other sites