gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:05:16 26 4
gpt4 key购买 nike

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

它尝试 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com