Linux内存管理 —— 通过实验学习和理解CoW(1)

文章目录

  • 作者
  • 环境
  • 概述
  • 正文
    • 测试程序
    • 实验1:虚拟地址区域的分配
    • 实验2:验证通过缺页异常实验物理页的按需分配
    • 实验3:验证fork操作后,父子进程页表属性的变化
    • 实验4: 验证父进程的Cow
    • 实验5:验证父进程发生CoW后,子进程发生写操作时的行为

作者

pengdonglin137@163.com

环境

Linux-6.5 + ARM64

概述

我们知道,Linux内核为了提高进程fork的效率,实现了CoW技术,即将进程的私有的可写区域的Page的映射属性改成只读,父子进程的任何一方先发起写操作的将触发CoW:分配一个新的物理页,然后将要写的区域页的内容拷贝到这个物理页,最后将这个物理页映射到要写的用户虚拟地址上。

下面我们通过实验和源码分析来理解这个过程。

正文

测试程序

下面是用到的测试程序。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>int parent_run = 0;
int child_run = 0;void sig_parent(int sig)
{parent_run += 1;
}void sig_child(int sig)
{child_run += 1;
}// 测试用的缓冲区指针
static char *buffer;int main(int argc, const char *argv[])
{pid_t child_pid;// 通过SIGUSR1和SIGUSR2来控制父子进程的运行printf("parent use signal: %d\n", SIGUSR1);signal(SIGUSR1, sig_parent);printf("child use signal: %d\n", SIGUSR2);signal(SIGUSR2, sig_child);// 实验1:验证虚拟地址区域的分配printf("parent (%d) wait ...\n", getpid());while(parent_run == 0) sleep(1);buffer = malloc(0x100000);printf("parent alloc 1MB memory: %p\n", buffer);// 实验2:验证通过缺页异常实验物理页的按需分配printf("parent (%d) wait ...\n", getpid());while(parent_run == 1) sleep(1);// 这里之所以写0x1000的位置,是因为malloc返回的虚拟地址所属的第一个虚拟页已经映射到了物理页// 不满足实验要求,所以我们使用下一个虚拟页buffer[0x1000] = 1;printf("parent write buffer: %p\n", buffer + 0x1000);// 实验3:验证fork操作后,父子进程页表属性的变化printf("parent (%d) wait ...\n", getpid());while(parent_run == 2) sleep(1);child_pid = fork();if (child_pid > 0) { // parent// 实验4: 验证父进程的Cowprintf("parent (%d) wait ...\n", getpid());while(parent_run == 3) sleep(1);buffer[0x1000] = 3;printf("parent write 3 buffer: %p\n", buffer + 0x1000);printf("parent wait to exit\n");} else if (child_pid == 0) { // child// 实验5:验证父进程发生CoW后,子进程发生写操作时的行为printf("child pid: %d, wait for write buf: %p\n", getpid(), buffer);while(child_run 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/783517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS 应用开发之Stage模型启动FA模型PageAbility

本小节介绍Stage模型的两种应用组件如何启动FA模型的PageAbility组件。 UIAbility启动PageAbility UIAbility启动PageAbility和UIAbility启动UIAbility的方式完全相同。 说明&#xff1a; 需注意FA模型中abilityName由bundleName AbilityName组成&#xff0c;具体见示例。 i…

不允许你不知道的 MySQL 优化实战(一)

文章目录 1、查询SQL尽量不要使用select *&#xff0c;而是select具体字段。2、如果知道查询结果只有一条或者只要最大/最小一条记录&#xff0c;建议用limit 13、应尽量避免在where子句中使用or来连接条件4、优化limit分页5、优化你的like语句6、使用where条件限定要查询的数据…

uniapp开发App(二)开通 微信授权登录功能(应用签名、证书、包名 全明白)

前言&#xff1a;开发App肯定要包含登陆&#xff0c;常用登陆方式很多&#xff0c;我选择微信登陆。 一、如何获得微信的授权登陆 答&#xff1a;申请&#xff0c;根据uniapp官网的提示有如下三个步骤 开通 1. 登录微信开放平台区&#xff0c;添加移动应用并提交审核&#xf…

C语言中的文件和文件操作

目录 为什么会有文件&#xff1f; 文件名 ⼆进制⽂件和⽂本⽂件&#xff1f; ⽂件的打开和关闭 流 标准流 ⽂件指针 ⽂件的打开和关闭 顺序读写函数介绍 对⽐⼀组函数&#xff1a; 文件的随机读写 fseek ftell rewind ⽂件读取结束的判定 被错误使⽤的 feof ⽂件…

Target

题目描述: 输入文件:标准输入 输出文件:标准输出 时间限制:1秒 内存限制:256兆字节 s 0.5&#xff0c;实数0 ≤ a ≤ 1 您可以选择以下两种操作之一: 1.a a*s 2 . a &#xff08;a-1)*s1 现在你应该用最多50步使a等于目标数b。 如果| x y |<1e-4&#xff0c;则两个数xy相等…

PCL点云处理之重复随机采样一致性(RRANSAC法)平面拟合(二百三十七)

PCL点云处理之重复随机采样一致性(RRANSAC法)平面拟合(二百三十七) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 pcl::SAC_RRANSAC"是 PCL库中的一个方法,是 RANSAC 方法的改进版本,通过多次重复采样和模型拟合来提高鲁棒性。RRANSAC 的思想是在 RANSAC 的基…

基于深度学习的图书管理推荐系统(python版)

基于深度学习的图书管理推荐系统 1、效果图 1/1 [] - 0s 270ms/step [13 11 4 19 16 18 8 6 9 0] [0.1780757 0.17474999 0.17390694 0.17207369 0.17157653 0.168248440.1668652 0.16665359 0.16656876 0.16519257] keras_recommended_book_ids深度学习推荐列表 [9137…

Windows提权!!!

之前讲过一下提权&#xff0c;但是感觉有点不成体系&#xff0c;所以我们就成体系的来讲一下这个操作系统的提权 目录 Windows的提权 1.Widnows的内核溢出提权 1.MSF自带的提权模块&#xff08;Win11都能提上来&#xff0c;有点牛逼&#xff09; 2.CS的插件提权 3.补丁对比…

透视未来安全:PIR技术引领数据隐私新时代

1.隐语实现PIR总体介绍 隐语实现的Private Information Retrieval (PIR) 是一种隐私增强技术&#xff0c;它使用户能够在不暴露他们实际查询内容的情况下从远程服务器数据库中检索所需信息。以下是隐语在实现PIR方面的概要说明和技术特点&#xff1a; 基本概念&#xff1a; PI…

【蓝桥杯】矩阵快速幂

一.快速幂概述 1.引例 1&#xff09;题目描述&#xff1a; 求A^B的最后三位数表示的整数&#xff0c;A^B表示&#xff1a;A的B次方。 2&#xff09;思路&#xff1a; 一般的思路是&#xff1a;求出A的B次幂&#xff0c;再取结果的最后三位数。但是由于计算机能够表示的数字…

【博客709】如果victoriametrics的scrape_timeout大于scrape_interval时会怎么样

如果victoriametrics的scrape_timeout大于scrape_interval时会怎么样 背景 我们在配置采集的时候&#xff0c;有时候会不小心配置了scrape_timeout大于scrape_interval&#xff0c;那么这时会出现什么情况呢&#xff1f;vmagent在采集的时候&#xff0c;如果上一次采集还没有完…

[linux初阶][vim-gcc-gdb] TwoCharter: gcc编译器

目录 一.Linux中gcc编译器的下载与安装 二.使用gcc编译器来翻译 C语言程序 ①.编写C语言代码 ②翻译C语言代码 a.预处理 b.编译 c.汇编 d.链接 ③.执行Main 二进制可执行程序(.exe文件) 三.总结 一.Linux中gcc编译器的下载与安装 使用yum命令(相当于手机上的应用…

JavaScript笔记 09

目录 01 DOM操作事件的体验 02 获取元素对象的五种方式 03 事件中this指向问题 04循环绑定事件 05 DOM节点对象的常用操作 06 点亮盒子的案例 07 节点访问关系 08 设置和获取节点内容的属性 09 以上内容的小总结 01 DOM操作事件的体验 js本身是受事件驱动的脚本语言 什…

10_MVC

文章目录 JSON常用的JSON解析Jackson的常规使用指定日期格式 MVC设计模式MVC介绍前后端分离案例&#xff08;开发与Json相关接口&#xff09; 三层架构三层架构介绍 JSON JSON&#xff08;JavaScript Object Notation&#xff09; 是一种轻量级的数据交换格式&#xff0c;是存…

JUC并发编程(七)

1、不可变对象 1.1、概念 不可变类是指一旦创建对象实例后&#xff0c;就不能修改该实例的状态。这意味着不可变类的对象是不可修改的&#xff0c;其内部状态在对象创建后不能被更改。不可变类通常具有以下特征&#xff1a; 实例状态不可改变&#xff1a;一旦不可变类的对象被…

x-cmd-pkg | broot - Rust 开发的一个终端文件管理器

简介 broot 是基于 Rust 开发的一个终端文件管理器&#xff0c;它设计用于帮助用户在终端中更轻松地管理文件和目录&#xff0c;使用树状视图探索文件层次结构、操作文件、启动操作以及定义您自己的快捷方式。 同时它还集成了 ls, tree, find, grep, du, fzf 等工具的常用功能…

unordered系列容器OJ

目录 1、unordered系列容器 2、unordered系列容器OJ 1、重复n次的元素 2、两个数组的交集I 3、两个数组的交集II 4、存在重复元素 5、两句话中不常见的单词 1、unordered系列容器 在C标准库中&#xff0c;unordered系列容器是基于哈希表实现的&#xff0c; 用于存储唯一…

Qt之创建向导用户界面QWizard

文章目录 前言一、他是干什么的二、QWizard的使用2.1 基础使用2.2 QWizard API2.3 QWizardPage API总结前言 在Qt应用程序中,有时需要向用户提供一个逐步引导的界面,以帮助他们完成特定任务或设置。为了实现这样的用户体验,Qt提供了一个名为QWizard的类,可以方便地创建向导…

用html实现一个文章图片缩略展示

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>文章图片缩略展示</title><link rel"stylesheet" href"./style.css"> </head> <body> <div class&qu…

初始《string》及手搓模拟实现《string》

目录 前言&#xff1a; 为什么学习string类&#xff1f; 标准库中的string类 1. string类对象的常见构造 ​编辑 2. string类对象的容量操作 ​编辑 3. string类对象的访问及遍历操作 4. string类对象的修改操作 5. string类非成员函数 vs和g下string结构的说明 vs下s…