Linux---进程(5)---进程地址空间
目录
预备知识
进程地址空间
什么是进程地址空间
为什么要存在进程地址空间和页表
缺页中断
预备知识
我们在学习语言的时候,一般都会了解到内存区域划分,下面了解一下Linux的内存区域划分。

通过上图,我们了解到
1、堆区向上增长,栈区向下增长。
2、环境变量和命令行参数,无论是表还是内容,都在栈区的上面。
3、先有命令行参数表,再有环境变量。
在Linux中,每次打印的地址都一样,windows每次访问地址都是随机的。而Linux是一样的。
静态变量只初始化一次(默认初始化)并不随函数的调用而释放,一般在初始化数据区域中。
从系统的角度来看,语言中定义的静态变量(不论是全局还是局部)已经是全局变量了,只是局部的静态变量受到作用域限制,本质上程序运行期间一直存在的,因为程序运行期间,代码和数据会一直伴随着。
进程地址空间
我们来看一个现象:

同一个地址,通过不同进程去访问得到两个不同的值。
说明这个地址是虚拟地址(线性地址)而非物理地址。
编程语言中的地址都是虚拟地址。
我们在学习语言时了解到的内存分区实际上不是内存,而是进程地址空间。
每一个进程都要有进程地址空间。
程序变为进程后,每一个进程都有进程地址空间,与语言无关。所有编译型语言都必须符合此规则(每个进程都要有进程地址空间)。
首先,我们解决一下这个问题:

通过研究发现,每一个进程在创建的时候,操作系统都要为其维护一个专属的进程地址空间,再通过一种哈希映射的思想维护一张表,用来将操作系统从进程处拿到的虚拟地址转化为物理地址,再通过物理地址去访问数据。
这样的设计方式,也可以解释为什么fork创建子进程后,为什么返回值可以让父子进程不同,本质是父子进程各自的映射表中,将同一个虚拟地址映射到两个不同的物理内存中去。
进程=task_struct+代码和数据
task_struct是每个进程独有的,代码是只读的,数据修改时可以写时拷贝,所以,进程是独立的。
什么是进程地址空间
进程地址空间本质就是特定的内核数据结构对象。
每一个进程都会拥有一个进程地址空间。
在32位操作系统下,进程地址空间的大小是[0,4GB]。
操作系统通过"先描述,再组织"的方式管理进程的地址空间。
进程地址空间本质就是数据结构节点,Linux中此节点名称为mm_struct。

mm_struct中记录该进程地址空间的字段,通过这些字段来做区域划分,管理每个区域的变化。
区域内的各个地址空间都可以使用。
代码和数据都存储在物理内存中,进程地址空间中的都是虚拟地址。
上述图中的哈希映射表称之为页表。
一个程序要运行时,首先创建PCB,处理好PCB内部信息,比如pid、优先级、进程地址空间。然后将代码和数据加载到内存中,操作系统要访问数据时,通过该进程的进程地址空间拿到虚拟地址,利用页表将虚拟地址转化为物理地址,通过物理地址拿到数据。
其中,CPU内部的CR3寄存器存储页表的物理地址,MMU硬件单元管理着整个映射地址、转换地址的工作。
为什么要存在进程地址空间和页表
1、将物理内存从无序变为有序,让进程以统一的视角看待内存。
2、将进程管理和内存管理解耦合
3、进程地址空间和页表组合的设计是保护内存安全的重要手段。
磁盘将可执行程序加载到内存中数据是不连续的。如果操作系统直接管理不连续的物理地址效率很低。所以我们将这个程序对应页表的虚拟地址设计成连续的,连续的虚拟地址映射到不连续的物理地址上,进程管理与内存管理之间没有关系,操作系统通过页表将虚拟-物理地址相互联系,所以我们管理连续的虚拟地址就管理了物理地址,提高了效率。
进程访问数据时,页表会帮我们检测访问数据地址的合法性,如果不合法或者转化物理地址失败,操作系统就会将此进程拦截,阻止该进程,甚至终止该进程。如:一旦访问野指针或越界,操作系统会终止该进程。但终止该进程不会影响到其他进程,因为是进程自己的页表拦截了自己。所以,页表不仅仅有地址转化的工作,还有检测访问合法地址的机制。
缺页中断
我们申请内存时,可能刚申请完的内存不立即使用,如果存在这种情况,从我们申请成功到真正使用内存的这一段时间里,操作系统就不好管理这部分内存,毕竟是用户的,也不可能销毁,但是用户如果一直不用,操作系统是无法对这部分内存做处理的,操作系统的效率就会降低。
操作系统基于效率考虑,设计了以下机制
用户在申请内存后,操作系统首先在该进程的进程地址空间中的对应区域上面申请空间,然后返回给用户一个虚拟地址,等到用户真正要使用这部分内存时,操作系统首先会在页表中去查询,若页表中没有该虚拟地址与物理地址的映射关系时,操作系统就会先中断用户使用该进程的操作,在物理地址上面先申请空间,在页表中添加虚拟地址与物理地址的映射关系。再启动该用户使用内存操作,操作系统继续访问页表,通过页表映射关系找到物理内存,然后操作系统为用户执行对应操作即可。这个中断操作称为缺页中断。
此机制保证了内存的使用率,提升malloc/new的速度。
相关文章:
Linux---进程(5)---进程地址空间
目录 预备知识 进程地址空间 什么是进程地址空间 为什么要存在进程地址空间和页表 缺页中断 预备知识 我们在学习语言的时候,一般都会了解到内存区域划分,下面了解一下Linux的内存区域划分。 通过上图,我们了解到 1、堆区向上增长&…...
C语言实现数据结构之队列
目录 队列一. 队列的概念及结构二. 队列的实现1. 要实现的功能2 具体的实现2.1 结构体2.2 初始化2.3 入队列2.4 出队列2.5 返回队首元素2.6 返回队尾元素2.7 队列元素个数2.8 队列判空2.9 队列销毁 三. 队列相关OJ题设计循环队列用队列实现栈用栈实现队列 四. 概念选择题五. 参…...
写一个Vue2和vue3的自定义指令(以复制指定作为示例)
文章目录 一、自定义指令是什么?二、自定义指令有啥用?三、自定义指令怎么用?1.自定义指令的参数2.自定义指令的钩子函数(1)五个钩子函数的说明(2)钩子函数的参数(主要参数:el和valu…...
MySQL —— 聚合查询,分组查询 与 联合查询
聚合函数 常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有: 函数说明count()统计数据总数sum()求和avg()求平均值max()求最大值min()求最小值 注意凡是涉及运算的,数据库会自动掉 NULL 值 注意NULL …...
Spring声明式事务失效场景
Spring声明式事务失效场景 背景搭建测试环境测试事务失效场景Transactional 注解标注在 private 方法上异常被 catch 了,事务失效方法抛出的是受检异常,事务也会失效事务传播行为配置不合理导致事务失效 背景 Spring 针对 Java Transaction API (JTA)、…...
基于SpringBoot+UniAPP宠物食品外卖点单小程序的设计与实现》
✅博主简介:Java 全栈开发工程师,抖音优质技术创作者,日常分享实用的前端、后端、运维开发技术。 ✅技术栈:Java、SpringBoot、Vue、React、Node.js、Nest.js、Nuxt.js、uni-app ✅技术擅长:计算机毕设选题、开题报告、…...
ssrf 内网访问 伪协议 读取文件 端口扫描
SSRF(Server-Side Request Forgery,服务器侧请求伪造)是一种利用服务器发起网络请求的能力来攻击内网资源或执行其他恶意活动的技术。SSRF可以用于访问通常不可由外部直接访问的内网资源,读取文件,甚至进行端口扫描。以…...
发布包到npm
目录 注册npm账号 创建包 登录npm 上架包 更新包 删除包 注册npm账号 首先注册npm账号:npm | Sign Up (npmjs.com) 创建包 可以在桌面上新建一个文件夹:文件夹名随便起,但是别跟npm已经上架的包名重复了 可以通过下面的指令查看&…...
Python | Leetcode Python题解之第324题摆动排序II
题目: 题解: def quickSelect(a: List[int], k: int) -> int:seed(datetime.datetime.now())shuffle(a)l, r 0, len(a) - 1while l < r:pivot a[l]i, j l, r 1while True:i 1while i < r and a[i] < pivot:i 1j - 1while j > l an…...
IGModel——提高基于 GNN与Attention 机制的方法在药物发现中的实用性
导言 深度学习在药物发现(发现治疗药物)领域的应用以及传统方法面临的挑战。 药物(尤其是我们将在本文中讨论的被称为抑制剂的药物)通过与在人体中发挥不良功能的蛋白质结合并改变这些蛋白质的功能来发挥治疗效果。因此…...
AArch64中的寄存器
目录 通用寄存器 其他寄存器 系统寄存器 通用寄存器 大多数A64指令在寄存器上操作。该架构提供了31个通用寄存器。 每个寄存器可以作为64位的X寄存器(X0..X30)使用,或者作为32位的W寄存器(W0..W30)使用。这两种是查…...
树莓派Pico 2来了
这两天开源圈的大事之一,就是树莓派基金会发布了树莓派Pico 2。 帖子原文:Raspberry Pi Pico 2, our new $5 microcontroller board, on sale now 总结一些关键信息: 产品发布:Raspberry Pi Pico 2 是 Raspberry Pi 基金会推出的…...
LeetCode面试题Day7|LeetCode135 分发糖果、LeetCode42 接雨水
题目1: 指路: . - 力扣(LeetCode)135 分发糖果 思路与分析: 给n个孩子按照评分给糖果,要求有二,其一为每个孩子最少有一颗糖果;其二为相邻孩子评分更高的糖果越多。那么在这里第…...
[免费]适用于 Windows 10 的十大数据恢复软件
Windows 10 是 Microsoft 开发的跨平台和设备应用程序操作系统。它启动速度更快,具有熟悉且扩展的“开始”菜单,甚至可以在多台设备上以新的方式工作。因此,Windows 10 非常受欢迎,我们用它来保存照片、音乐、文档和更多文件。但有…...
Win11+docker+vscode配置anomalib并训练自己的数据(3)
在前两篇博文中,我使用Win11+docker配置了anomalib,并成功的调用了GPU运行了示例程序。这次我准备使用anomalib训练我自己的数据集。 数据集是我在工作中收集到的火腿肠缺陷数据,与MVTec等数据不同,我的火腿肠数据来源于多台设备和多个品种,因此,它们表面的纹理与颜色差异…...
Java | Leetcode Java题解之第332题重新安排行程
题目: 题解: class Solution {Map<String, PriorityQueue<String>> map new HashMap<String, PriorityQueue<String>>();List<String> itinerary new LinkedList<String>();public List<String> findItine…...
招聘公告|健安环保科技(广东)有限公司
招聘岗位:销售经理 岗位职责: 对PCB线路板和电镀行业的客户,推广针对镀锡漂洗水的低浓度锡回收技术(投资运营或设备销售),并销售无耗材材的电镀智能过滤设备,达成销售目标; 任职要求: 1、大专以上学历&…...
小程序的安全设计
小程序的安全设计 安全指引 | 微信开放文档 (qq.com) 开发原则与注意事项 本文档整理了部分小程序开发中常见的安全风险和漏洞,用于帮助开发者在开发环节中发现和修复相关漏洞,避免在上线后对业务和数据造成损失。 开发者在开发环节中必须基于以下原则: 互不信任原则,不要…...
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
文章目录 webView使用步骤示例 HttpURLConnection使用步骤示例GET请求POST请求 okHttp使用步骤1. 添加依赖2. 创建OkHttpClient实例3. 创建Request对象构建请求4. 发送请求5. 获取响应 Pull解析方式1. 准备XML数据2. 创建数据类3. 使用Pull解析器解析XML webView WebView 是 An…...
Kubernetes—k8s集群存储卷(pvc存储卷)
目录 一、PVC 和 PV 1.PV 2.PVC 3.StorageClass 4.PV和PVC的生命周期 二、实操 1.创建静态pv 1.配置nfs 2.创建pv 3.创建pvc 4.结合pod,将pv、pvc一起运行 2.创建动态pv 1.上传 2.创建 Service Account,用来管理 NFS Provisioner 在 k8s …...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
【实施指南】Android客户端HTTPS双向认证实施指南
🔐 一、所需准备材料 证书文件(6类核心文件) 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...
【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...
负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...
职坐标物联网全栈开发全流程解析
物联网全栈开发涵盖从物理设备到上层应用的完整技术链路,其核心流程可归纳为四大模块:感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性,例如传感器选型需平衡精度与…...
VSCode 没有添加Windows右键菜单
关键字:VSCode;Windows右键菜单;注册表。 文章目录 前言一、工程环境二、配置流程1.右键文件打开2.右键文件夹打开3.右键空白处打开文件夹 三、测试总结 前言 安装 VSCode 时没有注意,实际使用的时候发现 VSCode 在 Windows 菜单栏…...
