首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何实现一个实用的光纤调度器?

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

Stack Overflow用户
提问于 2009-04-19 12:50:11
回答 5查看 8.9K关注 0票数 10

我知道使用协程作为基础和实现一个玩具调度器的基础知识。但我假设这是对异步调度器整体的过于简单化的看法。在我的思想中有一整套缺失的漏洞。

如何防止cpu运行空闲/等待的调度程序?一些纤程只是休眠,其他的则等待操作系统的输入。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-12-29 04:39:59

您需要将io操作多路复用到一个基于事件的接口(选择/轮询)中,这样您就可以利用操作系统进行等待,同时仍然能够调度其他纤程。select/poll具有超时参数-对于想要休眠的纤程,您可以创建一个优先级队列,该队列使用select/poll选项来模拟休眠调用。

尝试为执行阻塞操作(调用读/写/睡眠等)的纤程提供服务。除非您在本地线程中调度每个纤程,否则直接不会工作--这有点超出了它的目的。

有关工作实现,请参阅http://swtch.com/libtask/

票数 7
EN

Stack Overflow用户

发布于 2009-05-04 07:10:51

您可能应该看看集合上下文函数家族(http://en.wikipedia.org/wiki/Setcontext)。这意味着在您的应用程序中,您将需要将所有可能阻塞(读、写、睡眠等)的函数重新实现为异步形式,并返回到调度器。

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

票数 6
EN

Stack Overflow用户

发布于 2014-10-05 17:20:31

虽然现在回答有点晚,但我想提一下,我有一个用C实现的光纤库,叫做libevfibers

尽管它是一个年轻的项目,但它已经用于生产。它不仅为读/写套接字等经典异步操作提供了解决方案,而且还以非阻塞方式解决了文件系统IO问题。这个项目利用了3个很棒的库- libcoro,libev和libeio。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/765368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档