【Linux】地址空间

在这里插入图片描述
本片博客将重点回答三个问题
什么是地址空间?
地址空间是如何设计的?
为什么要有地址空间?
程序地址空间排布图
在32位下,一个进程的地址空间,取值范围是0x0000 0000~ 0xFFFF FFFF
在这里插入图片描述
回答三个问题之前我们先来证明地址空间排布是按如图所布局的
各个区空间地址验证代码

#include <unistd.h>
#include <stdio.h>                                                                                           
#include <stdlib.h>int g_unval; // 未初始化数据
int g_val = 100; // 初始化数据,一般指全局初始化数据
int main(int argc, char* argv[], char* env[]) // 命令行参数,环境变量
{// 代码地址打印                          printf("code addr: %p\n", main); printf("init global addr: %p\n", &g_val);printf("uninit global addr: %p\n", &g_unval);// 堆区,指针变量本质是变量,也要开辟空间,不过放的内容是地址char *heap_mem = (char*)malloc(10);printf("heap addr: %p\n", heap_mem);// 栈区,函数内定义的变量都是在栈上开辟空间printf("stack addr: %p\n", &heap_mem); int i = 0;for (i = 0; i < argc; i++){	// 命令行参数地址	printf("argv[%d]: %p\n", i, argv[i]);}int j = 0;for (j  = 0; env[j]; j++){printf("env[%d]: %p\n", j, env[j]);}return 0;}

运行结果
在这里插入图片描述
堆、栈之间的两个箭头表示
栈向地址减小的方向增长
堆向地址增大的方向增长
在这里插入图片描述
证明方法也很简单
在这里插入图片描述
运行结果也证明确实是这样
我们会发现堆区之间差了20字节
我们平时申请空间,系统会多给你一些空间
多出的空间用来记录你堆的属性信息
所以平时我们free空间,只要传起始地址
剩下的系统知道要free多长的空间
在这里插入图片描述

我们在系统部分要记的两个口诀
1、先描述在组织
2、堆、栈相对而生

static 修饰局部变量,本质就是将该变量开辟在全局区域

所有的字面常量将来都是要映编码进代码的
在正文代码上其实有一小段是字符常量区
在这里插入图片描述

什么是地址空间以及是如何设计的

我们平时打印各种地址其实就是进程打印,程序运行之后打印的

在解释什么是地址空间之前,我们先来讲一个故事

有一个富豪,他有5亿元家产
他有3个私生子,彼此并不知道对方存在
3个私生子分别叫张三、李四、王五
富豪为了鼓励3个儿子
对张三说你好好念书将来5亿就是你的了
对另外两个儿子也说了同样的话

因为不知道彼此存在
对于这三个儿子,他们都认为是5亿继承人
富豪给他们每一个儿子画了一个大饼

有一天,张三对他爸说要1千买学习资料
李四说我成年了想买一辆两百万的跑车
王五说我创业需要50万
富豪都给了他们需要的钱
只要他们要钱富豪都会给
有一天张三说要1亿,富豪说要这么多干嘛
拒绝了张三,即使被拒绝了张三依旧认为自己是5亿的继承人
我们站在上帝视角知道即使富豪过世了
这三个儿子不可能都拥有5亿
他们每个儿子可以断断续续的要钱
但永远要不到5亿,却依然坚信自己以后能拥有这5亿

对应关系
富豪 ---- 操作系统
儿子 ---- 进程
富豪画的饼 ---- 地址空间

在内存中的地址空间本质是一种数据结构
将来要和一个特定的进程关联起来

以前直接访问物理内存,如果有野指针的问题
可能直接访问到其他进程
内存本身是随时可以被读写
所以在老式的程序里面野指针是会直接改了其他进程的东西
结论:直接使用物理内存不安全

现代计算机的解决方式

每个进程有自己的PCB
操作系统给每个进程一个虚拟的地址空间
通过映射机制映射到物理内存
我们可能会有疑问,最终还是会访问物理内存
万一虚拟地址是一个非法地址呢
其实映射机制有一个检查机制,万一是非法地址
可以不让你映射

在这里插入图片描述

虚拟地址空间究竟是什么?

每个进程都要有地址空间
就好比操作系统要给每个进程画个饼
操作系统要给每个饼做管理
在内存中的地址空间本质是一种内核数据结构
它里面至少有各个区域的划分
在这里插入图片描述
我们把如图结构称为地址空间

区域空间并不是死的,会有一定的变化
所谓的范围变化,本质是对start 或end 标记值 + - 特定的范围即可
在这里插入图片描述
所以一个地址为什么有两个值
到这里就可以回答这个问题了

刚开始创建时只有父进程
然后创建子进程,子进程会继承父进程的属性
所以子进程的页表、地址空间和父进程一样
当子进程尝试修改变量值时
因为要保证进程的独立性
操作系统会重新为子进程,开辟一份物理内存
并修改子进程页表的映射关系
但是虚拟地址并不受影响,还是一样的地址
但映射到物理内存的不同区域
看到的值便不一样
这种策略就叫作写时拷贝

在这里插入图片描述

为什么要存在地址空间

  1. 保护物理内存
    凡是非法的访问或者映射,
    os都会识别到,并且终止你这个进程
    因为地址空间和页表是os创建并维护的
    也就意味着凡是想使用地址空间和页表
    进行映射,也一定要在OS的监管下进行访问
  2. OS耦合度更低
    因为有地址空间的存在
    因为有页表映射的存在
    我们的物理内存就可以
    对未来的数据进行任意位置的加载
    物理内存的分配就可以和
    进程的管理互不关联
    从而使内存管理模块和进程管理模块
    完成解耦合

我们在C、C++语言上new、malloc空间时
本质是在虚拟地址空间申请的
因为有地址空间的存在,所以上层申请空间
物理内存可以甚至一个字节都不给你
当你真正访问物理地址时,才执行
内存相关算法,帮你申请内存,构建
页表映射关系,这样空间使用率为100%
以此提高整机效率

  1. 保证进程的独立性
    因为有地址空间的存在,每一个进程
    都认为自己拥有4GB的空间(32)
    并且各个区域是有序的,进而
    可以通过页表映射到不同的区域
    来实现进程的独立性,每一个进程
    不知道,也不需要知道其他进程的存在

重新理解什么是挂起?

加载的本质就是创建进程,但并不是
非得把所有程序的代码和数据加载到
内存中,并创建内核数据结构建立映射关系
在极端情况下,只有内核结构被创建
此时就叫新建状态

理论上,可以实现对程序的分批加载
既然可以分批加载,自然可以分批换出
一个进程短时间不会被执行,比如阻塞
而使进程的数据和代码被换出就叫挂起

页表不仅仅映射物理内存
磁盘位置也可以映射
所以当代码挂起时,不用把数据
刷新到磁盘里。只要把空间直接释放掉,
在页表重新填上磁盘当中代码和数据的
位置,就可以完成一次基本的挂起

扩展知识

在vim中注释
Ctrl + v 进入视图模式(V-BLOCK)
hjkl 选中需要注释代码
输入大写的i,左下角出现INSERT
输入 // ,再按esc 自动注释选中的代码
取消注释还是上面的操作
选中需要注释的代码,按d删除

✨✨✨✨✨
本篇博客完,感谢阅读🌹🌹🌹
如有错误之处可评论指出,博主会耐心听取每条意见

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

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

相关文章

2024黑龙江省职业院校技能大赛信息安全管理与评估赛项规程

2024黑龙江省职业院校技能大赛暨国赛选拔赛 “GZ032信息安全管理与评估”赛项规程 极安云科专注技能竞赛&#xff0c;包含网络建设与运维和信息安全管理与评估两大赛项&#xff0c;及各大CTF&#xff0c;基于两大赛项提供全面的系统性培训&#xff0c;拥有完整的培训体系。团队…

JVS低代码表单引擎:数据校验与处理的先锋

随着信息技术的迅速发展&#xff0c;数据校验与处理已经成为了各类应用中不可或缺的一环。尤其是在涉及敏感信息&#xff0c;如密码处理时&#xff0c;其安全性和准确性显得尤为重要。JVS低代码表单引擎提供了强大的文本组件触发逻辑校验功能&#xff0c;它能够在用户填写数据的…

网贷教父判无期,千家万户哭成狗

作者&#xff5c;翻篇 新熔财经快评&#xff1a; 真是太气人了 e租宝崩盘后 比它更大的雷又来了 “网贷教父”周世平 非法吸收公众存款1090亿 被判了无期 48万多人的血汗钱啊 就这样血本无归了 要知道 当年周世平做p2p 就靠着全额垫付 这颗定心丸 大量的宝妈 上…

Elasticsearch:什么是检索增强生成 (RAG)?

检索增强生成 (RAG) 定义 检索增强生成 (RAG) 是一种利用来自私有或专有数据源的信息来补充文本生成的技术。 它将旨在搜索大型数据集或知识库的检索模型与大型语言模型 (LLM) 等生成模型相结合&#xff0c;后者获取该信息并生成可读的文本响应。 检索增强生成可以通过添加来…

react-photo-view 的介绍、安装、使用。

目录 基本介绍 安装 使用 基本介绍 react-photo-view 是一个基于 React 的图片查看器组件&#xff0c;用于在网页上展示和浏览图片。该组件提供了用户友好的界面和交互&#xff0c;可以轻松地在应用程序中集成并使用。 支持触摸手势&#xff0c;拖动/平移/物理效果滑动…

读书笔记-《数据结构与算法》-摘要2[冒泡排序]

冒泡排序 核心&#xff1a;冒泡&#xff0c;持续比较相邻元素&#xff0c;大的挪到后面&#xff0c;因此大的会逐步往后挪&#xff0c;故称之为冒泡。 public class BubbleSort {public static void main(String[] args) {int unsortedArray[] new int[]{6, 5, 3, 1, 8, 7, 2…

深入探讨Guava的缓存机制

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天咱们聊聊Google Guava的缓存机制。缓存在现代编程中的作用非常大&#xff0c;它能提高应用性能&#xff0c;减少数据库压力&#xff0c;简直就是性能优化的利器。而Guava提供的缓存功能&#xff0c;不仅强大…

Linux 压缩、解压文件的 4 种方式。tar、gzip、gunzip、zip、unzip、7z命令使用方法

目录 1、使用 tar 命令&#xff1a; 1.1. 压缩&#xff1a; 1.2. 解压&#xff1a; 1.3. tar 命令各参数含义 2. gzip、gunzip gzip 命令&#xff1a; 压缩文件&#xff1a; 保留原始文件&#xff0c;创建压缩文件&#xff1a; 保留原始文件&#xff0c;显示压缩进度&…

正则表达式(7):转义符

正则表达式&#xff08;7&#xff09;&#xff1a;正则表达式&#xff08;5&#xff09;&#xff1a;转义符 本博文转载自 此处&#xff0c;我们来认识一个常用符号&#xff0c;它就是反斜杠 “\” 反斜杠有什么作用呢&#xff1f;先不着急解释&#xff0c;先来看个小例子。 …

golang使用es,报错Elasticsearch health check failed

今天golang代码里调用es&#xff0c;结果一直报错。报错内容 ElasticsearchRestHealthIndicator : Elasticsearch health check failed然后又去es管理端看&#xff0c;明明节点是绿色的&#xff0c;估计是golang的这个有问题&#xff0c;时间紧迫&#xff0c;我就直接关掉了健…

侯捷C++ 程序的生前死后

生前&#xff1a;CRT startup code 看完课程&#xff0c;能够回答一下问题&#xff1a; C进入点是main()嘛&#xff1f;什么代码比main更早执行&#xff1f;什么代码在main结束后执行&#xff1f;为什么上述代码可以如此行为&#xff1f;Heap的结构如何&#xff1f;I/O的结构…

日志门面slf4j和各日志框架

简介 简单日志门面(Simple Logging Facade For Java) SLF4J主要是为了给Java日志访问提供一套标准、规范的API框架&#xff0c; 其主要意义在于提供接口&#xff0c;具体的实现可以交由其他日志框架&#xff0c;如log4j、logback、log4j2。 对于一般的Java项目而言&#xff…

元宇宙vr党建云上实景展馆扩大党的影响力

随着科技的飞速发展&#xff0c;VR虚拟现实技术已经逐渐融入我们的日常生活&#xff0c;尤其在党建领域&#xff0c;VR数字党建展馆更是成为引领红色教育新风尚的重要载体。今天&#xff0c;就让我们一起探讨VR数字党建展馆如何提供沉浸式体验&#xff0c;助力党建工作创新升级…

轻量封装WebGPU渲染系统示例<43>- PBR材质与阴影实(源码)

原理简介: 1. 基于rendering pass graph实现。 2. WGSL Shader 基于文件系统和宏机制动态组装。 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/PBRShadowTest.ts 当前示例运行效果: 此示例基于此渲染系统实现&a…

【C语言】【数据结构】自定义类型:结构体

引言 这是一篇对结构体的详细介绍&#xff0c;这篇文章对结构体声明、结构体的自引用、结构体的初始化、结构体的内存分布和对齐规则、库函数offsetof、以及进行内存对齐的原因、如何修改默认对齐数、结构体传参进行介绍和说明。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&am…

手机升级到iOS15.8后无法在xcode(14.2)上真机调试

之前手机是iOS14.2的系统,在xcode上进行真机测试运行良好&#xff0c;因为想要使用Xcode的Instruments功能&#xff0c;今天将系统更新到了iOS15.8 &#xff0c;结果崩了 说是Xcode和手机系统不兼容不能进行真机测试。在网上查了好些方法&#xff0c;靠谱的就是下载相关版本的…

Centos7云服务器上安装cobalt_strike_4.7。附cobalt_strike_4.7安装包

环境这里是阿里的一台Centos7系统。 开始安装之前首先要确保自己安装了java11及以上环境。 安装java11步骤&#xff1a; sudo yum update sudo yum install java-11-openjdk-devel把服务器端&#xff08;CS工具分服务器端和客户端&#xff09;的CS安装到服务器上后给目录下的…

【Java探索之旅】我与Java的初相识(一):Java的特性与优点及其发展史

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java入门到精通 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 一. Java语言概述与优势1.1 Java的概述1.2 Java语言的优势 二. Java领域与发展史2.1 Java的使用领域2.…

【Linux20.04-qt5.12.4软件安装与初步使用-qt在Linux使用-记录-笔记】

【Linux-qt软件安装与初步使用-qt在Linux使用-记录-笔记】 1、概述2、环境说明3、步骤总结1、了解并选择自己想要安装的版本2、访问 Qt 官方网站3、在 Qt 网站上找到下载部分&#xff08;自己想下载&#xff09;4、下载完成后&#xff0c;给安装程序文件赋予执行权限。5、自动配…

《杂文选刊》明年休刊之随笔

笔者今天偶然发现&#xff0c;网民对于近期登上社交网站热搜榜的一条新闻&#xff0c;既感兴趣又觉迷惑&#xff0c;因此关注度显得较高。 荣登社交网站热搜榜的这条新闻是&#xff1a;12月4日发出“休刊启事 ”&#xff0c;在宣布“《 杂文选刊》2024年1月1日起休刊”的同时&…