- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在使用指南阅读和理解 linux 内核时- http://www.johnchukwuma.com/training/UnderstandingTheLinuxKernel3rdEdition.pdf
我想了解 Buddy 系统中有关页面分配和释放的一些内容。
The technique adopted by Linux to solve the external fragmentationproblem is based on the well-known buddy system algorithm. All freepage frames are grouped into 11 lists of blocks that contain groups of1, 2, 4, 8, 16, 32, 64, 128, 256, 512, and 1024 contiguous pageframes, respectively. [chapter 8.1.7]
这非常有意义,因为现在 Linux 可以快速处理分配请求,因为有不同的 block 大小准备好用于不同的 block 大小请求。
现在,假设系统启动,并且所有可用页面都是空闲的,并且如上所述分组到那 11 个组。现在让我们考虑一个场景,其中一个进程需要一个订单 1 的页面,然后释放它。根据免费算法-
while (order < 10)
{
buddy_idx = page_idx ^ (1 << order);
buddy = base + buddy_idx;
if (!page_is_buddy(buddy, order))
break;
list_del(&buddy->lru);
zone->free_area[order].nr_free--;
ClearPagePrivate(buddy);
buddy->private = 0;
page_idx &= buddy_idx;
order++;
}
所以根据这个和我的场景,order 1 block (第一个分配的 block )将与另一个 order 1 block 合并为一个 order 2 block ,尽管这两个 order 1 block 还没有从 order 2 中分离出来 block 在分配阶段。
这样,如果我继续分配然后释放单个 block ,系统很快就会达到所有内存块都是最大顺序的状态,这似乎效率不高。我原以为只有当这两个伙伴之前从一个更大的订单 block 中分离出来时,才会合并两个伙伴,这样会尽可能多地保留初始默认状态,并使整个系统保持高效。
我错过了什么吗?这段代码有可能是错误的吗?我不知道此代码提供的另一个优势吗?
最佳答案
当有大量最小订单 block 可用时,这种初始状态的假设可能有点可疑。如果我没记错的话,内存块的分配应该从查看最小(相同大小)的组开始,然后查看更高阶的组以找到空闲 block 。如果找到的 block 大于需要的 block ,它将被拆分,并更新相应的组。这不是很明显,但是当只有最高阶 block 可用时,整个过程可能会从初始状态开始。
我在文献中遇到的一些例子描绘了几乎相同的初始状态图。可以在维基百科上找到一个 Eloquent 例子:https://en.wikipedia.org/wiki/Buddy_memory_allocation#In_practice .图表和描述阐明了典型情况。
总而言之,我找不到“初始默认状态”假设的任何证据。将较小的 block 从较大的 block 中分离出来会降低效率的想法是最模糊的,可能值得单独讨论。
编辑:
从内核的角度来看,初始 状态可能与您假设的进程看到的初始状态不同。比方说,系统启动,并且在某个时刻有一大块内存。但是,您的假设过程不会是唯一的,- 当然。在进程能够开始分配和释放任何内存块之前,内存分配可能会发生很大变化。。可以肯定的是,内核,或者更确切地说,它的大部分子系统在初始化期间会请求大量不同大小的内存块,并且内核会在相当长的一段时间内拥有大量的内存块(也许,在整个过程中)正常运行时间)。所以,重点是当您的进程开始时,伙伴系统可能会“预热”,并且确实有足够的小块可用。但是,页面的伙伴(由您的进程获取)仍将由各种子系统拥有,并且,一旦您的进程决定释放它的页面,那些< em>buddies 不会被批准为合并准备就绪,即摘录中的 page_is_buddy()
将产生 false。当然,如果您的进程确实成功地获取现有 空闲 block 而不拆分高阶 block ,则整个场景可能是正确的。
因此,重点是您对初始 好友分布的假设可能不是真实的初始状态。它可能只是一个“预热”状态,您确实可能有小块但是它们的伙伴会很忙,因此会阻止所描述的不可控合并的假设过程。
附言这是 description page_is_buddy()
的用途。
关于Linux Buddy 页框分配和释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46685860/
在使用指南阅读和理解 linux 内核时- http://www.johnchukwuma.com/training/UnderstandingTheLinuxKernel3rdEdition.pdf
我们正在尝试这种叫做:buddy.works的服务,以取代我们的jenkins管道,用于较小的项目。它提供了用于创建管道的gui,但是我们在访问子目录时遇到了问题。 Resolving host 52
我正在尝试为 springboot 应用程序构建自定义代理。这就是我的代理 premain 的样子 .with(new AgentBuilder.Initializat
我正在尝试使用 Byte Buddy 生成一个非常简单的代码. 我有一个 POJO 类,其中一些字段用 @SecureAttribute 注释,对于这些字段,我想重写 getter 实现并将调用重定向
我已经阅读并理解了二进制伙伴内存分配方法背后的概念,并且我正在尝试将其应用到 C 语言中,但在真正开始之前,我有一些特定于实现的问题。 https://drive.google.com/file/d/
我正在尝试围绕某些类图中的类生成运行时包装器,但我不知道当图中存在循环时如何处理这种情况。想象一下,有一个类 A 有一个类型 B 的字段,但类型 B 有一个类型 A 的字段。我想生成类 A' 和 B'
我看到术语“Buddy 类”被用作“如何向另一个文件中的部分类添加注释”等问题的“答案”,但这些答案假设我知道 Buddy 类 是什么,并且代码示例假设我理解这是如何工作的/为什么工作。 对于 C#
假设我有一个方法m: public void m() { String foo = "foo"; int bar = 0; doSomething(foo, bar); } 我想使用 By
我正在尝试解决人才伙伴的这个问题。 http://www.talentbuddy.co/challenge/52a9121cc8a6c2dc91481f8d5233cc274af0110af382f4
我正在尝试生成具有循环类依赖性的类,类似于这个问题:Byte Buddy - Handling cyclic references in generated classes 作为一个最小的例子,我想生
有必要描述一下这个类的结构 class A{ private List listA; } 尝试了解决方案:Byte-buddy: generate classes with cyclic
我正在尝试实例化一个没有空参数构造函数的类(而且它的直接父类也没有空参数构造函数) Class newClass = new ByteBuddy(); .subclass(Bu
即使我提供了实际的实例,Byte Buddy 似乎也只喜欢将公共(public)类作为拦截器实现;我经常发现自己想做这样的事情: import static MethodDelegation.to;
我正在尝试使用反射来检查给定类的属性是否设置了 ReadOnly 属性。我使用的类是 MVC View 模型(使用部分“伙伴”类作为元数据。 public partial class Account
我正在尝试使用 Java 代理向类添加方法。但它给出了如下错误。 java.lang.VerifyError: Local variable table overflow Exception Deta
是否可以使用 bytebuddy 创建一个全新的类和方法? 我看到的所有示例都使用现有类或拦截现有方法来修改它们。 是否有通过bytebuddy构造一个类并动态添加一些方法并返回该类的实例的示例? 最
几天来我一直在寻找“如何在运行时向方法添加注释”的答案,并找到了这个名为 Byte Buddy 的很棒的工具,使用了它,但仍然无法按我的需要使其工作到。我确定它必须能够从这个问题中做到这一点 Can
我正在尝试使用 ByteBuddy 实现 Profiler。我目前正在努力有效地为我正在分析的方法创建适当的签名。 这是我当前实现的要点:https://gist.github.com/felixba
我正在尝试使用 Byte Buddy 设置一个类,该类实现给定实例的所有接口(interface)并将所有调用转发给该实例,这是我目前的代码: import static net.bytebuddy.
我是 Byte Buddy 的新手,我正在尝试使用它来创建对对象执行 getter 方法的接口(interface)的实现。我的界面如下所示: public interface Executor {
我是一名优秀的程序员,十分优秀!