如何实现实用的光纤调度器?

时间:2009-04-19 12:50:11

标签: linux asynchronous scheduling language-implementation

我知道使用协同程序作为基础并实现玩具调度程序的基础知识。但我认为这是关于整体异步调度程序的过于简化的观点。我的想法中缺少一整套漏洞。

如何防止cpu运行正在运行空闲/等待的调度程序?有些光纤只是睡觉,有些则等待来自操作系统的输入。

5 个答案:

答案 0 :(得分:7)

您需要将io操作复用到基于事件的界面(选择/轮询),这样您就可以利用操作系统进行等待,同时仍然可以安排其他光纤。 select / poll有一个超时参数 - 对于想要休眠的光纤,你可以创建一个优先级队列,使用select / poll选项来模拟一个睡眠调用。

尝试提供阻塞操作的光纤(调用读/写/睡眠等)。除非你在本机线程中安排每根光纤,否则直接无效。

请参阅http://swtch.com/libtask/了解有效的实施方案。

答案 1 :(得分:5)

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

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

答案 2 :(得分:1)

虽然回答有点迟,但我想提一下,我在C中实际使用了一个光纤库,名为libevfibers

尽管是一个年轻的项目,它仍然用于生产。它不仅为读取/写入套接字等经典异步操作提供了解决方案,而且还以非阻塞方式处理文件系统IO。该项目利用了3个伟大的图书馆--- libcoro,libev和libeio。

答案 3 :(得分:1)

您还可以通过使用协同程序来控制控制流。支持创建它们的库是BOOST.ASIO。

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

答案 4 :(得分:0)

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

睡眠/等待光纤只是意味着它现在没有安排 - 它只是切换到事件循环。

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