在内核空间中是不是有类似于 qsort() 的函数?

Posted

技术标签:

【中文标题】在内核空间中是不是有类似于 qsort() 的函数?【英文标题】:Is there a function similar to qsort() to be used in kernel space?在内核空间中是否有类似于 qsort() 的函数? 【发布时间】:2013-06-15 01:06:52 【问题描述】:

我正在编写一个可加载的内核模块,我需要使用函数qsort(),它显然不能在内核空间中使用。

我可以使用具有类似功能的功能吗?

(内核版本 3.5.0)

【问题讨论】:

快速排序不是内核代码的合适算法——它的性能太不可预测了。使用一个不错的可靠堆排序。 @LeeDanielCrocker: qsort() 不需要使用快速排序。 是的,但它经常这样做。我仍然会为内核模块推出自己的。 【参考方案1】:

这是个好问题。 lib/sort.c 中的函数sort() 可以完成这项工作,但它是堆排序,您可以在lib/sort.c 中了解有关此选择的更多信息

【讨论】:

这没有足够的信息来构成一个好的答案。您如何确定没有任何等价物? 我在某个人的 linux 内核 repo 的 lib/qsort.c 文件夹中找到了一个 qsort 实现,但我在 Torvald 的 repo 中找不到它。不过,我会 grep 他的 qsort 仓库。【参考方案2】:

linux 内核包含一个 heapsort 的实现,其执行类似于快速排序。内核开发人员推荐堆排序而不是快速排序(在内核中),并给出以下理由:

排序时间 [of heapsort] 在平均和最坏情况下都是 O(n log n)。尽管 qsort 平均快约 20%,它受到可利用的影响 O(n*n) 最坏情况的行为和额外的内存要求 它不太适合内核使用。

标题

#include <linux/sort.h>

原型

void sort(
    void *base, size_t num, size_t size,
    int (*cmp_func)(const void *, const void *),
    void (*swap_func)(void *, void *, int size));

用法

static int compare(const void *lhs, const void *rhs) 
    int lhs_integer = *(const int *)(lhs);
    int rhs_integer = *(const int *)(rhs);

    if (lhs_integer < rhs_integer) return -1;
    if (lhs_integer > rhs_integer) return 1;
    return 0;


void example() 
    int values[1024] = ...;
    sort(values, 1024, sizeof(int), &compare, NULL);

【讨论】:

qsort 函数不一定使用快速排序算法实现。语言标准只是说它排序。一个符合规范但反常的实现甚至可以使用冒泡排序。 (是的,名称qsort 是“Quicksort”的缩写,但不要求以这种方式实现。)

以上是关于在内核空间中是不是有类似于 qsort() 的函数?的主要内容,如果未能解决你的问题,请参考以下文章

Go 和命名空间:是不是有可能实现类似于 Python 的东西?

qsort函数用法

qsort函数用法(转)

Linux x86 上的内核空间是不是映射到用户空间?

qsort用法

内置 qsort 函数和稳定排序函数有啥区别?