我知道使用协程作为基础和实现一个玩具调度器的基础知识。但我假设这是对异步调度器整体的过于简单化的看法。在我的思想中有一整套缺失的漏洞。
如何防止cpu运行空闲/等待的调度程序?一些纤程只是休眠,其他的则等待操作系统的输入。
发布于 2009-12-29 04:39:59
您需要将io操作多路复用到一个基于事件的接口(选择/轮询)中,这样您就可以利用操作系统进行等待,同时仍然能够调度其他纤程。select/poll具有超时参数-对于想要休眠的纤程,您可以创建一个优先级队列,该队列使用select/poll选项来模拟休眠调用。
尝试为执行阻塞操作(调用读/写/睡眠等)的纤程提供服务。除非您在本地线程中调度每个纤程,否则直接不会工作--这有点超出了它的目的。
有关工作实现,请参阅http://swtch.com/libtask/。
发布于 2009-05-04 07:10:51
您可能应该看看集合上下文函数家族(http://en.wikipedia.org/wiki/Setcontext)。这意味着在您的应用程序中,您将需要将所有可能阻塞(读、写、睡眠等)的函数重新实现为异步形式,并返回到调度器。
只有“调度器光纤”才能使用select()、poll()或epoll()来等待完成事件。这意味着当调度程序空闲时,进程将在select/poll/epoll调用中休眠,并且不会占用CPU。
发布于 2014-10-05 17:20:31
虽然现在回答有点晚,但我想提一下,我有一个用C实现的光纤库,叫做libevfibers。
尽管它是一个年轻的项目,但它已经用于生产。它不仅为读/写套接字等经典异步操作提供了解决方案,而且还以非阻塞方式解决了文件系统IO问题。这个项目利用了3个很棒的库- libcoro,libev和libeio。
https://stackoverflow.com/questions/765368
复制相似问题