【探索Linux】—— 强大的命令行工具 P.9(进程地址空间)

阅读导航
- 前言
- 一、内存空间分布
- 二、什么是进程地址空间
- 1. 概念
- 2. 进程地址空间的组成
- 三、进程地址空间的设计原理
- 1. 基本原理
- 2. 虚拟地址空间
- · 概念
- · 大小和范围
- · 作用
- · 虚拟地址空间的优点
- 3. 页表
- 四、为什么要有地址空间
- 五、总结
- 温馨提示
前言
前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的一些知识,也学习了一些Linux的基本操作,也了解并学习了有关Linux开发工具vim 、gcc/g++ 使用、yum工具以及git 命令行提交代码也相信大家都掌握的不错,上一篇文章我们了解了关于进程的基本概念,今天博主带大家了解一下 —— 进程地址空间, 下面话不多说坐稳扶好咱们要开车了!!!😍
一、内存空间分布
-
内核空间(Kernel Space):也被称为系统空间,这是操作系统的核心部分。在内核空间中,操作系统运行,并且拥有最高权限。它包含操作系统的内核代码、驱动程序和关键系统数据结构。只有操作系统和特权级的程序能够直接访问内核空间。
-
用户空间(User Space):这是用于运行用户应用程序的区域。大多数应用程序和进程在用户空间中运行,受到操作系统的保护机制的限制。用户空间包含应用程序的代码、数据和堆栈,以及用于动态分配内存的堆空间。
-
栈空间(Stack Space):栈空间用于存储函数调用时的局部变量、参数和函数返回地址。每个进程在内存中都有一个独立的栈空间。栈空间是按照后进先出(LIFO)的原则进行管理。栈空间的大小通常是有限制的,并且在编译或运行时被设置。
-
堆空间(Heap Space):堆空间用于动态分配内存,例如通过调用
malloc()、new等函数分配的内存。堆空间的大小通常是由操作系统根据需求进行动态调整的。堆空间的管理是由程序员手动控制的,需要显示地分配和释放内存。在堆空间中,内存的分配和释放遵循不同的算法,如首次适应、最佳适应或最差适应等。 -
数据段(Data Segment):数据段用于存储全局变量 和 静态变量。数据段可以进一步细分为已初始化数据段(Initialized Data Segment)和未初始化数据段(Uninitialized Data Segment),也称为BSS段(Block Started by Symbol)。已初始化数据段存储已经赋初值的全局变量和静态变量,而未初始化数据段存储初值为0或未明确初始化的全局变量和静态变量。
-
代码段(Code Segment):也称为文本段(Text Segment),用于存储可执行程序的机器指令。代码段通常是只读的,并且是共享的,多个进程可以共享相同的代码段,从而节省内存空间。

二、什么是进程地址空间
1. 概念
⭕进程地址空间是指操作系统为每个运行中的进程所分配的虚拟地址范围。它是进程在内存中的抽象表示,包含了进程执行所需的代码、数据和堆栈等信息。每个进程拥有独立的地址空间,使得它们可以相互隔离地运行,并保护彼此的内存访问。进程地址空间是一种虚拟的概念,它提供了一种逻辑视图,使得进程可以像独占地拥有整个内存空间一样运行。
2. 进程地址空间的组成
⭕典型的进程地址空间由以下几个部分组成:
-
代码段:也称为文本段,用于存储可执行程序的机器指令。这部分地址空间是只读的,存放着程序的指令序列。
-
数据段:用于存储全局变量和静态变量。数据段可以进一步细分为已初始化数据段和未初始化数据段。
-
堆空间:用于动态分配内存。在堆空间中,程序员可以通过调用malloc()、new等函数来动态申请和释放内存。堆空间的大小是在运行时动态分配的。
-
栈空间:用于存储函数调用时的局部变量、参数和函数返回地址。每个函数的调用都会在栈上创建一个称为栈帧的数据结构。
-
共享库区:用于存放被多个进程共享的动态链接库或共享对象文件。这使得多个进程可以共享相同的库,从而节省内存空间。
三、进程地址空间的设计原理
1. 基本原理
-
虚拟化和地址映射:进程地址空间是通过虚拟化的方式实现的,将物理内存分配给进程时,使用一种地址映射技术将虚拟地址转换为物理地址。
-
分页和内存保护:分页是进程地址空间设计中的一种机制,将进程的虚拟地址空间划分为固定大小的页。这样做有助于优化内存的管理和使用,可以更有效地分配内存空间。
-
分段和逻辑隔离:分段是进程地址空间设计中的另一个主要机制,将进程的虚拟地址空间划分为不同的段,如代码段、数据段、堆段和栈段等。
-
共享内存和共享库:进程地址空间的设计还支持共享内存和共享库的机制。
-
动态分配和释放:进程地址空间的设计需要支持动态内存分配和释放,以满足进程在运行时对内存的需要。

2. 虚拟地址空间
· 概念
🍪虚拟地址空间是指每个进程独立拥有的抽象地址空间,它是进程在逻辑上(虚拟上)的地址范围。虚拟地址空间是一种相对于物理内存的概念,它给进程提供了一个连续的地址范围,而不考虑实际的物理内存地址。
· 大小和范围
🍪在虚拟地址空间中,进程使用的地址被称为虚拟地址。虚拟地址空间的大小和范围依赖于操作系统和硬件架构,常见的大小为32位和64位。例如,在32位系统上,虚拟地址空间通常是4GB(2^32个地址),而在64位系统上,虚拟地址空间通常是更大的范围。
· 作用
🍪虚拟地址空间的设计使得每个进程可以独立地使用内存资源,从而实现了进程之间的隔离和保护。不同进程的虚拟地址空间可以相同,但其对应的物理内存地址是不同的,这样可以确保进程之间不会相互干扰。虚拟地址通过地址映射技术转换为物理地址。
· 虚拟地址空间的优点
-
隔离性:虚拟地址空间使得每个进程可以独立地运行,不会相互干扰,提高了系统的安全性和稳定性。
-
内存管理:虚拟地址空间允许对内存进行更灵活的管理和分配,操作系统可以根据需求动态地分配和回收内存。
-
共享和保护:虚拟地址空间的设计支持共享内存和共享库的机制,进程可以共享同一块内存区域,并提供合适的保护机制以防止非法访问。
3. 页表
🍔页表(Page Table)是操作系统中用于虚拟地址到物理地址映射的数据结构。它用于记录虚拟地址的页面和相应的物理地址之间的映射关系。
在使用虚拟内存的系统中,每个进程都有自己的地址空间,其中包括一系列虚拟页。虚拟页被划分为固定大小的块,通常是4KB。页表的作用就是跟踪每个虚拟页与实际的物理页之间的对应关系。
页表通常由多级结构组成,这是为了处理大型地址空间的需要。具体实现方式因操作系统而异,但通常包含以下几个主要组成部分:
-
页目录(Page Directory):页目录是一级结构,用于存储特定地址范围(例如4GB)内的页表地址。每个页目录项(Page Directory Entry)通常对应一个页表或者页表的一级索引,它记录了对应页表的物理地址。
-
页表(Page Table):页表是二级结构,用于存储特定范围内的虚拟页与物理页的映射关系。每个页表项(Page Table Entry)表示一个虚拟页与物理页的映射,它记录了对应物理地址的页框号和一些标志位(如读/写权限、缓存状态等)。
-
页框(Page Frame):页框是物理内存中的一块固定大小(与虚拟页大小相同)的区域,它是内存的最小单位。通过页表的映射,虚拟页可以对应到相应的物理页框。
⭕页表的设计和实现使得操作系统可以将虚拟内存的管理和物理内存的细节进行抽象和隔离。通过页表,操作系统可以对进程的地址空间进行管理,包括按需分配物理页框、回收空闲页框、实现内存保护和共享等功能。这样,进程可以独立运行并进行内存访问,而不必关心实际的物理内存结构。
页表工作原理图

四、为什么要有地址空间
-
内存隔离:地址空间使每个进程都拥有自己独立的内存空间,彼此之间互相隔离。这种隔离确保了进程不会相互干扰,从而提高了系统的安全性和稳定性。如果没有地址空间,一个进程的错误操作可能会对其他进程或整个系统造成严重影响。
-
虚拟化内存:地址空间允许使用虚拟内存管理和操作。虚拟内存提供了一个抽象层,使得应用程序可以使用比物理内存更大的地址空间。这对于处理大型数据和运行多个应用程序非常重要。虚拟内存还支持内存映射文件和按需分配等机制,提高了内存管理的灵活性和效率。
-
共享和交互:地址空间提供了多个进程之间共享内存的机制,这对于进程间通信和数据共享非常有用。共享内存可以减少数据复制和传输的开销,并提供了一种高效的通信方式,如多进程并发编程、进程间消息传递等。
-
动态内存管理:地址空间允许操作系统动态管理进程的内存需求。操作系统可以根据进程的需要动态地分配和回收内存,以适应不同的内存负载。这样,可以更有效地利用有限的物理内存资源。
-
内存保护和随机化:地址空间允许操作系统对内存进行保护,限制进程对内存的访问权限。通过访问控制列表和页面权限设置等机制,可以保护关键数据和系统内核。此外,地址空间随机化技术可以提高系统的安全性,减少针对已知内存结构的攻击。
总的来说,地址空间为计算机系统提供了一种有效的内存管理和进程隔离机制。它使得每个进程可以在自己的独立地址空间上运行,提供了安全、高效的数据访问方式。所以地址空间的使用对于操作系统和应用程序来说都是必不可少的关键概念。
五、总结
我们了解了内存空间的分布,说明了在计算机系统中内存是如何被划分和组织的。接着,文章详细解释了进程地址空间的概念及其组成。进程地址空间是指每个进程独立拥有的内存空间,包括代码区、数据区和堆栈等部分。
我们探讨了进程地址空间设计的原理。从基本原理入手,介绍了虚拟地址空间的概念、大小和范围,以及其在进程中的作用。其中,虚拟地址空间通过将虚拟地址映射到物理地址,实现了内存的虚拟化,提供了更大的地址空间和灵活的内存管理机制。同时,还提及了页表这一关键数据结构,用于记录虚拟地址到物理地址的映射关系。最后,回答了为什么需要地址空间的问题。地址空间的存在具有多个优点,包括内存隔离、虚拟化内存、共享和交互、动态内存管理以及内存保护和随机化等方面。地址空间通过为每个进程提供独立的内存空间,保证了进程间的相互隔离和安全性,提供了高效的数据访问方式,同时也为系统提供了灵活和高效的内存管理机制。
综上所述,我们学习了进程地址空间及其设计原理,阐述了地址空间的重要性和优点。对于理解计算机系统中内存管理的关键概念和机制具有一定的指导意义。
温馨提示
感谢您对博主文章的关注与支持!如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于Linux以及C++编程技术问题的深入解析、应用案例和趣味玩法等。如果感兴趣的话可以关注博主的更新,不要错过任何精彩内容!
再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索Linux、C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!

相关文章:
【探索Linux】—— 强大的命令行工具 P.9(进程地址空间)
阅读导航 前言一、内存空间分布二、什么是进程地址空间1. 概念2. 进程地址空间的组成 三、进程地址空间的设计原理1. 基本原理2. 虚拟地址空间 概念 大小和范围 作用 虚拟地址空间的优点 3. 页表 四、为什么要有地址空间五、总结温馨提示 前言 前面我们讲了C语言的基础知识&am…...
ESP32主板-MoonESP32
产品简介 Moon-ESP32主板,一款以双核芯片ESP32-E为主芯片的主控板,支持WiFi和蓝牙双模通信,低功耗,板载LED指示灯,引出所有IO端口,并提供多个I2C端口、SPI端口、串行端口,方便连接,…...
Python 图片处理笔记
import numpy as np import cv2 import os import matplotlib.pyplot as plt# 去除黑边框 def remove_the_blackborder(image):image cv2.imread(image) #读取图片img cv2.medianBlur(image, 5) #中值滤波,去除黑色边际中可能含有的噪声干扰#medianBlur( Inp…...
SpringCloud Ribbon--负载均衡 原理及应用实例
😀前言 本篇博文是关于SpringCloud Ribbon的基本介绍,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力…...
Redis的介绍以及简单使用
Redis(Remote Dictionary Server)是一个开源的内存数据存储系统,它以键值对的形式将数据存在内存中,并提供灵活、高性能的数据访问方式。Redis具有高速读写能力和丰富的数据结构支持,可以广泛应用于缓存、消息队列、实…...
ad18学习笔记十二:如何把同属性的元器件全部高亮?
1、先选择需要修改的器件的其中一个。 2、右键find similar objects,然后在弹出的对话框中,将要修改的属性后的any改为same 3、像这样勾选的话,能把同属性的元器件选中,其他器件颜色不变 注意了,如果这个时候ÿ…...
SpringSecurity 核心过滤器——SecurityContextPersistenceFilter
文章目录 前言过滤器介绍用户信息的存储获取用户信息存储用户信息获取用户信息 处理逻辑总结 前言 SecurityContextHolder,这个是一个非常基础的对象,存储了当前应用的上下文SecurityContext,而在SecurityContext可以获取Authentication对象…...
反转单链表
思路图1: 代码: struct ListNode* reverseList(struct ListNode* head){if(headNULL)//当head是空链表时 {return head; }struct ListNode* n1NULL;struct ListNode* n2head;struct ListNode* n3head->next;if(head->nextNULL)//当链表只有一个节…...
加速新药问世,药企如何利用云+网的优势?
随着计算能力的不断提高和人工智能技术的迅速发展,药物研发领域正迎来一场革命。云端强大的智能算法正成为药物研发企业的得力助手,推动着药物的精确设计和固相筛选。这使得药物设计、固相筛选以及药物制剂开发的时间大幅缩短,有望加速新药物…...
C++中string对象之间比较、char*之间比较
#include <cstring> //char* 使用strcmp #include <string> //string 使用compare #include <iostream> using namespace std; int main() {string stringStr1 "42";string stringStr2 "42";string stringStr3 "213";cout …...
MVVM模式理解
链接: MVVM框架理解及其原理实现 - 知乎 (zhihu.com) 重点: 1.将展示的界面窗口和创建的构件是数据进行分离 2.利用一个中间商进行数据的处理,所有的数据通过中间商进行处理...
js常用的数组处理方法
some 方法 用于检查数组中是否至少有一个元素满足指定条件。如果有满足条件的元素,返回值为 true,否则返回 false。 const numbers [1, 2, 3, 4, 5];const hasEvenNumber numbers.some((number) > number % 2 0); console.log(hasEvenNumber); /…...
[Document]VectoreStoreToDocument开发
该document是用来检索文档的。 第一步:定义组件对象,该组件返回有两种类型:document和text。 第二步:获取需要的信息,向量存储库,这里我使用的是内存向量存储(用该组件拿到文档,并检…...
【LeetCode-简单题】225. 用队列实现栈
文章目录 题目方法一:单个队列实现 题目 方法一:单个队列实现 入栈 和入队正常进行出栈的元素其实就是队列的尾部元素,所以直接将尾部元素弹出即可,其实就可以将除了最后一个元素的其他元素出队再加入队,然后弹出队首元…...
数据预处理方式合集
删除空行 #del all None value data_all.dropna(axis1, howall, inplaceTrue) 删除空列 #del all None value data_all.dropna(axis0, howall, inplaceTrue) 缺失值处理 观测缺失值 观测数据缺失值有一个比较好用的工具包——missingno,直接传入DataFrame&…...
【前端】jquery获取data-*的属性值
通过jquery获取下面data-id的值 <div id"getId" data-id"122" >获取id</div> 方法一:dataset()方法 //data-前缀属性可以在JS中通过dataset取值,更加方便 console.log(getId.dataset.id);//112//赋值 getId.dataset.…...
GB28181学习(五)——实时视音频点播(信令传输部分)
要求 实时视音频点播的SIP消息应通过本域或其他域的SIP服务器进行路由、转发,目标设备的实时视音频流宜通过本域的媒体服务器进行转发;采用INVITE方法实现会话连接,采用RTP/RTCP协议实现媒体传输;信令流程分为客户端主动发起和第…...
单例模式(饿汉模式 懒汉模式)与一些特殊类设计
文章目录 一、不能被拷贝的类 二、只能在堆上创建类对象 三、只能在栈上创建类对象 四、不能被继承的类 五、单例模式 5、1 什么是单例模式 5、2 什么是设计模式 5、3 单例模式的实现 5、3、1 饿汉模式 5、3、1 懒汉模式 🙋♂️ 作者:Ggggggtm &#x…...
133. 克隆图
133. 克隆图 题目-中等难度示例1. bfs 题目-中等难度 给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。…...
交流耐压试验目的
试验目的 交流耐压试验是鉴定电力设备绝缘强度最有效和最直接的方法。 电力设备在运行中, 绝缘长期受着电场、 温度和机械振动的作用会逐渐发生劣化, 其中包括整体劣化和部分劣化,形成缺陷, 例如由于局部地方电场比较集中或者局部…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
