Linux 5.13中的一对内存分配改进

2021-05-13 10:55:46

Warning: Can only detect less than 5000 characters

我很确定它'应该对一些像堆栈(你在列表中拿出一个页面时,你需要一个页面)。 "列表不太可能遍历"意味着没有人可能需要随机访问列表元素(只是第一个项目)。

如果我正确理解,列表将嵌入到结构页面本身(其许多包装字段中的一个)。这意味着如果您想与页面执行任何操作,您无论如何都需要将其加载到缓存行中,因此(几乎)没有额外的开销。类似的想法通常用于用户空间(以及在内核中,我猜)是一个"免费列表"您将列表嵌入您要跟踪的内容中,以便轻松地处理"分配一件事和#34;请求刚返回指针到头(使用嵌入的&#34更新指针;下一个"指针在您刚退回的东西)。这个"嵌入式列表"可能是暂时的 - 一旦你返回你可以摆脱列表指针的东西,所以你可以轻松地处理相同大小的内存块(至少尺寸(void *)长而没有任何开销。一旦你把东西放在列表上,你就会恢复指针并将其放在头部。唯一的问题是当您需要时,同时需要10页。 CPU需要遍历链接列表并一个接一个地加载每个结构页。对于数组变量,CPU仍需要加载每个结构页,但它可以并行地进行。但是,我相信这里的用例是一次询问一页。哎呀,如果您愿意(虽然依赖于CPU),您甚至可以尝试预取下一个结构页面。

>在链接列表中返回页面可能看起来有点奇怪,特别是自从"链接列表"和#34;可扩展性"往往不要很好地努力。这种方法的优点是它不需要分配任何存储器来跟踪分配的页面。由于列表不太可能被遍历(从来没有必要通过整体列表),因此可伸缩性问题不适用于此处。

所以这只是订单0页?如果有人试图使用9,000字节的Jumbo数据包进行100 Gbps网络,会发生什么?每个数据包都需要订单-2分配4页。卡片更有可能做RDMA,而不是让内核看到数据包。但如果是......

是的,它'只适用于Order-0页面。网卡具有分散集合功能,并将令人愉快地将9000字节数据包分为三个不连续的页面。网络人员经常尝试使用64字节数据包进行线速率。这很难,因此请求MM人员找到更多快速获取内存的方法。

你的意思是?双重下划线是内核中的常见约定,以表示通常不用于常用的功能的变体。

发表于5月10日,2021 19:55 UTC(Mon)通过Abatters(✭支持者✭,#6932)[链接]

可能参考此问题:https://en.cppreference.com/w/c/language/identifier#reser ......以下标识符是保留的,可能不会在程序中声明(执行此操作,因此调用未定义的行为):3)所有以下划线开头的标识符,后跟大写字母或另一个下划线(这些保留的标识符允许库允许库在场景中使用众多横向外部宏和函数)---内核已违反此规则很久。它在用户空间中更重要,但避免与Glibc内部有冲突。我记得几年前有一旦编程指南(由Rusty Russell IIRC)使用内核和#39; SPERSPACE的双重下划线公约,但一旦有人指出上述规则,它必须更新。如果最近推动核心遵循规则,我不知道它。

>核心一直违反此规则长时间IIRC核心解释一直是保留了下划线前缀_fors运行时实现_并与普通Comfy用户扫描空间相比,内核_IS_实现而不是托管环境而不是托管环境。加上如上所述,它们应该是主要的助手,它可能很好地觉得有点肮脏使用出口的__symbol :)