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 / 问题

问题[mmap](unix)

Martin Hope
Aramya
Asked: 2022-03-22 05:01:06 +0800 CST

mmap在哪个段分配内存

  • 0

我一开始以为是堆,但它似乎在不同的地方分配内存。radare2 将其标记为以下内容:

0x00007fb07dacd000 - 0x00007fb07dace000 - usr 4K s rw- unk2 unk2

既然不是堆,那我们把mmapped内存所在的段叫做什么?

mmap
  • 1 个回答
  • 76 Views
Martin Hope
Philip Couling
Asked: 2021-10-01 03:12:06 +0800 CST

docker容器是否为从同一层映射但不同图像的文件内存共享RAM?

  • 1

我不能 100% 确定这是 U&L 问题还是SO问题。总的来说,我将它发布在 U&L 上,因为它与操作系统相关。

背景

据我所知,Linux 将通过将共享库(.so 文件)映射为写时复制来加载共享库(.so 文件)。这样做的一个优点是,共享同一个大型库的多个进程都将共享相同的物理 RAM,用于该库的大部分内容。

Docker 不一定会发生这种情况,因为进程在基于“映像”的自己的“容器”中运行,并且每个映像都包含它自己的共享库副本。这是故意的。它允许程序附带它们自己的依赖项(库),这些依赖项可能与系统上已安装的库有很大不同。

因此,在 docker 主机上本地运行的程序不会与在 docker 容器中运行的程序共享相同的库内存,因为 docker 容器中的程序已映射到库的不同副本。

Docker 层解释

Docker 镜像是分层创建的。每一层都添加到较低的一层,有时会覆盖现有文件。并非每个文件都在每一层中更改。

Docker 允许您通过向旧图像添加新层来创建新图像。发生这种情况时,您最终会得到多个共享相同图层的图像。这些图像共享一些相同文件的相同副本。

Docker 将这些层分开保存,至少在运行时之前是这样。例如:从 Docker Hub 拉取图像,Docker 通过获取每个图像的组成层来获取图像。它只获取它还没有的层。

我不知道的

在创建或运行容器时,Docker 必须将这些层组装成一个单一的连贯文件系统。我不知道它是怎么做到的。它可能:

  • 将文件复制到一个地方
  • 在一处创建硬链接
  • 使用覆盖文件系统

根据它的作用,源自同一层的文件可能是相同的副本,或者它们可能是文件系统上的完全相同的文件。

这最终会影响文件被多个进程映射到内存时发生的情况。

我真正想发现什么?

我想知道从两个不同的图像运行两个容器是否会为源自单个层的单个共享库共享相同的 RAM。

docker mmap
  • 1 个回答
  • 736 Views
Martin Hope
Rick
Asked: 2020-03-04 23:09:59 +0800 CST

什么是惰性交换预留?

  • 1

我正在阅读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 个回答
  • 589 Views
Martin Hope
user308485
Asked: 2019-11-29 12:31:02 +0800 CST

映射非常大的文件

  • 2

我有一个非常大的磁盘驱动器 (2TB),但不是很多 RAM (8GB)。我希望能够在我的磁盘文件系统上存在的一个大文件(~200GB)上运行一些大数据实验。我知道这在磁盘带宽方面会非常昂贵,但我不介意高 I/O 使用率。

如何将这个巨大的文件加载到 C++ 数组中,以便可以在我选择的位置对文件执行读写操作?mmap 是否适用于此目的?我应该使用哪些参数选项来执行此操作?我不想在运行程序的任何时候触发 OOM 杀手。

我知道 mmap 支持文件支持和匿名映射,但我不完全确定使用哪个。使用私有映射与共享映射之间怎么样?

mmap
  • 1 个回答
  • 877 Views
Martin Hope
user001
Asked: 2019-05-20 14:12:34 +0800 CST

mmap:其他进程写入以前只读映射的文件的影响

  • 5

我试图了解当mmap系统调用已映射到内存的文件随后被其他进程写入时会发生什么。

我在“进程A”中对mmap内存进行了保护。PROT_READ如果我关闭进程 A 中的底层文件描述符,然后另一个进程写入该文件(不使用mmap; 只是将 stdout 简单重定向到>shell 中使用的文件),mmap进程 A 的地址空间中的 ed 内存是否受影响? 鉴于这些页面是只读的,我希望它们不会改变。但是,在尝试解析映射的内存时,SIGBUS由于无效的内存访问 ( ) ,进程 A 被信号终止。Non-existent physical address at address 0x[...]我怀疑这是由其他进程写入支持文件引起的。设置MAP_PRIVATE是否足以完全保护此内存免受其他进程的影响?

c mmap
  • 1 个回答
  • 2167 Views
Martin Hope
z.h.
Asked: 2019-05-15 00:35:05 +0800 CST

mmap - 映射到 2^48 以上的地址

  • 0

我知道 64 位 PC 使用的地址空间是[0,2^48),但是我可以使用 mmap 将文件映射到 2 48以上的地址吗?

我写了下面的代码,但发现映射的地址还在里面[0,2^48)。

int
main(void) {
    const char* name = "/tmp/file";

    int fd = open(name, O_RDONLY);
    if (fd < 0) {
        perror("open");
        exit(-1);
    }

    int pageSize = sysconf(_SC_PAGE_SIZE);
    void* targetAddr = (void*)(0UL - pageSize);

    char* str = mmap(targetAddr, pageSize, PROT_READ, MAP_SHARED, fd, 0);
    if (str == MAP_FAILED) {
        perror("mmap");
        exit(-1);
    }

    printf("addr: %p\n", str);

    return 0;
}

样本输出:addr: 0x7fc761f6f000

甚至可以将某些文件映射到 2 48以上的地址mmap吗?

如果没有,我该如何使用“未使用的”bit48-bit63?

我只是好奇如何利用地址的高位。

操作系统:Ubuntu16.04

内存大小:4GB

mmap
  • 1 个回答
  • 247 Views
Martin Hope
jack malkovick
Asked: 2018-06-05 08:44:20 +0800 CST

监控页面缓存/内存映射文件访问

  • 1

我有一个使用多个内存映射文件的应用程序。如果我检查主要的页面错误数(带有/proc/<pid>/stat),它们会飙升。

我想知道是否有可能以某种方式监视哪些内存映射文件受到进程的页面交换输入和输出的影响?

至少我想看看某个进程访问了哪些 mmap 文件。我尝试使用 strace,但我发现没有读取,因为我想直接访问内存不需要系统调用。

我也很高兴知道它们发生的进程空间中的虚拟地址,所以至少我可以手动将它们映射到 pmap 输出中的文件

strace mmap
  • 1 个回答
  • 1119 Views

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