fork() & 内存分配行为

2024-04-20

我在一个禁用交换和禁用内存过量使用的系统上工作。

假设我的进程当前消耗 100 MB 内存,而系统可用内存小于 100 MB。

如果我执行 fork() ,它会失败,因为内核也尝试为子进程分配 100 MB 的空间吗?

我读过 Linux 在分叉时使用写时复制,因此子进程和父进程共享所有页面。所以我想 fork 应该会成功?

假设 fork 成功,假设在调用 exec() 之前我在子进程中有几行代码。因此,父进程和子进程将继续共享文本段,并且除非子进程接触任何堆内存,否则内存使用情况不应有任何变化。它是否正确 ?

Edit: One follow-up question: With swapping/overcommit disabled, can the cumulative VSS 
(Virtual Set Size) of all the processes be more than the available physical memory ?

I tried this out.  VSS of all the processes can be much more than that of the physical 
memory available.

pmap -x output from a process. 

total kB          132588   10744    7192

First number - Virtual Set Size
Second number - Resident Set Size
third number - dirty pages

RSS is < 10% of VSS. This is with swapping and overcommit disabled.

For every shared library loaded I see something like the following..

00007fae83f07000      32      24       0 r-x--  librt-2.12.so
00007fae83f0f000    2044       0       0 -----  librt-2.12.so
00007fae8410e000       8       8       8 rw---  librt-2.12.so

00007fae84312000     252     120       0 r-x--  libevent-2.0.so.5.0.1
00007fae84351000    2048       0       0 -----  libevent-2.0.so.5.0.1
00007fae84551000       8       8       8 rw---  libevent-2.0.so.5.0.1

I guess r-x segment is code and rw- is data. But there is a 2 MB segment 
that is not loaded. I see this 2 MB segment for every single shared library. 
My process loads a lot of shared libraries. That explains the huge difference 
between VSS & RSS.

Any idea what is that 2 MB segment per shared library ? 

When overcommit is disabled, if this process calls fork() will it fail when 
the free memory is less than VSS (132588 Kb) or RSS (10744) ?

是的,如果完全禁用内存过量使用,那么fork将失败。它会失败,因为如果程序希望写入所有页面,则可能会取消共享其所有页面,而严格的过量使用模式将不允许这样做。

你可以替换fork with vfork那会起作用的。vfork被设计为仅在与exec在 fork/exec 模型中启动一个新进程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fork() & 内存分配行为 的相关文章

  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • C++ 中动态分配内存的碎片整理

    在 C 中 动态分配的内存 使用 new 和 malloc 运算符分配 的碎片整理如何工作 C 堆中没有碎片整理 因为应用程序可以自由保留指向已分配内存的指针 因此 堆管理器无法移动已分配的内存 唯一可能的 碎片整理 是释放两个相邻的块 然
  • 如何使用 Cloud Init 挂载未格式化的 EBS 卷

    Context 我正在使用https wiki jenkins io display JENKINS Amazon EC2 Plugin https wiki jenkins io display JENKINS Amazon EC2 Pl
  • NumPy 和 memmap:[Errno 24] 打开文件太多

    我正在处理大型矩阵 因此我使用 NumPy memmap 但是 我收到错误 因为显然 memmap 使用的文件描述符没有关闭 import numpy import tempfile counter 0 while True temp fd
  • 在centos中安装sqlite3 dev和其他包

    我正在尝试使用 cpanel 在 centos 机器上安装 sqlite dev 和其他库 以便能够编译应用程序 我对 debian 比 centos 更熟悉 我知道我需要的库是 libsqlite3 dev libkrb5 dev lib
  • 如果内存是字节可寻址的,为什么我们需要对齐填充?

    既然我们可以单独寻址内存的每个字节 为什么编译器要格外小心以确保结构及其成员与内存中的 32 位边界对齐 我在这里可能是错的 但是在 32 位系统上 从 0x0800 开始获取 4 个字节是不是和从 0x0801 开始获取 4 个字节一样快
  • 执行“minikube start”命令时出现问题

    malik malik minikube start minikube v1 12 0 on Ubuntu 18 04 Using the docker driver based on existing profile Starting c
  • Linux 上的 Pervasive ODBC 错误 [01000][unixODBC][驱动程序管理器]无法打开 lib '/usr/local/psql/lib/odbcci.so':找不到文件

    我正在尝试让 Pervasive v10 客户端 ODBC 在 Centos 6 上运行 据我所知 没有 64 位 ODBC 客户端 因此我必须使用 32 位客户端 我终于成功安装了它 但尝试使用时出现以下错误 isql v mydsn 0
  • 如何在linux中以编程方式获取dir的大小?

    我想通过 C 程序获取 linux 中特定目录的确切大小 我尝试使用 statfs path struct statfs 但它没有给出确切的大小 我也尝试过 stat 但它返回任何目录的大小为 4096 请建议我如何获取 dir 的确切大小
  • 线程缓存和 Java 内存模型

    我正在尝试了解 Java 内存模型和线程 据我了解 每个线程都有 主 内存的本地副本 因此 如果一个线程尝试更改int变量 例如某个对象的变量 它会缓存int变量 如果它更改它 其他线程可能看不到更改 但是如果线程缓存一些对象而不是 int
  • CMake 链接 glfw3 lib 错误

    我正在使用 CLion 并且正在使用 glfw3 库编写一个程序 http www glfw org docs latest http www glfw org docs latest 我安装并正确执行了库中的所有操作 我有 a 和 h 文
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • 在 Mono 上运行 .Net MVC5 应用程序

    我正在 Windows 上的 Visual Studio 2013 中开发 Net 4 5 1 MVC5 应用程序 现在我想知道 是否可以在Linux Ubuntu 12 04 上运行这个应用程序 可以使用OWIN吗 Owin 可以自托管运
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • .net-core:ILDASM / ILASM 的等效项

    net core 是否有相当于 ILDASM ILASM 的功能 具体来说 我正在寻找在 Linux 上运行的东西 因此为什么是 net core ildasm 和 ilasm 工具都是使用此存储库中的 CoreCLR 构建的 https
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • Mac OS X 上的 /proc/self/cmdline / GetCommandLine 等效项是什么?

    如何在不使用 argc argv 的情况下访问 Mac OS X 上的命令行 在 Linux 上 我会简单地阅读 proc self cmdline or use GetCommandLine在 Windows 上 但我找不到 Mac OS
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • C++,如何在进程或线程之间共享数据

    我有一个运行两个不同操作的程序 我想在它们之间共享变量 目前 我正在使用线程而不是 fork 进程 但即使我将它们声明为易失性 我在共享变量时也遇到问题 我尝试使用 boost 做 boost thread collisions threa

随机推荐