Linux(进程地址空间)
进程地址空间
- 程序地址空间
- 进程地址空间
程序地址空间
在Linux环境下,我们可以对上述程序空间地址进行验证:
运行程序,可以看到,我们就可以很好看出程序的地址空间的排布了:
进程地址空间
严格来说,我们上面所说的程序地址空间并不完全正确,他应该叫做进程地址空间才对。
接下来我们来看一段比较奇怪的代码:
运行程序会发现:
即使我们改变了g_val的值,我们程序的地址并没有发生任何变化,这是为什么呢?
接下来我们就需要引出虚拟地址空间的概念:
我们需要知道的是,我们平时所打印出来的地址,其实都不是物理地址,而是虚拟地址,是由操作系统进行管理的,我们是看不到的。而我们所谓的进程地址空间就相当于他的起始位置为0x00000000,结束位置为0xffffffff,然后划分为我们所说的代码区,堆区,栈区…,他其实是一种数据结构,在Linux下它是由结构体mm_struct实现的。
mm_struct中记录了每一个边界的开始位置与结束位置,而每一个区域之中都会存在各种的虚拟地址。
每个进程被创建时,他的进程控制块(task_atruct)和进程地址空间也会相应的被创建,task_atruct中会存储一个指针指向进程地址空间,进程控制块通过这个指针会找到进程地址空间进行访问,而进程地址空间与物理内存之间又是通过页表联系起来,最终完成对物理内存的访问。
地址空间和页表(用户级)每一个进程都私有一份,只要保证每一个页表映射到不同的物理内存区域,就能使进程之间不会相互影响,保证了进程的独立性。
接下来我们就可以理解最开始我们所提出的问题了,fork()以后,子进程产生,它包含了父进程的大部分属性,其中他们的虚拟地址就可以是一样的,此时的子进程与父进程共享物理内存中的代码与数据,而如果我们此时需要更改子进程的数据,会将父进程的数据拷贝一份,并不会影响父进程,子进程的页表会重新映射子进程在物理内存中的数据,这就是为什么我们更改了数据,但是地址并没有发生改变的原因。
这也就是为什么一个变量可能会同时保存两个不同的值,return的本质就是对id的写入,写入的过程中发生了写时拷贝,这样父进程和子进程在物理内存中就会有自己不同的变量空间,但是他们在用户层是共用一个变量(虚拟地址)的。
我们还需了解的是,当我们的可执行程序并没有被加载到内存中的时候,其实就已经形成了地址,即编译器在编译代码的过程中就已经形成了代码区,数据区…各个区域,并对每个变量,每一行代码进行了编址,所以程序在编译的时候,就已经形成了虚拟地址。
当CPU得到指令以后,磁盘的数据加载到内存当中,此时CPU通过虚拟地址空间与页表对物理内存进行访问,而物理内存中的变量和函数都被编译器赋予了相应的虚拟地址,当CPU访问到这些函数与变量时,所读取的并不是物理内存的地址,而是虚拟地址,所以CPU所读取的指令地址是虚拟地址。
那么为什么会存在进程地址空间呢?
主要有以下三点原因:
- 我们的物理内存并不是随便就能访问的,对于非法的访问和映射OS会识别到,终止此进程,这就有效的保护了我们的物理内存空间,也就是保护了进程与内核空间有效数据。
- 因为进程地址空间与页表的存在,磁盘中的数据可以加载到物理内存中的任意位置,所以内存管理模块和进程管理模块就完成了解耦合,物理内存和进程管理就可以做到没有联系。这样就算我们开辟了虚拟地址空间,如果我们不进行使用,物理内存可以一个字节都不给,当我们真正需要进行物理地址空间使用的时候,才会执行相关算法,为你申请内存,构建页表,访问物理内存,这种延迟分配的策略,就极大的提高了程序的效率。
- 在物理内存中可以再任意位置加载,看似是无序的,但是由于页表与进程地址空间的存在,通过映射关系,在进程视角看来,内存的分配又是有序的,进程地址空间的存在,可以让每个进程都以为自己拥有4GB的空间,并且每个区域都是有序的,进而通过构建页表访问物理地址空间,进程与进程之间就会互相不产生影响,甚至就不会知道其他进程的存在,也就实现了进程的独立性。
那么我们就可以重新理解我们的挂起状态:
加载的本质就是在创建进程,但是并不是将所有的代码和数据全部加载到内存当中去,通过上面的知识我们就可以知道,我们只会将我们所需要立即使用的数据加载进内存,这叫做唤入,当他长时间不会使用时,数据和代码就会被换出,这就叫做挂起状态。
相关文章:

Linux(进程地址空间)
进程地址空间 程序地址空间进程地址空间 程序地址空间 在Linux环境下,我们可以对上述程序空间地址进行验证: 运行程序,可以看到,我们就可以很好看出程序的地址空间的排布了: 进程地址空间 严格来说,我们…...

VLAN监控及常见问题排查
局域网,我们通常称为LAN,是一种由基于同一地理位置的设备组成的网络,可实现它们之间的通信,局域网的虚拟对应物是虚拟局域网或 VLAN。VLAN 增强了 LAN,提供了进行更改的灵活性、更高的可扩展性和更好的安全性。 使用 …...

PromQL实现Actuator获取的JVM指标的Full GC次数监控
Spring Boot 版本需要2.0.0或更高版本。 添加Micrometer Prometheus registry依赖: <dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId> </dependency>在application.properties中开…...

3.正则表达式
3.1什么是正则表达式 ●正则表达式( Regular Expression) 是用于匹配字符串中字符组合的模式。在JavaScript中, 正则表达式也是对象 ●通常用来查找、替换那些符合正则表达式的文本,许多语言都支持正则表达式 ●正则表达式在JavaScript中的使用场景: ➢…...

【学习FreeRTOS】第3章——FreeRTOS移植及配置文件
1.FreeRTOS源码简介 【一级目录:/】以下FreeRTOS的源码,其中,FreeRTOS文件夹最为重要,代笔FreeRTOS内核 【二级目录:/FreeRTOS】以下为FreeRTOS文件夹的内容,比较重要的有Demo文件夹和Source文件夹 【三级…...

Java算法_ LRU 缓存(LeetCode_Hot100)
题目描述:请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 获得更多?算法思路:代码文档,算法解析的私得。 运行效果 完整代码 import java.util.HashMap; import java.util.Map;/*** 2 * Author: L…...

Hugging Face 的文本生成和大语言模型的开源生态
[更新于 2023 年 7 月 23 日: 添加 Llama 2。] 文本生成和对话技术已经出现多年了。早期的挑战在于通过设置参数和分辨偏差,同时控制好文本忠实性和多样性。更忠实的输出一般更缺少创造性,并且和原始训练数据更加接近,也更不像人话。最近的研…...
Docker Compose用法详解
文章目录 Docker Compose是什么安装Docker ComposeCompose文件编写使用Docker Compose部署-管理应用 Docker Compose是什么 Docker Compose是一个用于定义和运行多容器Docker应用程序的python工具。它允许您使用一个单独的配置文件来定义和配置多个相关容器的服务,…...

分布式链路追踪概述
分布式链路追踪概述 文章目录 分布式链路追踪概述1.分布式链路追踪概述1.1.什么是 Tracing1.2.为什么需要Distributed Tracing 2.Google Dapper2.1.Dapper的分布式跟踪2.1.1.跟踪树和span2.1.2.Annotation2.1.3.采样率 3.OpenTracing3.1.发展历史3.2.数据模型 4.java探针技术-j…...

css中的var函数
css中的var函数 假设我们在css文件存在多个相同颜色值,当css文件越来越大的时候,想要改颜色就要手动在每个旧颜色上修改,这样维护工作非常难进行。 但是我们可以使用变量来存储值,这样可以在整个css样式表中重复使用,…...

第五次作业 运维高级 构建 LVS-DR 集群和配置nginx负载均衡
1、基于 CentOS 7 构建 LVS-DR 群集。 LVS-DR模式工作原理 首先,来自客户端计算机CIP的请求被发送到Director的VIP。然后Director使用相同的VIP目的IP地址将请求发送到集群节点或真实服务器。然后,集群某个节点将回复该数据包,并将该数据包…...
neo4j电影库-关系查询
关系类型数量源数据目标数据属性ACTED_IN172演员电影roles(角色扮演)属性,属性值为数组DIRECTED44导演电影无PRODUCED15制片商电影无WROTE10作家电影无FOLLOWS3影评人影评人无REVIEWED9影评人电影summary(影评摘要)和 …...
2020/10-2023/7 Notes
2020/10-2023/7 Notes 1.Unity WebGL 字体 动态字体 2.Path.Combine 3.播放Unity WebGL构建包 Vistual Studio Code->Extensions->Live Server 4.Cloud Compare laszip.net RenderDoc Mike Zero Ras Mapper HDF Viewer 5.使Unity支持GLSL Project->添加命令行参数-&g…...

在UOS系统中管理ORACLE数据库
在明确了“数字中国”建设战略后。自主创新与国产化已成为我国实现科技强国、经济强国的发展趋势与行业共识。 即信息技术应用创新产业,简称“信创”。 而现有的国产操作系统,虽然已日趋成熟,但因为很多应用软件由国外垄断,因此…...

以http_proxy和ajp_proxy方式整合apache和tomcat(动静分离)
注意:http_proxy和ajp_proxy的稳定性不如mod_jk 一.http_proxy方式 1.下载mod_proxy_html.x86_64 2.在apache下创建http_proxy.conf文件(或者直接写到conf/httpd.conf文件最后) 3.查看server.xml文件 到tomcat的安装目录下的conf/serve…...

【pinia】Pinia入门和基本使用:
文章目录 一、 什么是pinia二、 创建空Vue项目并安装Pinia1. 创建空Vue项目2. 安装Pinia并注册 三、 实现counter四、 实现getters五、 异步action六、 storeToRefs保持响应式解构七、基本使用:【1】main.js【2】store》index.js【3】member.ts 一、 什么是pinia P…...
Linux 文件系统(一)系统目录
系统目录 基本概念分区划分目录划分 基本概念 虽然Linux有很多不同的发行版,但是其基本目录结构都是类似的,因此只要了解一个发行版基本足矣。 分区划分 系统默认 大致有以下几种分区 /(根目录):该分区包含了操作系…...
『CV学习笔记』Opencv和PIL Image以及base64编码互相转化
Opencv和PIL Image以及base64编码互相转化 文章目录 一. opencv&PIL.Image&Skimage1.1. opencv-python读取透明图片(带alpha通道)1.2. opencv、PIL.Image、Skimage读取的彩色图片维度区别1.3. opencv、PIL.Image转换二. base64和cv2 imge互相转换三. base64和PIL imge互…...

行业追踪,2023-08-07
自动复盘 2023-08-07 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…...
CSRF 攻击和 XSS 攻击分别代表什么?如何防范?
一:PHP 1. CSRF 攻击和 XSS 攻击分别代表什么? 1.CSRF攻击 1.概念: CSRF(Cross-site request forgery)跨站请求伪造,用户通过跨站请求,以合法身份做非法的事情 2.原理: 1.登录受信任…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...