Linux进程地址空间

文章目录

  • 1.程序地址空间回顾
  • 2.进程地址空间

1.程序地址空间回顾

我们在讲C语言的时候,老师给大家画过这样的空间布局图
在这里插入图片描述
可是我们对他并不理解!
来段代码感受一下:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main()
{
	pid_t id = fork();
	if(id < 0)
	{
		perror("fork");
		return 0;
	}
	else if(id == 0)
	{ //child
		printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
	}
	else
	{ //parent
		printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
	}
	sleep(1);
	return 0;
}

输出

//与环境相关,观察现象即可
parent[2995]: 0 : 0x80497d8
child[2996]: 0 : 0x80497d8

我们发现,输出出来的变量值和地址是一模一样的,很好理解呀,因为子进程按照父进程为模版,父子并没有对变量进行进行任何修改。可是将代码稍加改动:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main()
{
	pid_t id = fork();
	if(id < 0)
	{
	perror("fork");
	return 0;
	}
	else if(id == 0)
	{ //child,子进程肯定先跑完,也就是子进程先修改,完成之后,父进程再读取
		g_val=100;
		printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
	}
	else
	{ //parent
		sleep(3);
		printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
	}
	sleep(1);
	return 0;
}
//与环境相关,观察现象即可
child[3046]: 100 : 0x80497e8
parent[3045]: 0 : 0x80497e8

输出结果:

//与环境相关,观察现象即可
child[3046]: 100 : 0x80497e8
parent[3045]: 0 : 0x80497e8

我们发现,父子进程,输出地址是一致的,但是变量内容不一样!能得出如下结论:

  1. 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量

  2. 但地址值是一样的,说明,该地址绝对不是物理地址

  3. 在Linux地址下,这种地址叫做 虚拟地址

  4. 我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理。

OS必须负责将 虚拟地址 转化成 物理地址 。

2.进程地址空间

所以之前说‘程序的地址空间’是不准确的,准确的应该说成 进程地址空间 ,那该如何理解呢?看图:
在这里插入图片描述
说明:

  1. 上面的图就足矣说名问题,同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

麒麟KYLINOS中使用备份还原系统

原文链接&#xff1a;麒麟KYLINOS中使用备份还原系统 hello&#xff0c;大家好啊&#xff0c;今天给大家带来麒麟KYLINOS备份还原的第二篇文章&#xff0c;使用备份还原系统&#xff0c;主要通过麒麟KYLINOS系统自带的备份还原工具&#xff0c;将之前备份的系统文件进行还原&am…

SecureCRT 超时自动断开连接问题解决方法

很多人在使用SecureCRT时&#xff0c;会遇到这种情况&#xff1a;SecureCRT 超时自动断开连接&#xff0c;这种情况会给工作带来很多不便&#xff0c; 比如在做数据库还原操作时&#xff0c;连接突然断掉了&#xff0c;会导致还原操作失败&#xff0c;很是令人困扰。 那么我们…

儿童HPV感染有哪些症状?皮肤性病科谭巍主任讲述五大要点

HPV&#xff0c;人乳头瘤病毒&#xff0c;是一种常见的感染性强的病毒&#xff0c;相比成人儿童也会感染HPV。家长及时了解儿童感染HPV的症状对于早期发现和治疗至关重要。为了帮助家长们更好预防儿童HPV感染&#xff0c;今日特邀劲松中西医医院皮肤性病科主任谭巍详细介绍儿童…

Rust语言代码示例

安装Rust语言&#xff0c;然后创建一个新的Rust项目。接下来&#xff0c;你需要安装一个名为"requests"的Rust包&#xff0c;这个包可以帮助你发送请求。然后&#xff0c;你需要安装一个名为"rust-crawler"的Rust包&#xff0c;这个包可以帮助你编写爬虫程…

电热毯电热床上用品上架亚马逊美国站UL964测试标准要求

美国是一个对安全要求非常严格的国家&#xff0c;美国本土的所有电子产品生产企业早在很多年前就要求有相关检测。而随着亚马逊在全球商业的战略地位不断提高&#xff0c;境外的电子设备通过亚马逊不断涌入美国市场。“为保证消费者得安全&#xff0c;亚马逊始终强调带电得产品…

从0到0.01入门React | 002.精选 React 面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

【python自动化】Playwright基础教程(十)元素拖拽元素坐标获取网页源码元素内文本

【python自动化】Playwright基础教程&#xff08;十&#xff09;元素拖拽&元素坐标&获取网页源码&元素内文本 本文目录 文章目录 【python自动化】Playwright基础教程&#xff08;十&#xff09;元素拖拽&元素坐标&获取网页源码&元素内文本playwright…

开发vue3 UI组件库,并且发布到NPM

目录 1.创建vue3工程 2.创建package文件 3.编写组件&#xff0c;并且导出 4.编写package.json 5.npm账号注册登录并发布 6.从npm安装使用 7.注意事项 1.创建vue3工程 &#xff08;1&#xff09;初始化Vue项目 cnpm create vite &#xff08;2&#xff09;进入文件夹…

LeetCode(10)跳跃游戏 II【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 45. 跳跃游戏 II 1.题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nu…

桥接模式(结构型)

目录 一、前言 二、桥接模式 三、总结 一、前言 桥接模式&#xff08;Bridge Pattern&#xff09;是一种常用的设计模式&#xff0c;它可以将抽象部分与它的实现部分分离&#xff0c;使它们可以独立地变化。桥接模式通常用于需要在多个维度上扩展一个类的情况&#xff0c;或…

牛客网上错题总结及重写(C语言)(2)

每日一言 空不是无&#xff0c;空是一种存在&#xff0c;你得用空这种存在填满自己。 --三体 题目BC43 我当时为什么把它收藏起来呢?? 正确代码 #include <stdio.h> int main() {int n 0;scanf("%d",&n);printf("%d",n/12*42);return 0; }题…

分发饼干(贪心算法+图解)

455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 题目描述 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最…

AI:72-基于深度学习的火灾检测

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

C++网络编程库编写自动爬虫程序

首先&#xff0c;我们需要使用 C 的网络编程库来编写这个爬虫程序。以下是一个简单的示例&#xff1a; #include <iostream> #include <string> #include <curl/curl.h> #include <openssl/ssl.h>const char* proxy_host "duoip"; const in…

腾讯云服务器优惠服务器和优惠折扣,腾讯云用户优惠

腾讯云服务器提供了丰富多样的云服务产品&#xff0c;满足不同用户的需求。其中&#xff0c;推荐的产品包括轻量应用服务器和云服务器CVM&#xff0c;分别适用于不同规模和需求的用户。这些产品提供了各种配置和价格的服务器选项&#xff0c;涵盖了不同的计算需求。 实惠的价格…

8.5 矢量图层点要素分级(Graduated)渲染使用

文章目录 前言分级&#xff08;Graduated&#xff09;渲染QGis代码实现 总结 前言 前面介绍了矢量-点要素-单一符号以及矢量-点要素-分类符号的用法本章介绍分级&#xff08;Graduated&#xff09;渲染说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 分级…

图解Morris遍历

1. 简述 morris遍历是不借助栈空间实现二叉树遍历的一种方法。 其核心思想是&#xff0c;利用当前节点左子树的最右叶子节点当索引节点。 即中序遍历的前驱节点。 第一次遍历根节点的时候&#xff0c;找到该节点&#xff0c;将该节点右儿子指向根节点。 第二次回到该节点时…

说说react中引入css的方式有哪几种?区别?

一、是什么 组件式开发选择合适的css解决方案尤为重要 通常会遵循以下规则: 可以编写局部css,不会随意污染其他组件内的原生;可以编写动态的css,可以获取当前组件的一些状态,根据状态的变化生成不同的css样式;支持所有的css特性:伪类、动画、媒体查询等;编写起来简洁…

‘XXX‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 系统找不到指定的路径。

目录 问题复现解决方案 问题复现 只要一打开cmd就提示“‘LT’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。” 或许大家都遇到过这样的问题&#xff0c;但本篇解决的是和运行项目无关&#xff0c;而是cmd命令行自带的一个bug 解决方案 如果是执行java…

nodejs+vue+python+PHP+微信小程序-安卓-校园贴吧管理系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…