AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 571043
Accepted
Rick
Rick
Asked: 2020-03-04 23:09:59 +0800 CST2020-03-04 23:09:59 +0800 CST 2020-03-04 23:09:59 +0800 CST

什么是惰性交换预留?

  • 772

我正在阅读Linux 编程接口。

49.9 MAP_NORESERVE 和交换空间过度使用

一些应用程序创建大型(通常是私有匿名)映射,但只使用映射区域的一小部分。例如,某些类型的科学应用程序分配一个非常大的数组,但只对数组中几个相隔很远的元素(所谓的稀疏数组)进行操作。

如果内核总是为整个此类映射分配(或保留)足够的交换空间,那么可能会浪费大量的交换空间。相反,内核可以仅在实际需要时(即,当应用程序访问页面时)为映射的页面保留交换空间。这种方法称为惰性交换保留,其优点是应用程序使用的总虚拟内存可以超过 RAM 加上交换空间的总大小。

换句话说,惰性交换保留允许过度使用交换空间。只要所有进程不尝试访问其映射的整个范围,这就可以正常工作。...

据我所知,交换空间是磁盘中的一块空间,保留用于内存交换。当内存中的这些页面处于非活动状态时,它们会被交换到磁盘中的交换空间中。它就像内存/内存的二级缓存。

那么这个惰性交换预留机制到底是什么鬼?

让我用一个例子来说明我的困惑。

  1. 一些应用程序创建大型(通常是私有匿名)映射......

好的,然后假设我malloc有一个大数组16384(4096*4)字节(创建大型(通常是私有匿名)映射),并且只对数组中几个广泛分离的元素进行操作。

然后一些非活动页面被交换到交换空间,对吗?假设0-4095(4096B),8192-12287(4096B)在内存中,所有其他非活动页面4096-8191(4096B),12288-16383(4096B)被交换到交换空间中。

那么这句话是什么意思:

相反,内核可以仅在实际需要时(即,当应用程序访问页面时)为映射的页面保留交换空间。

如果不留在交换空间4096-8191(4096B)中,这些非活动页面(和)还能留在哪里?文本似乎表明交换空间存在 3 级缓存。 12288-16383(4096B)

memory -> swap space (disk) -> ????

swap mmap
  • 2 2 个回答
  • 589 Views

2 个回答

  • Voted
  1. Best Answer
    Stephen Kitt
    2020-03-05T01:13:04+08:002020-03-05T01:13:04+08:00

    Swap 并不是真正的内存二级缓存。它是内存的几个后备存储之一。当内核需要分配一页物理内存,但没有足够的空闲内存时,需要驱逐另一页;只有当被驱逐页面的内容是可丢弃的,或者可以从其他地方恢复时,它才能做到这一点。其他地方是后备存储:它可以是磁盘上的文件(例如,用于可执行文件或映射文件),或者某些交换区域。

    当内存记帐跟踪过度使用时,交换保留开始发挥作用(参见LPI中的表 49-4 )。当不允许过度使用时,内核需要在分配时确定是否可以进行分配。对于私有可写映射和共享匿名映射,这意味着它必须有足够的地址空间,以及足够的交换空间(这样内核才能保证映射内存的内容可以写入那里,从而保证写入到映射内存永远不会导致SIGSEGV)。

    过度使用需要惰性交换保留:这意味着内核可以分配交换支持的内存映射,而无需保留相应的交换空间。正如LPI中提到的,这允许程序分配比实际可用更多的内存,并且应该使用MAP_NORESERVE. 只有在写入页面时才会发生保留,这意味着写入可能会失败SIGSEGV或导致 OOM 杀手介入。

    这对于比您的 16KiB 示例更大的分配变得重要。想象一下,您想要一个 64GiB、262,144×262,144 的稀疏数组,以使您的程序更易于编写:在严格保留的情况下,您需要拥有所有可用的内存;没有严格的保留,你不会,只有你写的页面才会被实际分配。

    请注意,这都是 Linux 特定的,并且与所选的系统过度使用策略 ( ) 紧密相关/proc/sys/vm/overcommit_memory:在模式 1(总是过度使用)和 2(从不过度使用)中,MAP_NORESERVE不会改变任何东西,它只会在模式 0 中起作用。

    • 3
  2. user373503
    2020-03-05T02:11:13+08:002020-03-05T02:11:13+08:00

    交换空间是磁盘中的一块空间

    一块什么样的空间?虚拟内存。

    内核很容易为每个进程提供所需的虚拟内存。那是懒惰的,过度使用的部分。稀疏科学数组的例子想表明,偷懒通常是个好主意。整个数组不会一次使用,因此可以同时运行其他程序。

    它就像内存/内存的二级缓存。

    但大多数时候(没有专用交换设备)并不比“磁盘”快

    恰恰相反,尤其是在过度使用的情况下:

    交换将(物理)RAM 变成存储设备的缓存。

    (即 RAM 不是进程拥有和持有的东西,但它是每个进程的活动页面的工作区域,包括映射文件)。


    这里是关于过度使用交换空间,而不仅仅是 RAM。无论是否使用交换,都可能导致过度使用后出现 OOM 的情况。

    • 1

相关问题

  • 为什么 Linux 在 VM 中需要交换空间?

  • 当根分区和 RAM 足够大时,是否需要交换分区?[复制]

  • Linux 交换分区是否支持修剪?

  • 在 Arch Linux 中手动安装交换文件而不是交换分区

  • 使用 zswap 和 max_pool_percent = 100 防止 zram LRU 反转

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve