程序地址空间
✅<1>主页::我的代码爱吃辣
📃<2>知识讲解:Linux——程序地址空间
☂️<3>开发环境:Centos7
💬<4>前言:我们一直随口就能说出来的栈区,堆区,常量区,到底是什么?今天学习一下进程地址空间。
目录
一.程序地址空间回顾
二. 进程地址空间
三.为什么要存在进程地址空间
四.malloc 和 new 的机制
一.程序地址空间回顾
我们在学习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;
}
输出结果:
我们发现,输出出来的变量值和地址是一模一样的,很好理解呀,因为子进程按照父进程为模版,父子并没有对变量进行进行任何修改。
我们尝试让子进程,修改变量:
测试代码:
#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 = 1000;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;
}
输出结果:
我们发现,父子进程,输出地址是一致的,但是变量内容不一样!!能得出如下结论:
- 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量。
- 但地址值是一样的,说明,该地址绝对不是物理地址!
- 在Linux地址下,这种地址叫做 虚拟地址。
- 我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理,OS必须负责将 虚拟地址 转化成 物理地址 。
二. 进程地址空间
上面说到用C/C++语言所看到的地址,全部都是虚拟地址或者说叫做线性地址,那么虚拟地址和物理地址有什么关系?
引入地址空间:
每一个进程都有自己的地址空间,进程地址空间地址实际上就是虚拟地址。我们通过堆虚拟空间位置上的数据修改,最终经过转换到物理内存上的数据修改。
虚拟地址是如何与物理地址进行映射的呢?
因为有页表的存在。
页表是一种K/V映射表,连接虚拟内存与物理内存,每一个进程都会有自己的进程地址空间,那么每一个进程地址空间都会有与之对应的页表。
注意:
- 通过页表不仅可是实现,虚拟地址到物理地址的映射问题,同时因为中间多了一层结构,就是的我们可以通过页表这个桥梁堆访问的地址,进行权限的审核 。
- 每一个进程都有自己的地址空间和页表,进程虚拟空间仅仅通过页表堆物理内存交互,这也是保证进程独立性的手段之一。
如何解释上面同一个地址却又不同的值的现象:
创建子进程的本质,就是创建了子进程PCB和加载对应的代码和数据。子进程和父进程代码共享,数据在修改时会发生写是拷贝。
注意:
上面的图就足矣说名问题,同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址!
三.为什么要存在进程地址空间
如果没有进程地址空间,直接映射到物理地址不是更好吗,省去这么多中间的转换。效率不是更高吗?
如果没有进程地址空间,OS直接将映射到物理地址,如果有那一次我们地址映射错了,就有可能映射到其他地址空间上,这样进程之间独立性就会被破坏。
使用了地址空间,就不会出现进程错误的访问其他进程的地址空间吗?是的,即使我们出现了错误地址错误的地址也是一个虚拟地址,仍然在该进程的地址空间内,而地址空间是每一个进程独立的,映射到物理地址也是独立的。
综上所述:
- 防止地址随意的访问,保护物理内存与其他进程。
- 将进程管理和内存管理进行耦合。
- 可以让进程一同意的视角,看待自己的代码和数据。
四.malloc 和 new 的机制
我们在使用malloc和new的时候,我们都知道他们的功能都是在堆上开辟空间,然后返回开辟的空间的首地址。
如果我们开辟了空间我们不去使用,那么这个空间会属于我们吗?
注意:
- 操作系统补办不允许任何浪费或者不高效
- 我们申请了空间一般不会立马得到空间,只会给你分配虚拟内存,不会立马给你物理内存。
- 只有当我们对这块空间使用的时候,才会将物理内存给分配到位。我们称这种机制叫做:缺页中断。
相关文章:
程序地址空间
✅<1>主页::我的代码爱吃辣 📃<2>知识讲解:Linux——程序地址空间 ☂️<3>开发环境:Centos7 💬<4>前言:我们一直随口就能说出来的栈区,堆区,常量…...
HBS 家庭总线驱动和接收芯片MS1192,应用于电话及相关设备、空调设备、安全设备、AV 装置
MS1192 是适用于 HBS 总线规范(日本电子工业协会) 的适配器芯片,具备发送、接收数据的功能。在发送接收 单元中,采用 AMI 编码方式,可使用双绞线进行互联,信 号传输采用差分方式。 芯片采用单电源…...
IO和进程day08(消息队列、共享内存、信号灯集)
今日任务 1.代码 inversion.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/types.h> #include …...
【数据结构】—堆排序以及TOP-K问题究极详解(含C语言实现)
食用指南:本文在有C基础的情况下食用更佳 🔥这就不得不推荐此专栏了:C语言 ♈️今日夜电波:ルミネセンス—今泉愛夏 1:01 ━━━━━━️💟──────── 5:05 …...
Python语言概述
视频版教程 Python3零基础7天入门实战视频教程 Python作为一门非常流行的高级编程语言,自从22年开始,TIOBE编程语言排行榜Python一直排第一。 Python简洁高效,丰富的应用场景,受到广大程序员,科研工作者的喜爱。 …...
电子电路学习笔记之NCV84120DR2G——车规级单通道高压侧驱动器
关于车规级芯片: 关于车规级芯片(Automotive Grade Chip),车规级芯片是专门用于汽车行业的芯片,具有高可靠性、高稳定性和低功耗等特点,以满足汽车电子系统的严格要求。这些芯片通常用于车载电子控制单元&…...
YOLO DNF辅助教程完结
课程完结!撒花、撒花、撒花 课程完结!撒花、撒花、撒花 课程完结!撒花、撒花、撒花 呕心沥血三个月,《利用人工智能做DNF游戏辅助》系列实战课程已完结,技术路线贯穿串口通信、目标检测、opencv特征匹配等前沿技术…...
Hadoop-Hive
1. hive安装部署 2. hive基础 3. hive高级查询 4. Hive函数及性能优化 1.hive安装部署 解压tar -xvf ./apache-hive-3.1.2-bin.tar.gz -C /opt/soft/ 改名mv apache-hive-3.1.2-bin/ hive312 配置环境变量:vim /etc/profile #hive export HIVE_HOME/opt/soft/hive…...
竞赛 基于机器视觉的火车票识别系统
文章目录 0 前言1 课题意义课题难点: 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于机器视觉的火车票识别系统 该项目较为新颖,适合作为竞赛…...
conda与pip镜像源环境配置
文章目录 一. 参考二. conda三. pip 一. 参考 b站环境配置视频 校园网镜像站 二. conda 利用校园网镜像站, 找到conda的镜像源配置文档. 将下面的文档复制到电脑上的.condarc文件中. channels:- defaults show_channel_urls: true default_channels:- https://mirrors.tuna…...
Golang1.21更新内容全面介绍~
我的掘金平台原文地址Golang1.21更新内容全面介绍~ 前言 在Golang1.21这一次更新中,主要更新内容为: for range的一个语义变更 、 新加入max、min、clear方法、 contenxt增添api、 WASI的支持 本文主要带大家熟悉这些变更的内容~ 1.for语义的变更…...
ArcGIS 10.4安装教程!
软件介绍:ArcGIS是一款专业的电子地图信息编辑和开发软件,提供一种快速并且使用简单的方式浏览地理信息,无论是2D还是3D的信息。软件内置多种编辑工具,可以轻松的完成地图生产全过程,为地图分析和处理提供了新的解决方…...
华为云云服务器云耀L实例评测 | 从零开始:华为云云服务器L实例使用教程
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
ElasticSearch配置
2) 搭建ElasticSearch环境 2.1) 拉取镜像 docker pull elasticsearch:7.4.02.2) 创建容器 docker run -id --name elasticsearch -d --restartalways -p 9200:9200 -p 9300:9300 -v /usr/share/elasticsearch/plugins:/usr/share/elasticsearch/plugins -e "discovery.…...
MySQL优化第二篇
MySQL优化第二篇 性能分析小表驱动大表慢查询日志日志分析工具mysqldumpslow Show Profile进行SQL分析(重中之重) 七种JOIN 1、inner join :可以简写为join,表示的是交集,也就是两张表的共同数据 sql语句:…...
基于python解决鸡兔同笼问题
一、什么是鸡兔同笼问题? 鸡兔同笼问题是一个经典的数学问题。问题描述:鸡和兔子共有头数a和脚数b,求鸡和兔子的数量。 解析:设鸡的数量为x,兔子的数量为y,那么可以得到以下两个方程: 1. x y…...
2023 Google 开发者大会|Mobile开发专题追踪
文章目录 前言大会介绍涉及内容MobileWebAICloud Mobile开发专题多终端应用的开发适配大屏视频流可穿戴设备电视新的设计中心 构建高质量的应用高级相机和媒体功能用户的安全和隐私更精细的视觉体验 小结 前言 哈喽大家好,我是阿Q。近期,【2023 Google …...
最新版WPS 2023 加载Zotero方法
安装wps2019vba.exe,获取链接:链接:https://pan.baidu.com/s/1eeoc6Tmwyzxh3n1MFQTVeA 提取码:6431 –来自百度网盘超级会员V8的分享 打开WPS的工具的加载项 添加文件路径,我的在: C:\Users\Administrat…...
详解爬虫策略,反爬虫策略,反反爬爬虫策略
爬虫策略 爬取策略是网络爬虫在执行网页抓取任务时所遵循的规则或策略。这些策略决定了爬虫如何从一个页面转到另一个页面,什么时间进行抓取,以及应该抓取哪些内容。以下是几种常见的爬取策略: 深度优先搜索(DFS) 在…...
ES6中的Promise对象
1. Promise是什么 Promise简单来说就是一个容器,里面保存着未来才会结束的事件的结果(这个事件就是异步操作)。Promise是一个对象(构造函数),可以获取异步操作的结果。 特点: 对象的状态不受外…...
vue 知识点———— 生命周期
1.什么是生命周期 Vue实例从创建到销毁的过程,叫生命周期。 从开始创建、初始化数据、编译模版、挂载Dom-渲染、更新-渲染、销毁等过程。 2.生命周期一共有几个阶段 创建前/后, 载入前/后,更新前/后,销毁前/销毁后 3.初始化相关属性 beforeCreate(创建前…...
焊接符号学习
欧美焊接符号举例 4.5------表示焊点直径 【3】------根据图示说明,表示此项为CC项或者SC项 6-------表示此处为第六CC项或者SC项 BETWEEN①AND②------表示①件和②件俩点之间的焊点 12X------表示俩点之间的焊点个数为12个 日本焊接符号举例 A------根据图示&…...
记录linux清理空间的步骤
sudo du -sh /* 看整体空间占用情况 [roothost ~]# sudo du -sh /* 0 /bin 143M /boot 85M /data 0 /dev 38M /etc 4.0K /home 0 /lib 0 /lib64 16K /lostfound 4.0K /media 4.0K /mnt 31M /opt 0 /proc 260K /r…...
丰田工厂停产竟然因为磁盘...
丰田因磁盘空间不足关闭14家工厂 在如今的信息时代,无论是生活还是工作,我们都离不开计算机和网络。然而,令人惊讶的是,一家全球知名的汽车制造商——丰田,却因为磁盘空间不足的问题,被迫关闭了14家工厂。…...
Python工程师Java之路(p)Maven聚合和继承
文章目录 依赖管理依赖传递可选依赖和排除依赖 继承与聚合 依赖管理 指当前项目运行所需的jar,一个项目可以设置多个依赖 <!-- 设置当前项目所依赖的所有jar --> <dependencies><!-- 设置具体的依赖 --><dependency><!-- 依赖所属群组…...
Java 复习笔记 - Lambda 表达式 he 经典算法题
文章目录 Lambda表达式 概述(一)基本作用(二)特点 一,初识Java中的Lambda 表达式二,函数式编程三,省略写法四,练习:使用Lambda 表达式 简化Comparator接口的匿名形式综合…...
算法——快乐数
202. 快乐数 - 力扣(LeetCode) 由图可知,其实这也是一个判断循环的过程,要用到快慢指针,且相遇后,若在全为1的循环里,那么就是快乐数,若相遇后不为1,说明这不是快乐数。 …...
vue使用window.location.href 跳转失败
问题: vue项目中直接使用window.lcocation.href跳转外链,但是跳转的链接会被拼接成这样 http://localhost:8080/#/www.baidu.com 原因: 我们打开的外部链接会自动拼接我们的源地址,导致网址链接不正确,无法正常访问 …...
【备忘】清理Office缓存
【背景】电脑安装了M365 Apps for enterprise的客户端,遇到不常见的奇怪问题。尝试看清理缓存是否可以解决。 【清理步骤】 1. 关闭所有Office365 应用; 2. 搜索 %AppData% ,并打开该文件夹; 3. 进到 AppData > Local > M…...
MacOS环境变量source生效但重启后又失效
https://blog.csdn.net/dxk539687357/article/details/127942044 .bash_profile 和 .zshrc 都是macos系统重环境变量配置的文件,但是两者有不同之处。 .bash_profile:在执行source ~/.bash_profile,只在当前窗口生效,但关闭当前…...
那个平台能免费做网站/关键词热度
任何一个文件在使用之前和使用之后, 必须要进行打开和关闭istream,ostream,cin.get(),cin.getline(),cin.read(),cout.write() fopen,fgetc(),fputc(),getc(),putc(),fgets(),fputs() getchar(),putchar(),gets(),puts()char infile[255],outputfile[255];FILE *inf,*outf;st…...
建设网站大概要花多少钱/抖音seo排名系统
参考:https://blog.csdn.net/ericbaner/article/details/3857268 override->重写(覆盖) overload->重载 override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写&#x…...
自助建站整站源码/湖南网站推广优化
2019独角兽企业重金招聘Python工程师标准>>> 问题1 : 新建了一个简单的工程,打包成release 包,并使用androidpluginmgr 来加载。发现启动了在宿主中的代理Activity 界面。而且宿主程序也意外停止了。 log发现,在 Plugi…...
用php做视频网站的步骤/搜索引擎调词平台价格
会员卡管理系统技术解析(十八)Timer定时监听 在web应用中,有时候客户须要一些定时程序。不须要客户自己去操作。而是由应用程序自行触发(代理)运行某些操作。这个时候监听与定时器的配合使用就基本能够实现这个需求了。网上非常多代码并不完整,水平未到,…...
自己做网站 需要服务器吗/太原关键词排名推广
“公路车辆自动监测记录系统的接入,实现了对胡埭地区车流量的实时监控,当车流量过大时,信息平台会出现提示,交警部门可通过改变信号灯时长或到现场疏导来缓解交通压力。”昨天,滨湖区胡埭镇交警部门相关负责人在胡埭交…...
响应式网站开发 三合一建站/抖音seo排名系统哪个好用
Ajax请求参数较长导致请求失败Ajax请求参数比较长,第5行参数大概1100个字符吧,是接口的请求报文. $.ajax({ type:"POST", url:"${ctx}/test.action?m ...JQuery Ajax 请求参数 List 集合处理引言 JQuery Ajax 发送请求参数一般都是基本类型,比如 String.int:那…...