写入时如何精确复制

游戏迷

假设我们有一个特定的父进程,并在内存中存储了任意数量的数据,然后使用fork产生一个子进程。我了解到,为了使操作系统能够在写入时执行复制,内存中包含我们正在修改的数据的特定页面将设置其只读位,并且操作系统将使用在孩子尝试时会导致的异常修改数据以将整个页面复制到内存中的另一个区域,以便子代获得其自己的副本。我不理解的是,如果内存中的特定部分被标记为只读,那么数据最初所属的父级将无法修改数据。那么整个方案如何运作?父级是否会丢失其数据的所有权,并且即使父级本身试图修改数据,也必须执行写入时的复制?

彼得·科德斯

正确,如果任何一个进程写了​​一个COW页面,它都会触发页面错误。

在页面错误处理程序中,如果该页面应该是可写的,它将分配一个新的物理页面并执行memcpy(newpage, shared_page, pagesize),然后更新发生故障的任何进程的页面表,以将新页面映射到该虚拟地址。然后返回到用户空间,以重新运行存储指令。

对于诸如之类的东西fork这是一个胜利,因为一个进程通常execve在触摸了一页(堆栈存储器)后立即立即进行系统调用。execve销毁该进程的所有内存映射,以新进程有效地替换它。父级再次拥有每个页面的唯一副本。(除了已经进行写时复制的页面(例如,分配有内存的mmap页面通常会被COW映射到零的单个物理页面,因此读取会命中L1d缓存)。

一个聪明的优化是fork实际上复制包含堆栈顶部的页面,但仍然对其他所有页面执行惰性COW,前提是假定子进程通常会execve立即访问并因此将其引用删除到所有其他页面。但是,仍然需要花费父级中的TLB无效才能将所有页面临时翻转为只读和返回。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

ZFS如何在写入时复制大文件

快速测试写入时复制

使用整数指针在写入时复制

写入时复制.tar.gz文件

如何使用btrfs-property而不是chattr禁用子卷的BTRFS写入时复制更新

写入时如何拆分WriteStream?

Python写入时复制或访问时复制共享内存

Golang 会在修改/写入时复制字符串吗?

是否为所有结构写入时快速复制?

如何精确复制文件夹

写入时如何关闭USB设备的缓存?

我将如何精确复制USB驱动器?

有“中型”副本吗?或者:如何精确控制复制的“深度”?

如果写入时发生错误,如何防止擦拭文件?

在spark中写入时如何更改csv文件名?

如何在Doobie(Postgres)中读取/写入时间戳

使用OpenCV2写入时如何避免视频延迟?

保险丝写入时如何获取整个文件的大小

将Serilog日志文件写入时如何触发事件?

PHP 5 | 通过引用传递的对象/值与写入时复制| 当添加为类属性时

复制/粘贴时未识别命令,但手动写入时被识别

是否有任何文件系统为CP实现写入时复制机制?

如何复制仍通过ssh写入的文件?

如何在使用转义或引号在 pyspark 中的文件中写入数据帧时获得精确匹配?

写入时的 AWS Glue 性能

如何将 MySQL 数据透视表的精确副本(样式和数据)复制到 HTML?

在Unity BuildPostProcessor中,您究竟如何精确地“复制”一个文件?

mp3tag如何以“精确音频复制”的命名方案用于生成播放列表?

当两个进程同时写入时如何解决同一密钥上的ElasticSearch冲突