背景:
我问这个问题是因为我目前有一个包含许多(数百到数千)线程的应用程序。这些线程大部分时间都处于空闲状态,等待将工作项放入队列中。当工作项可用时,然后通过调用一些任意复杂的现有代码对其进行处理。在某些操作系统配置中,应用程序遇到了控制最大用户进程数量的内核参数,因此我想尝试减少工作线程数量的方法。
我提出的解决方案是:
这似乎是一种基于协程的方法,我将每个工作线程替换为一个协程,这将有助于实现这一点。然后,我可以有一个由实际(内核)工作线程池支持的工作队列。当一个条目被放置到特定协同程序的队列中进行处理时,一个条目将被放置到线程池的队列中。然后它将恢复相应的协同程序,处理其排队的数据,然后再次挂起它,从而释放工作线程来执行其他工作。
实施细节:
在思考如何做到这一点时,我很难理解无堆栈协程和堆栈协程之间的功能差异。我有一些使用 加速,加速库的堆栈协程的经验。我发现从概念层面理解它相对容易: 对于每个协程,它维护一个 CPU 上下文和堆栈的副本,当你切换到一个协程时,它切换到保存的上下文(就像内核模式的调度程序一样)。
我不太清楚的是,无栈协程与此有何不同。在我的应用程序中,与上述工作项排队相关的开销量非常重要。我见过的大多数实现,比如 新的二氧化碳库,都表明无堆栈协程提供了更低开销的上下文切换。
因此,我想更清楚地理解无堆栈协程和堆栈协程之间的功能差异。具体来说,我认为这些问题:
像这个 这样的引用表明,区别在于在堆栈式协程和无堆栈式协程中哪些地方可以产生/恢复。是这样吗?有没有一个简单的例子,我可以做一个堆栈协程,但不在堆栈的?
使用自动存储变量(例如“栈上的”变量)是否有任何限制?
对于从无栈协程调用哪些函数有什么限制吗?
如果没有为无栈协同程序保存堆栈上下文,那么当协同程序运行时,自动存储变量将去哪里?