Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 出于性能原因,将代码推向内核或用户空间?_C_Linux_Performance_Operating System_Kernel - Fatal编程技术网

C 出于性能原因,将代码推向内核或用户空间?

C 出于性能原因,将代码推向内核或用户空间?,c,linux,performance,operating-system,kernel,C,Linux,Performance,Operating System,Kernel,最初我认为,为了使代码更快,最好尝试减少内核和用户空间之间的转换——通过推动更多代码在内核中运行。然而,我在一些论坛上读到过类似这样的文章,实际上情况正好相反——更多的代码被推到了用户空间中。为什么会这样?这似乎违反直觉?将更多代码放入用户空间仍然需要内核用户转换,而将代码放入内核并不需要内核用户转换 万一有人问我——我在考虑一个处理数据包的应用程序 编辑 所以更多的细节,我在考虑数据包何时到达-我想重新写入网络堆栈并删除不适用于我的数据包处理且没有副本的代码-将数据包数据放在用户程序可以尽快访

最初我认为,为了使代码更快,最好尝试减少内核和用户空间之间的转换——通过推动更多代码在内核中运行。然而,我在一些论坛上读到过类似这样的文章,实际上情况正好相反——更多的代码被推到了用户空间中。为什么会这样?这似乎违反直觉?将更多代码放入用户空间仍然需要内核用户转换,而将代码放入内核并不需要内核用户转换

万一有人问我——我在考虑一个处理数据包的应用程序

编辑


所以更多的细节,我在考虑数据包何时到达-我想重新写入网络堆栈并删除不适用于我的数据包处理且没有副本的代码-将数据包数据放在用户程序可以尽快访问的地方。

从用户模式转换到内核模式需要一些时间和资源,因此,将代码保持在其中一种模式可能会提高性能


如前所述:在您的情况下,最好的选择可能是尽可能快地获取数据,并使其立即在用户土地上可用,并在用户土地上进行处理。。。在我看来,将所有处理移到内核级似乎是不必要的。。。除非你有充分的理由这么做。。。如果没有进一步的信息,在我看来,你没有理由相信你在内核模式下会比在用户模式下做得更快,你所能做的就是时不时地进行一次模式转换,这不应该是相关的。

如果你希望你的代码进入正式的内核发行版,“将用户模式的部分拖入内核”通常来说,这可能是个坏主意

当然,如果您可以证明这样做是实现更好性能的最佳(主观的,我知道)方法,并且成本是可以接受的(在内核中额外的代码->内核上更多的维护负担,更大的内核->更多关于内核“太大”的抱怨等方面),那么一定要遵循这条路线

但一般来说,最好是在用户模式下做更多的工作,并使内核模式的任务更小,如果这是一种替代方法的话。如果不确切知道您在内核中做了什么以及在用户模式下做了什么,就很难确定您应该/不应该做什么。但是,例如,将十几个“项”分批放入一个块中,这是内核执行某项操作的一个请求,这比多次调用内核要好

作为对您描述所做工作的编辑的回应:
传递一个用户模式内存区域来接收数据,然后在数据包到达时复制到该区域不是更好吗。假设“所有内存都是相等的”[如果不是,那么“就地使用”也会有问题],这也应该同样有效,在内核中花费的时间更少

内核是一个时间敏感区域,它是ISR、时间刻度例程和硬件关键部分所在的位置。正因为如此,我们的目标是保持内核代码小而紧凑,进入,完成工作,然后退出

在您的情况下,您从网络获取数据包,这是一项依赖于硬件的任务(您需要从较低的网络层获取数据),因此获取数据,清除缓冲区,并通过DMA传输将其发送到用户空间;然后在用户空间中进行处理


根据我的经验:在内核中执行你的代码所获得的性能不会超过在内核中执行更多的代码所损失的性能。

不,这与官方内核版本无关-这将是我自己的私有实现。我将对我的问题进行进一步的详细编辑。对将内核功能迁移到userland中所获得的性能有何评论?@mezamorphic-给你一个更具体的答案的问题是,它确实取决于许多设计因素。正在进行的处理量、用户空间和内核空间之间缓冲区转换的大小/持续时间/频率、内核进程的优先级等。。此外,还取决于您要查看的性能指标、中断服务时间、丢失缓冲区的百分比、转换的CPU负载(这同样取决于移动的字节数、进程优先级和CPU策略)。如果你问一些具体的代码和指标,我可以给出一个更好的答案Mike如果你能把我和一些更详细地描述所有变量(你刚才提到的)的文献联系起来,我会亲自进去看看吗?当你提到缓冲区时,我想我们指的是网络堆栈和nagles算法等?