fork() 中的写时复制如何处理多个 fork?

2024-01-09

根据维基百科(这可能是错误的)

当发出 fork() 系统调用时,会创建与父进程对应的所有页面的副本,并由操作系统为子进程加载到单独的内存位置。但在某些情况下不需要这样做。考虑当子进程执行“exec”系统调用(用于执行 C 程序中的任何可执行文件)或在 fork() 之后很快退出的情况。当子进程只需要执行父进程的命令时,不需要复制父进程的页面,因为 exec 用要执行的命令替换了调用它的进程的地址空间。

在这种情况下,会使用一种称为写入时复制 (COW) 的技术。使用此技术,当发生分叉时,不会为子进程复制父进程的页面。相反,页面在子进程和父进程之间共享。每当进程(父进程或子进程)修改页面时,都会为执行修改的进程(父进程或子进程)单独创建该特定页面的单独副本。然后,此过程将在所有将来的引用中使用新复制的页面而不是共享的页面。另一个进程(未修改共享页面的进程)继续使用该页面的原始副本(现在不再共享)。这种技术称为写时复制,因为当某个进程写入该页面时,该页面就会被复制。

似乎当任何一个进程尝试写入页面时。该页面的新副本被分配并分配给生成页面错误的进程。之后原始页面被标记为可写。

我的问题是:如果在任何进程尝试写入共享页面之前多次调用 fork,会发生什么情况?


If fork从原始父进程中多次调用,然后每个子进程和父进程都会将其页面标记为只读。当子进程尝试写入数据时,来自父进程的页面将被复制到其地址空间,并且复制的页面在子进程中被标记为可写,但在父进程中则不可写。

If fork从子进程调用并且孙进程尝试写入,将原始父进程中的页面复制到第一个子进程,然后复制到孙进程,并将所有内容标记为可写。

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

fork() 中的写时复制如何处理多个 fork? 的相关文章

  • 用于获取特定用户 ID 和进程数的 Bash 脚本

    我需要 bash 脚本来计算特定用户或所有用户的进程 我们可以输入 0 1 或更多参数 例如 myScript sh root deamon 应该像这样执行 root 92 deamon 8 2 users has total proces
  • 将数组复制到动态分配的内存

    我的代码可以正常工作 但我觉得好像有一种更快的方法可以做到这一点 特别是在我的函数副本中 这是我的代码 这能再快一点吗 顺便说一句 这是 C 语言 另外 当我从函数返回 cpy 时 它是否会删除动态内存 因为它超出了范围 我不想发生内存泄漏
  • 在嵌入式系统上将内核控制台发送到哪里?

    我正在开发一个嵌入式系统 该系统当前通过串行端口 1 上的控制台输出启动 Linux 使用启动加载程序中的控制台启动参数 然而 最终我们将使用这个串行端口 内核控制台输出的最佳解决方案是什么 dev null 能否以某种方式将其放在 pty
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec
  • 使用 --prof 选项创建多个日志文件而不是一个 v8.log 的节点

    我正在尝试使用 prof 选项来分析我的 Node 应用程序 但我发现不是一个单一的 v8 log 文件 而是使用诸如isolate 0x9582b40 v8 log isolate 0xa1cab78 v8 6049 等前缀创建的多个文件
  • 如何通过不同的接口路由 TCP/IP 响应?

    我有两台机器 每台机器都有两个有效的网络接口 一个以太网接口eth0和 tun tap 接口gr0 目标是使用接口在机器 A 上启动 TCP 连接gr0但然后让机器 B 的响应 ACK 等 通过以太网接口返回 eth0 因此 机器 A 发出
  • Java中如何高效存储小字节数组?

    By small字节数组 我指的是长度从 10 到 30 的字节数组 By store我的意思是存储它们在内存中 不序列化并持久化到文件系统 系统 macOS 10 12 6 Oracle jdk1 8 0 141 64 位 JVM 参数
  • Linux >2.6.33:可以使用 sendfile() 来实现更快的“猫”吗?

    必须将大量大文件连接成一个更大的单个文件 我们目前使用 cat file1 file2 output file but are wondering whether it could be done faster than with that
  • 命名互斥体的 Mono 替代方案

    在 Windows NET 上 命名的互斥体可用于同步多个进程 不幸的是 Mono 在 Linux 上不太支持这一点 他们的发行说明 http www mono project com Release Notes Mono 2 8 Shar
  • 安装 JDK 时出错:keytool 命令需要已安装的 proc fs (/proc)。 Linux 的 Windows 子系统

    我尝试在 Linux 的 Windows 子系统 Ubuntu 14 04 上安装 Oracle JDK 1 7 但出现以下错误 the keytool command requires a mounted proc fs proc Jav
  • BeagleBone Black 如何用作大容量存储设备?

    是否可以使用 BB 作为大容量存储设备 我希望将其连接到可以从 USB 连接 例如 USB 闪存驱动器 读取文件的音频播放器并充当包含一个特定文件夹的数据存储设备 及其子文件夹 从文件系统 如果可能 在连接到开发板的闪存驱动器上 正如设备规
  • 点击界面没有出现

    我决定添加一个点击界面并在我的代码中使用它 但我能够得到它的状态 sudo ip f link tuntap add tap10 mode tap sudo ip link set tap10 up 之后当我执行 ip link 时 tap
  • 如何在 Ubuntu/Linux 发行版中安装 Tesseract-OCR 3.03?

    我和一个朋友有兴趣为 CV 项目训练 tesseract OCR 引擎 我们尝试使用一些包装器 例如 PyTesser 和 pyocr 但结果目前不如我们需要的那么准确 因此 我们希望尝试训练超立方体以更好地实现我们的目的 即识别食品标签上
  • 每个虚拟主机的错误日志?

    在一台运行 Apache 和 PHP 5 的 Linux 服务器上 我们有多个带有单独日志文件的虚拟主机 我们似乎无法分离 phperror log虚拟主机之间 覆盖此设置
  • 在 Linux 服务器上创建和编辑 MS-Word 文档?

    希望开发处理文档的服务器端应用程序 源文档大多是MS Word 2003 2007 即MS版本的Docx 希望服务器应用程序能够在linux或windows上运行 想知道在linux下读写MS Word文件最好的工具或库是什么 兼容性是最重
  • 在 Windows / Linux 中创建 Mac 包

    我自己努力制作一个 r 包 我按照 stackoverflow 中上一个问题的说明进行操作如何为外行开发软件包 http cran r project org bin windows Rtools 以下是我根据上一个问题采取的步骤 在新的
  • iOS 内存警告

    我正在尝试使用从 Parse 数据库下载的图像填充集合视图 但我收到内存警告 然后偶尔崩溃 有谁知道其他应用程序如何设法呈现这么多图像而不崩溃 有人可以告诉我如何优化我已有的东西吗 这是所有相关代码 https gist github co
  • sudo pip install python-Levenshtein 失败,错误代码 1

    我正在尝试在 Linux 上安装 python Levenshtein 库 但每当我尝试通过以下方式安装它时 sudo pip install python Levenshtein 我收到此错误 命令 usr bin python c 导入
  • 在Linux中创建可执行文件

    我计划做的一件事是编写 非常简单的 Perl 脚本 并且我希望能够在不从终端显式调用 Perl 的情况下运行它们 我明白 要做到这一点 我需要授予他们执行权限 使用 chmod 执行此操作非常简单 但它似乎也是一个稍微费力的额外步骤 我想要
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul

随机推荐

  • iPhone超声波检测(超过22kHz)

    iphone 3GS及以上型号能检测到的最大频率是多少 我一直在探索iPhone音频 我需要在没有任何外部设备的情况下检测 22 kHz 的声音频率 是否可以 如果麦克风设计得好 它将有一个抗混叠滤波器 其滚降始于略低于奈奎斯特频率 以确保
  • ffmpeg水印处理速度很慢

    我正在开发一个视频处理项目并使用 ffmpeg 进行水印 我完全实现了我想要的 但问题是这个过程非常非常慢 我在 32 位操作系统 Microsoft Windows 8 64 位 CPU 上使用具有 4GB RAM 的英特尔智能第二代系列
  • iOS8中用户默认的plist文件存储在哪里?

    我找不到首选项 plist 文件 因为首选项文件夹为空 要获取库文件夹 我使用 println NSSearchPathForDirectoriesInDomains LibraryDirectory UserDomainMask true
  • 在 MongoDB 中的 Angular.js 中显示图像

    我最近打开了另一个关于如何使用 node js mongoose 在 mongodb 数据库中存储图像的线程 使用猫鼬保存图像 https stackoverflow com questions 27353346 saving image
  • Django:通过“field__isnull=True”或“field=None”过滤查询集?

    我必须通过动态值 可以是 无 过滤查询集 我可以简单地写 filtered queryset queryset filter field value 或者我应该检查 无 if value is None filtered queryset
  • 设置 Cygwin + Android NDK + cocos2Dx 以与 Eclipse 配合使用

    我正在关注该网站的教程 通过游戏应用货币化 作者 Todd Perkins http www lynda com Android tutorials Understanding downloading Cocos2d x 107169 12
  • BASH 数组索引减去最后一个数组

    这是一个困扰我的问题 我需要从用户输入中读取版本号 并且我想使用存储版本号的数组的长度创建一个 菜单 然而 BASH 的神秘语法在这里对我没有帮助 echo VERSIONS 2 0 10 1 2 0 7 1 2 0 7 1 2 0 7 1
  • 数据表:尝试以 csv 格式获取每个表行的选定单选按钮值

    我正在使用 jquery 数据表插件 我想做的是以 CSV 逗号分隔值 格式获取所有选定的单选按钮值 由于记录太多 所以使用分页 当我选择第一页上的单选按钮时 我可以获取 CSV 中所有选定的单选按钮值 运行良好 当我转到第二页并选择单选按
  • 使用 nginx 记录已解析的请求

    如何为 nginx 设置自定义日志格式 以便解析请求并单独记录其各部分 我们提供图片文件来统计邮件的打开次数 图片的 URL 有所不同 但遵循以下规则 http www server com counter XXXXX YYYYY dail
  • GitHub 操作:致命:无法读取“https://github.com”的用户名:设备未配置

    我试图让git clone在私人存储库上使用 Github Action 但我不确定应该如何配置它以使用 SSH 连接到 GitHub 顺便说一句 它是 macOS 运行程序 此时此刻 actions checkout工作正常 但是当我打电
  • 通过互联网传输数据的最简单方法,Python

    我有两台电脑 都连接到互联网 我想在它们之间传输一些基本数据 字符串 整数 浮点数 我是网络新手 所以我正在寻找最简单的方法来做到这一点 我需要哪些模块来做到这一点 两个系统都将运行 Windows 7 只要它不是异步的 同时发送和接收 您
  • VBscript 的递归问题

    我正在尝试在 vbscript 中实现一些递归 Function largest prime factor ByVal num For i 2 to num 2 If num mod i 0 Then this number is not
  • 如何获取特定用户的 Windows“特殊文件夹”路径?

    在服务内部 确定特定用户的特殊文件夹路径 例如 我的文档 的最佳方法是什么 SHGetFolderPath允许您传递令牌 因此我假设有某种方法可以模拟您感兴趣的文件夹的用户 有没有办法仅根据用户名来执行此操作 如果没有 用户帐户所需的最少信
  • 多行“ReplacementSpan”绘图问题

    只要文本不太长 我的自定义替换跨度就可以工作 但一旦文本长于一行 跨度绘图就会完全崩溃 我的理解是draw 在这种情况下被调用两次导致跨度绘制两次 无法区分第二个绘制调用和第一个绘制调用 从而使您可以控制绘制内容和绘制位置 start an
  • 如何使用 PlayFramework 压缩 html

    为了提高 Scala 表单的可读性 我经常使用缩进和换行 但是 当我在 play 应用程序启动并运行时验证 HTML 时 我看到很多空格和不必要的换行符 有什么理由压缩此 HTML 而不 使我的 scala 模板不可读 Thanks 正如另
  • 无法找到 Android SDK

    我已经有了安卓工作室 https en wikipedia org wiki Android Studio并安装了 Android SDK 后来我添加了 Flutter 和 Flutter SDK 这是我的问题 当我跑步时 flutter
  • 从最新的 rss 中排序日期

    我应该如何对日期进行排序 最新的在顶部 目前 日期尚未排序 下面是我的 JSFiddle http jsfiddle net qoLg6dnu http jsfiddle net qoLg6dnu document ready functi
  • android api与谷歌地图显示网格

    我正在创建一个使用谷歌地图 API v2 的 Android 应用程序 我相信我已经按照谷歌教程所述完成了所有操作 但我仍然只得到谷歌地图网格 没有地图 我使用 keystore debug 的 SHA1 创建了一个调试密钥 以下是我的设置
  • 如何编译加载到字符串中的erlang代码?

    我有一个生成的字符串 其中包含 erlang 模块的代码 有没有办法直接从字符串编译生成的模块 或者有没有办法将字符串转换为所需的格式compile forms 1 或者我必须先将其保存到临时文件中 然后使用compile file 1 或
  • fork() 中的写时复制如何处理多个 fork?

    根据维基百科 这可能是错误的 当发出 fork 系统调用时 会创建与父进程对应的所有页面的副本 并由操作系统为子进程加载到单独的内存位置 但在某些情况下不需要这样做 考虑当子进程执行 exec 系统调用 用于执行 C 程序中的任何可执行文件