c - kmalloc 许多结构,我应该一次全部分配还是分别分配

标签 c memory linux-kernel kernel linux-device-driver

我正在阅读设备驱动程序的源代码。

它尝试 kmalloc 16 struct foo

spin_lock_bh(&sq->lock);
for (i=0; i<16; i++) {
        msg = kmalloc(sizeof(*msg), GFP_ATOMIC);
        if (!msg)
                break;
        msg->next = sq->msg_first;
        sq->msg_first = msg; 
        sq->nr_msgs++;
}    
spin_unlock_bh(&sq->lock);

那么,这样会更好吗kmalloc(sizeof(*msg) * 16, GFP_ATOMIC) ?为什么?

最佳答案

在没有看到源代码的情况下很难做出明确的说法。以这种方式进行内存分配的基本原理可能与我们在这里提出的任何内容都非常不同。

一个合理的理由可能是这样的。正如您所看到的,分配的项目在单链表中链接在一起。这可能只是一个初始项目池,可以随着驱动程序运行而扩展或缩短。初始池中的某些项目可能会在稍后被删除和释放。如果您要在一次分配中分配此内存,您将无法做到这一点。由于项目链接到链表中,我认为这不会用作 Tsyvarev 那样的数组。建议。

我必须说,通常情况下,理由可以用一个词来形容:因为。因为代码的作者认为这样做更方便,或更清晰,等等。不幸的是这种情况经常发生。只要这些地方不重要(即不在热路径中),就可以。你无法解决所有问题。

编辑
正如下面的回复中所述,分配最多为 16 个项目。这可能是一个经过深思熟虑的设计决定。如果分配在某个时刻失败,它就会跳出分配循环,从 16 个项目中分配尽可能多的项目。这实际上符合这样的想法:这些项目可能构成一个初始池最多 16 项。

关于c - kmalloc 许多结构,我应该一次全部分配还是分别分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39941647/

相关文章:

客户端/服务器 pthreads 程序未在 Valgrind 下执行。正常运行

c - 如何生成与直方图匹配的点?

c++ - 逆序计数排序 vector 重新分配

Linux 内核在压力下有更好的响应时间

linux - linux中的模块编程

c++ - 函数 pow() int C++

Android - 使用处理程序?

Python/Numpy 内存错误

linux - Snort 和 Iptables 与 Linux 内核的交互

c - 使用 LD_PRELOAD 进行 Malloc