liunx 进程地址空间

news/2024/6/15 12:22:54 标签: linux

程序地址空间

  • 地址空间的整体
  • 进程地址空间
    • 进程空间的写时拷贝
    • 进程控制块

地址空间的整体

在这里插入图片描述
接下来我们用代码验证存储位置。

#include<iostream>
#include<stdlib.h>
using namespace std;

int g_nval;
int g_val=10;

int main()
{

cout<<"code add:"<<&main<<endl;
cout<<"nval add:"<<&g_nval<<endl;
cout<<"val add:"<<&g_val<<endl;
char *heap=(char*)malloc(10);
cout<<"heap add:"<<(void*)head<<endl;
cout<<"stack: "<<&head<<endl;
  return 0;
}

在这里插入图片描述
命令行参数,以及环境变量。以及他们指针都存在命令行环境变量。
我们发现一个神奇的现象
在这里插入图片描述
不同的值可以对应相同的地址。这是怎么做到的呢?
其实,上面所说的地址并不是真正的地址,而是虚拟地址。
在这里插入图片描述

进程地址空间

进程地址空间是一个结构体,通过进程控制块控制内存。每当你想使用内存时,会先映射一个进程地址空间。这样虚拟地址和实际地址分开。每个进程被创建时,其对应的进程控制块(task_struct)和进程地址空间(mm_struct)也会随之被创建。而操作系统可以通过进程的task_struct找到其mm_struct,因为task_struct当中有一个结构体指针存储的是mm_struct的地址。
在这里插入图片描述
子进程被创建时,子进程和父进程拥有一样的代码块。但是他们可以通过页表映射不同的物理地址。

进程空间的写时拷贝

写时拷贝是节约内存的一种方法,所谓写时拷贝,就是你需要我才给你开空间,并不是你malloc多少,我就给你开到内存开多少。而是真正有需要,我才给你开辟那么多的空间。

进程控制块

再谈到进程控制块时, 现在我们知道了,进程地址空间,进程控制块都是结构体,通过指针关联了进程地址空间
在这里插入图片描述
当子进程刚刚被创建时,子进程和父进程的数据和代码是共享的,即父子进程的代码和数据通过页表映射到物理内存的同一块空间。只有当父进程或子进程需要修改数据时,才将父进程的数据在内存当中拷贝一份,然后再进行修改。

例如,子进程需要将全局变量g_val改为200,那么此时就在内存的某处存储g_val的新值,并且改变子进程当中g_val的虚拟地址通过页表映射后得到的物理地址即可。
子进程和父进程在页表中虽然有相同的虚拟地址,但是映射关系不一样,则子进程和父进程就可以映射不同的地址。


http://www.niftyadmin.cn/n/5414859.html

相关文章

祝全天下的女孩们节日快乐,想要更快乐请使用闪侠惠递!

她们是社会的中坚力量 是家庭的温暖港湾 无论在家庭、职场 还是在生活的每一个角落 她们都以独特的魅力 影响着世界 使之变得更加美好 在三八妇女节这个特殊的日子里&#xff0c;让我们向所有的女性致以最崇高的敬意和祝福。让我们感谢她们为社会、家庭和人类所做出的贡献…

高校水电预付费系统有什么作用?

Hey小伙伴们&#xff0c;今天来聊聊咱们大学里的一个超级实用的设施——水电预付费系统&#xff01;你是不是还在为每个月的水电账单烦恼呢&#xff1f;别担心&#xff0c;这个系统就是你的生活小帮手&#xff01; 首先&#xff0c;想象一下这 样的场景&#xff1a;开学初&…

[力扣 Hot100]Day46 二叉树展开为链表

题目描述 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序遍历 顺序相同。 出…

Sharding-JDBC源码解析与vivo的定制开发

作者&#xff1a;vivo IT 平台团队 - Xiong Huanxin Sharding-JDBC是在JDBC层提供服务的数据库中间件&#xff0c;在分库分表场景具有广泛应用。本文对Sharding-JDBC的解析、路由、改写、执行、归并五大核心引擎进行了源码解析&#xff0c;并结合业务实践经验&#xff0c;总结…

linux项目配置单元测试环境和生成覆盖率信息

1.单元测试的意义 单元测试是软件开发中的一种测试方法,用于对软件的最小可测试单元(通常是函数、方法、类等)进行独立且自动化的测试。它的主要目的和用途包括: 1. 确保代码质量和稳定性: 单元测试可以帮助开发人员及时发现代码中的 bug 和错误,确保代码的质量。通过测…

安卓 Kotlin 面试题 31-40

&#x1f525; 31、简述Kotlin 中的内联类&#xff0c;我们什么时候需要&#xff1f;&#x1f525; 有时&#xff0c;业务逻辑需要围绕某种类型创建包装器。 但是&#xff0c;由于额外的堆分配&#xff0c;它会引入运行时开销。 此外&#xff0c;如果包装的类型是原始类型&…

uniapp封装文字提示气泡框toolTip组件

uniapp封装文字提示气泡框toolTip组件 文字提示气泡框&#xff1a;toolTip 因为uniapp 中小程序中没有window对象&#xff0c;需手动调用 关闭 第一种办法关闭&#xff1a;this.$refs.tooltip.close() 第二种办法关闭&#xff1a;visible.sync false 移动端没有现成的toolTip组…

如何学习ChatGPT?从入门到精通(附资料下载)

2023 ChatGPT从入门到精通视频教程&#xff08;共30课&#xff09;.zip 学习ChatGPT需要涉及多个层面&#xff0c;包括理解其基本原理、掌握相关技术、以及进行实际的项目应用。以下是一些具体的学习步骤和建议&#xff1a; 理解ChatGPT的基本原理&#xff1a; 深入了解ChatGP…