最初我认为要使代码更快,尝试减少内核和用户空间之间的转换 - 通过推动更多代码在内核中运行会更好。但是,我已经在像SO这样的几个论坛中读到了实际相反的事情 - 更多的代码被推入了用户空间。为什么是这样?这似乎反直觉?将更多代码放入用户空间仍然需要内核用户转换,而将代码放入内核并不需要内核用户转换?
如果有人问 - 我正在考虑处理数据包数据的应用程序。
修改
更详细的信息,我正在考虑数据包数据何时到达 - 我想重新编写网络堆栈并删除不适用于我的数据包处理的代码,并将数据包数据复制到某处用户程序可以尽快访问它。
答案 0 :(得分:4)
内核是一个时间敏感区域,它是您的ISR,时间刻度例程和硬件关键部分所在的位置。因此,目标是保持内核代码小而紧,进入,完成工作,然后退出。
在您的情况下,您从网络获取数据包,这是一项与硬件相关的任务(您需要从较低的网络层获取数据),因此请获取数据,清除缓冲区并发送数据通过DMA传输到用户空间;然后在用户空间进行处理。
根据我的经验:通过在内核中执行 代码来获得获得不会超过丢失整体执行更多内核中的代码。
答案 1 :(得分:1)
从用户模式到内核模式的转换需要一些时间和资源,因此仅将代码保留在其中一种模式中可能会提高性能。
如上所述:在您的情况下,您可能最好的选择是尽可能快地获取数据并立即在用户区域中使用并在用户区域中进行处理...将所有处理移至内核级别在我看来是不必要的...除非你有充分的理由这样做...没有进一步的信息在我看来你没有理由相信你会在内核模式下比用户模式更快地做到这一点,你所能得到的只是偶尔的模式转换,这应该是不相关的。
答案 2 :(得分:1)
如果您希望您的代码进入官方内核版本,“将用户模式部分改入内核”通常可能是一个坏主意。
当然,如果你能证明通过这样做是最好的(主观的,我知道)方式来获得更好的性能,并且成本是可以接受的(就内核中的额外代码而言 - >更多的维护负担内核,更大的内核 - >关于内核“太大”等的更多抱怨,然后一定要遵循这条路线。
但总的来说,最好通过在用户模式下做更多的工作来解决这个问题,并使内核模式任务更小,如果这是另一种选择。如果不确切知道你在内核中做了什么以及你在用户模式中做了什么,很难确定你应该/不应该做什么。但是,例如将十几个“项目”批处理到一个块,这是一个内核执行某事的请求,这比调用内核十几次更好。
回应您的编辑描述您正在做的事情: 传递用户模式内存区域以接收数据,然后只是在数据包到达时复制到该数据中是不是更好。假设“所有内存都相等”[如果不是这样,你就会遇到“就地使用”的问题],这应该也能正常工作,花在内核上的时间更少。