内存类别

内存类别

我知道这是简化/概括的解释,但实用程序将top(1)FreeBSD 中的内存分为六个池Active- Inactive、 、WiredCache和。输出示例:BuffersFreetop(1)

Mem: 130M Active, 42M Inact, 51M Wired, 14M Cache, 34M Buf, 648K Free
Swap: 512M Total, 512M Free

Active由正在运行的进程使用,Wired主要用于内核。Inactive是来自已关闭进程的内存,它仍然被缓存,以防需要重用,Cache是缓存数据,Buffers是磁盘缓冲区(我猜它类似于cachedLinuxfree(1)输出(?)),并且Free是完全未使用的内存。 FreeBSD 内核会自动从InactiveCache池中分配空间BuffersActiveWired如果需要的话,我是否正确?

答案1

简而言之,积极的有线是不应该或不能被换出以释放内存的已用内存。尽管不活跃的可以正确地换出,但仍然由进程或内核拥有(未释放),因此这不是大量使用的内存,但仍在使用。

新的是洗衣店这是脏内存页的列表,可能需要写入交换设备。无论是否需要交换脏内存,它们都会被添加回非活动队列中。

有线为了安全(在内核的情况下)或为了用户态进程优化(如 ZFS),内存不应该被交换。有线内存用于文件系统的缓存,可以由内核释放。至少对于 ZFS 来说,这可以被视为主要是空闲内存。

自由的内存绝对是免费的。

缓存(我猜现在已弃用)已准备好被释放,因为它已经被换出,并且仅用于可能的重新分配。

缓冲被大多数文件系统(UFS、FAT...)用作缓存,并且是文件系统使用的内存量。它可以是活动的、非活动的或有线的。

(自适应替换缓存)是 ZFS 使用的缓存,是需要时可以释放的内存。

来自FreeBSD 内存 Wiki

内存类别

积极的

  • 包含用户空间“主动”(最近)引用的页面
  • 包含干净页和脏页的混合
  • 页面守护进程定期扫描页面(每个页面每 vm.pageout_update_period 秒访问一次)
  • 扫描检查自上次扫描以来该页面是否已被引用
  • 如果完成足够的扫描而没有看到引用,则该页面将移至非活动队列
  • 实现伪 LRU

不活跃

  • 包含超出活动队列的页面
  • 包含从缓冲区高速缓存中逐出的页面
  • 包含干净页和脏页的混合
  • 当内存不足时,页面守护进程会扫描页面(从队列的头部开始):
    • 已被引用的页面被移回活动队列或非活动队列的尾部
    • 脏页被移至洗衣队列的尾部
    • 未引用的干净页面可以立即释放并重用
  • 实现第二次机会 LRU

洗衣店

  • 用于管理脏非活动页面的队列,必须先清理(“清洗”)这些页面,然后才能重新使用
  • 由单独的线程(洗衣线程)而不是页面守护进程管理
  • 洗衣线程清洗少量页面以平衡非活动队列和洗衣队列
  • 清洗频率取决于:
    • 页面守护进程释放了多少干净页面;更多的自由导致更高的洗钱频率
    • 洗衣队列相对于非活动队列的大小;如果洗衣队列越来越长,我们会更频繁地洗衣服
  • 页面由洗衣线程扫描(从队列的头部开始):
    • 已被引用的页面被移回活动队列或洗衣队列的尾部
    • 脏页被清洗,然后移动到非活动队列的头部附近

自由的

  • 可供系统其余部分使用的内存。

有线

  • 不可分页内存:在所有者明确释放之前无法释放
  • 用户态内存可以通过 mlock(2) 连接(受系统和每个用户的限制)
  • 内核内存分配器返回有线内存
  • ARC 和缓冲区高速缓存的内容是连线的
  • 有些内存是永久连接的并且永远不会被释放(例如,内核文件本身)

FreeBSD操作系统的设计与实现第6.12章页面替换(不再完全准确,但这里供参考老问题):

内核将主存分为五个列表:

  1. 有线:有线页面被锁定在内存中,无法调出。通常,这些页面正在由内核或物理内存分页器使用,或者它们已被锁定莫洛克。此外,所有用于保存已加载(即未换出)进程的线程堆栈的页面也已连接。
  2. 积极的:活动页面正在被一个或多个虚拟内存区域使用。尽管内核可以将它们调出,但这样做可能会导致活动进程再次将它们故障返回。
  3. 不活跃:非活动页面可能是脏的并且具有仍然已知的内容,但它们通常不属于任何活动区域。如果页面的内容是脏的,则必须先将内容写入后备存储,然后才能重新使用该页面。一旦页面被清理,它就会被移动到缓存列表中。如果系统内存不足,页面调出守护进程可能会尝试将活动页面移动到非活动列表,以期找到未真正使用的页面。本节稍后将介绍页面调出守护程序用于选择要从活动列表移至非活动列表的页面的选择标准。当可用内存和缓存列表降至较低水平时,页面调出守护程序将遍历非活动列表以创建更多缓存和可用页面。
  4. 缓存:缓存页面的内容仍然已知,但它们不是映射的一部分。如果它们被故障进入活动区域,则它们不属于任何映射。如果它们在活动区域​​中出现故障,它们将从缓存列表移至活动列表。如果它们用于读取或写入,它们将首先从缓存列表移动到缓冲区缓存,并最终释放到非活动列表。一个莫洛克系统调用可以从缓存列表中回收页面并连接它。缓存列表上的页面与非活动页面类似,只是它们不是脏的,这要么是因为它们自从被调入页面后未被修改,要么是因为它们已被写入其后备存储。当需要页面时,可以声明它们用于新用途。
  5. 自由的:空闲页面没有有用的内容,将用于满足新的页面错误请求。

回答你原来的问题

如果需要的话,FreeBSD 内核会自动将非活动池、缓存池和缓冲区池的空间分配给活动池或有线池,我这样说对吗?

积极的页面可以变成不活跃的如果一段时间没有使用它们。如果内核换出一个不活跃的页面 该页面已移至缓存列表。页面在缓存列表不是任何进程的虚拟映射的一部分,但可以很容易地回收,因为积极的或者有线。或者当需要 I/O 作为缓冲缓存。

有线内存不能从主内存中交换出来。如果它是由进程连接的,则需要通过调用取消munlock连接才能成为积极的再次记忆。

积极的,不活跃的有线内存可以由进程或内核释放并添加到自由的列表。

相关内容