调度分组重传

时间:2011-01-04 05:26:19

标签: c++ c linux network-programming scheduling

我正在通过UDP编程网络协议,在Linux中使用C / C ++。该协议必须提供可靠性,因此我将模拟像TCP上的TCP重传这样的东西。

这可以使用 pthreads fork 来完成,但我认为这是一种过度杀伤并消耗大量系统资源。更好的方法是利用调度程序

我可能无法使用Linux内部调度程序,因为我在用户空间编程。是否有标准的C / C ++库来实现这一目标?第三方图书馆怎么样?

编辑:有些人问我为什么要这样做。为什么不使用TCP呢?

答案是,因为我正在实施隧道协议。如果有人通过TCP隧道TCP,效率将大幅下降。这里有更多信息Why TCP Over TCP Is A Bad Idea

3 个答案:

答案 0 :(得分:5)

你所追求的“调度程序”称为“select”,它是linux中可用的用户空间调用。输入“man 2 select”以阅读帮助页面以了解如何使用它。

如果您需要超时,只需使用超时值调用select()。当新数据到达或超时已到期时,select调用将返回。如果超时,您可以进行重新传输。

答案 1 :(得分:1)

以下是如何完成asynchronous coroutines with Boost的示例。在这种情况下,Boost管理创建线程以运行协程的开销,这样您就不需要了。如果您希望内核管理您的中断,您可以使用alarm & setitimer,但他们可以做的事情非常有限。

任何解决方案都会在某个级别包含线程,分支或它们的某些变体,除非您使用select()等同步管理主线程中的传输。

答案 2 :(得分:1)

不清楚您究竟要安排什么。您可以使用libevent来实现高效且有点便携的界面。这基本上类似于Matthew建议使用select,但在FreeBSD,Linux和MacOS X上使用最有效的界面(选择不是这样)(实际上他们的页面现在声称Windows支持,但我不太熟悉它) 。 这将提供执行非阻塞事件驱动的网络调用的能力。它不会解决调度部分。在单独的线程中进行操作不会损害您的性能。我认为每个连接运行一个pthread并不是最好的方法,但是有一个调度线程和一些处理网络事件的工作线程,也许一些非平凡的处理通常都能正常工作。