如何实现一个实际的光纤调度器?

我知道关于使用协程作为基础和实现玩具调度程序的基本知识。 但是我认为这是对整个asynchronous调度程序的简单看法。 我的思想中缺less一整套洞。

如何保持CPU运行闲置/等待的调度程序? 有些光纤正在睡眠,有些则等待操作系统的input。

Solutions Collecting From Web of "如何实现一个实际的光纤调度器?"

您需要将io操作复用到基于事件的接口(选择/轮询)中,以便您可以利用操作系统执行等待,同时仍可以调度其他光纤。 select / poll有一个超时参数 – 对于想要睡眠的光纤,可以创建一个使用select / poll选项来模拟睡眠呼叫的优先级队列。

试图服务阻止操作的光纤(呼叫读/写/睡眠等)。 直接不会工作,除非你安排每个光纤在本地线程 – 哪种打败的目的。

请参阅http://swtch.com/libtask/获取工作实现。

你应该看看setcontext系列的函数( http://en.wikipedia.org/wiki/Setcontext )。 这将意味着在你的应用程序中,你将需要重新实现所有可能阻塞(读,写,休眠等)为异步形式的函数并返回调度器。

只有“调度器光纤”将使用select(),poll()或epoll()等待完成事件。 这意味着当调度程序空闲时,进程将在select / poll / epoll调用中休眠,并且不会占用CPU。

虽然回答迟了一点,但我想提一下,我已经在C中实现了一个名为libevfibers的光纤库。

尽管是一个年轻的项目,它被用于生产。 它不仅为传统的异步操作(如读/写套接字)提供了解决方案,而且还以非阻塞的方式处理文件系统IO。 该项目利用了libcoro,libev和libeio三大图书馆。

您也可以通过使用协程来控制控制流。 支持创建这些的库是BOOST.ASIO。

这里有一个很好的例子: Boost Stackful Coroutines

从实现的角度来看,您可以从异步事件循环实现开始。 然后,您可以通过使用异步事件处理程序切换到相应的光纤来实现光纤调度。

睡眠/等待光纤意味着它现在不在计划中,而只是切换到事件循环。

顺便说一句,如果你正在寻找一些实际的代码,看看http://svn.cmeerw.net/src/nginetd/trunk/这是仍在进行中,但试图实现一个光纤调度器的顶部多线程事件循环(使用Win32 I / O完成端口或Linux边缘触发的epoll)。