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

news2024/10/7 6:45:26

在这里插入图片描述

阅读导航

  • 前言
  • 一、内存空间分布
  • 二、什么是进程地址空间
    • 1. 概念
    • 2. 进程地址空间的组成
  • 三、进程地址空间的设计原理
    • 1. 基本原理
    • 2. 虚拟地址空间
      • · 概念
      • · 大小和范围
      • · 作用
      • · 虚拟地址空间的优点
    • 3. 页表
  • 四、为什么要有地址空间
  • 五、总结
  • 温馨提示

前言

前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的一些知识,也学习了一些Linux的基本操作,也了解并学习了有关Linux开发工具vim 、gcc/g++ 使用、yum工具以及git 命令行提交代码也相信大家都掌握的不错,上一篇文章我们了解了关于进程的基本概念,今天博主带大家了解一下 —— 进程地址空间, 下面话不多说坐稳扶好咱们要开车了!!!😍

一、内存空间分布

  1. 内核空间(Kernel Space):也被称为系统空间,这是操作系统的核心部分。在内核空间中,操作系统运行,并且拥有最高权限。它包含操作系统的内核代码、驱动程序和关键系统数据结构。只有操作系统和特权级的程序能够直接访问内核空间。

  2. 用户空间(User Space):这是用于运行用户应用程序的区域。大多数应用程序和进程在用户空间中运行,受到操作系统的保护机制的限制。用户空间包含应用程序的代码、数据和堆栈,以及用于动态分配内存的堆空间

  3. 栈空间(Stack Space):栈空间用于存储函数调用时的局部变量、参数和函数返回地址。每个进程在内存中都有一个独立的栈空间。栈空间是按照后进先出(LIFO)的原则进行管理。栈空间的大小通常是有限制的,并且在编译或运行时被设置。

  4. 堆空间(Heap Space):堆空间用于动态分配内存,例如通过调用malloc()new等函数分配的内存。堆空间的大小通常是由操作系统根据需求进行动态调整的。堆空间的管理是由程序员手动控制的,需要显示地分配和释放内存。在堆空间中,内存的分配和释放遵循不同的算法,如首次适应、最佳适应或最差适应等。

  5. 数据段(Data Segment):数据段用于存储全局变量静态变量。数据段可以进一步细分为已初始化数据段(Initialized Data Segment)和未初始化数据段(Uninitialized Data Segment),也称为BSS段(Block Started by Symbol)。已初始化数据段存储已经赋初值的全局变量和静态变量,而未初始化数据段存储初值为0或未明确初始化的全局变量和静态变量。

  6. 代码段(Code Segment):也称为文本段(Text Segment),用于存储可执行程序的机器指令。代码段通常是只读的,并且是共享的,多个进程可以共享相同的代码段,从而节省内存空间。

在这里插入图片描述

二、什么是进程地址空间

1. 概念

⭕进程地址空间是指操作系统为每个运行中的进程所分配的虚拟地址范围它是进程在内存中的抽象表示,包含了进程执行所需的代码、数据和堆栈等信息。每个进程拥有独立的地址空间,使得它们可以相互隔离地运行,并保护彼此的内存访问。进程地址空间是一种虚拟的概念,它提供了一种逻辑视图,使得进程可以像独占地拥有整个内存空间一样运行。

2. 进程地址空间的组成

⭕典型的进程地址空间由以下几个部分组成:

  1. 代码段:也称为文本段,用于存储可执行程序的机器指令。这部分地址空间是只读的,存放着程序的指令序列。

  2. 数据段:用于存储全局变量和静态变量。数据段可以进一步细分为已初始化数据段和未初始化数据段。

  3. 堆空间:用于动态分配内存。在堆空间中,程序员可以通过调用malloc()、new等函数来动态申请和释放内存。堆空间的大小是在运行时动态分配的。

  4. 栈空间:用于存储函数调用时的局部变量、参数和函数返回地址。每个函数的调用都会在栈上创建一个称为栈帧的数据结构。

  5. 共享库区:用于存放被多个进程共享的动态链接库或共享对象文件。这使得多个进程可以共享相同的库,从而节省内存空间。

三、进程地址空间的设计原理

1. 基本原理

  1. 虚拟化和地址映射:进程地址空间是通过虚拟化的方式实现的,将物理内存分配给进程时,使用一种地址映射技术将虚拟地址转换为物理地址。

  2. 分页和内存保护:分页是进程地址空间设计中的一种机制,将进程的虚拟地址空间划分为固定大小的页。这样做有助于优化内存的管理和使用,可以更有效地分配内存空间。

  3. 分段和逻辑隔离:分段是进程地址空间设计中的另一个主要机制,将进程的虚拟地址空间划分为不同的段,如代码段、数据段、堆段和栈段等。

  4. 共享内存和共享库:进程地址空间的设计还支持共享内存和共享库的机制。

  5. 动态分配和释放:进程地址空间的设计需要支持动态内存分配和释放,以满足进程在运行时对内存的需要。

在这里插入图片描述

2. 虚拟地址空间

· 概念

🍪虚拟地址空间是指每个进程独立拥有的抽象地址空间,它是进程在逻辑上(虚拟上)的地址范围。虚拟地址空间是一种相对于物理内存的概念,它给进程提供了一个连续的地址范围,而不考虑实际的物理内存地址

· 大小和范围

🍪在虚拟地址空间中,进程使用的地址被称为虚拟地址。虚拟地址空间的大小和范围依赖于操作系统和硬件架构,常见的大小为32位和64位。例如,在32位系统上,虚拟地址空间通常是4GB(2^32个地址),而在64位系统上,虚拟地址空间通常是更大的范围。

· 作用

🍪虚拟地址空间的设计使得每个进程可以独立地使用内存资源,从而实现了进程之间的隔离和保护。不同进程的虚拟地址空间可以相同,但其对应的物理内存地址是不同的,这样可以确保进程之间不会相互干扰。虚拟地址通过地址映射技术转换为物理地址

· 虚拟地址空间的优点

  1. 隔离性:虚拟地址空间使得每个进程可以独立地运行,不会相互干扰,提高了系统的安全性和稳定性。

  2. 内存管理:虚拟地址空间允许对内存进行更灵活的管理和分配,操作系统可以根据需求动态地分配和回收内存。

  3. 共享和保护:虚拟地址空间的设计支持共享内存和共享库的机制,进程可以共享同一块内存区域,并提供合适的保护机制以防止非法访问。

3. 页表

🍔页表(Page Table)是操作系统中用于虚拟地址到物理地址映射的数据结构。它用于记录虚拟地址的页面和相应的物理地址之间的映射关系。

在使用虚拟内存的系统中,每个进程都有自己的地址空间,其中包括一系列虚拟页。虚拟页被划分为固定大小的块,通常是4KB。页表的作用就是跟踪每个虚拟页与实际的物理页之间的对应关系

页表通常由多级结构组成,这是为了处理大型地址空间的需要。具体实现方式因操作系统而异,但通常包含以下几个主要组成部分:

  1. 页目录(Page Directory):页目录是一级结构,用于存储特定地址范围(例如4GB)内的页表地址。每个页目录项(Page Directory Entry)通常对应一个页表或者页表的一级索引,它记录了对应页表的物理地址。

  2. 页表(Page Table):页表是二级结构,用于存储特定范围内的虚拟页与物理页的映射关系。每个页表项(Page Table Entry)表示一个虚拟页与物理页的映射,它记录了对应物理地址的页框号和一些标志位(如读/写权限、缓存状态等)。

  3. 页框(Page Frame):页框是物理内存中的一块固定大小(与虚拟页大小相同)的区域,它是内存的最小单位。通过页表的映射,虚拟页可以对应到相应的物理页框。

⭕页表的设计和实现使得操作系统可以将虚拟内存的管理和物理内存的细节进行抽象和隔离。通过页表,操作系统可以对进程的地址空间进行管理,包括按需分配物理页框、回收空闲页框、实现内存保护和共享等功能。这样,进程可以独立运行并进行内存访问,而不必关心实际的物理内存结构

页表工作原理图
在这里插入图片描述

四、为什么要有地址空间

  1. 内存隔离:地址空间使每个进程都拥有自己独立的内存空间,彼此之间互相隔离。这种隔离确保了进程不会相互干扰,从而提高了系统的安全性和稳定性。如果没有地址空间,一个进程的错误操作可能会对其他进程或整个系统造成严重影响。

  2. 虚拟化内存:地址空间允许使用虚拟内存管理和操作。虚拟内存提供了一个抽象层,使得应用程序可以使用比物理内存更大的地址空间。这对于处理大型数据和运行多个应用程序非常重要。虚拟内存还支持内存映射文件和按需分配等机制,提高了内存管理的灵活性和效率。

  3. 共享和交互:地址空间提供了多个进程之间共享内存的机制,这对于进程间通信和数据共享非常有用。共享内存可以减少数据复制和传输的开销,并提供了一种高效的通信方式,如多进程并发编程、进程间消息传递等。

  4. 动态内存管理:地址空间允许操作系统动态管理进程的内存需求。操作系统可以根据进程的需要动态地分配和回收内存,以适应不同的内存负载。这样,可以更有效地利用有限的物理内存资源。

  5. 内存保护和随机化:地址空间允许操作系统对内存进行保护,限制进程对内存的访问权限。通过访问控制列表和页面权限设置等机制,可以保护关键数据和系统内核。此外,地址空间随机化技术可以提高系统的安全性,减少针对已知内存结构的攻击。

总的来说,地址空间为计算机系统提供了一种有效的内存管理和进程隔离机制。它使得每个进程可以在自己的独立地址空间上运行,提供了安全、高效的数据访问方式。所以地址空间的使用对于操作系统和应用程序来说都是必不可少的关键概念。

五、总结

我们了解了内存空间的分布,说明了在计算机系统中内存是如何被划分和组织的。接着,文章详细解释了进程地址空间的概念及其组成。进程地址空间是指每个进程独立拥有的内存空间,包括代码区、数据区和堆栈等部分。

我们探讨了进程地址空间设计的原理。从基本原理入手,介绍了虚拟地址空间的概念、大小和范围,以及其在进程中的作用。其中,虚拟地址空间通过将虚拟地址映射到物理地址,实现了内存的虚拟化,提供了更大的地址空间和灵活的内存管理机制。同时,还提及了页表这一关键数据结构,用于记录虚拟地址到物理地址的映射关系。最后,回答了为什么需要地址空间的问题。地址空间的存在具有多个优点,包括内存隔离、虚拟化内存、共享和交互、动态内存管理以及内存保护和随机化等方面。地址空间通过为每个进程提供独立的内存空间,保证了进程间的相互隔离和安全性,提供了高效的数据访问方式,同时也为系统提供了灵活和高效的内存管理机制。

综上所述,我们学习了进程地址空间及其设计原理,阐述了地址空间的重要性和优点。对于理解计算机系统中内存管理的关键概念和机制具有一定的指导意义。

温馨提示

感谢您对博主文章的关注与支持!如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于Linux以及C++编程技术问题的深入解析、应用案例和趣味玩法等。如果感兴趣的话可以关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索Linux、C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

性能测试-性能调优主要方向和原则(15)

性能调优主要方向明确性能瓶颈之后,就需要进行性能调优了,调优主要从图所示的多个方向入手。能优化手段并不一定是独立应用的,在一次优化过程中很可能应用了多种优化技巧。 硬件层面优化 硬件层面优化更偏向于监控,当定位到硬件资源成为瓶颈后,更多是采用扩容等手段来解决…

代码随想录算法训练营第三十六天| 435. 无重叠区间 763.划分字母区间 56. 合并区间

今天的三道题目,都算是 重叠区间 问题,大家可以好好感受一下。 都属于那种看起来好复杂,但一看贪心解法,惊呼:这么巧妙! 还是属于那种,做过了也就会了,没做过就很难想出来。 不过大…

synchronized实战:synchronized 锁升级过程

下面程序通过对加锁前后Object对象字节码的打印验证了对象由无锁到偏向锁的过程。 public class T01 {public static void main(String[] args) {Object o new Object();System.out.println(ClassLayout.parseInstance(o).toPrintable());o.hashCode();System.out.println(Cl…

Linux界的老古董

Slackware 是由 Patrick Volkerding 制作的 Linux 发行版,从 1993 年发布至今也一直在 Patrick 带领下进行维护。7 月 17 日,Slackware 才刚刚过完它 24 岁的生日,看似年纪轻轻的它,已然是 Linux 最古老的发行版。 Slackware 的发…

laravel框架 - 安装初步使用学习 composer安装

一、什么是laravel框架 Laravel框架可以开发各种不同类型的项目,内容管理系统(Content Management System,CMS)是一种比较典型的项目,常见的网站类型(如门户、新闻、博客、文章等)都可以利用CM…

【Linux学习笔记】权限

1. 普通用户和root用户权限之间的切换2. 权限的三个w2.1. 什么是权限(what)2.1.1. 用户角色2.1.2. 文件属性 2.2. 怎么操作权限呢?(how)2.2.1. ugo-rwx方案2.2.2. 八进制方案2.2.3. 文件权限的初始模样2.2.4. 进入一个…

Linux基础操作

ls [-a -l -h] [Linux路径] 当不使用选项和参数,直接使用ls命令本体,表示以平铺的方式:列出当前工作目录下的内容 ls -a -a表示all的意思,即列出所有文件(包含隐藏的文件和文件夹) ls -l 以竖列的形式展示信…

linux C语言 socket的server、client 实现

讲解: 在Linux中,使用socket与另一端建立连接通常涉及到以下步骤: 1. 创建Socket:首先,你需要创建一个套接字(socket)。你可以使用socket()系统调用来创建套接字。通常,你需要指定套接字的类型&#xff0…

ssh服务登录原理与配置

文章目录 前言一、基于口令的认证(用户名密码)二、基于公钥的认证(免密登录)三、禁止用户登录和修改端口四、免密登录具体操作 前言 非对称加密是在认证用户连接的时候使用的,对称加密是在用户连接之后开始传输数据的…

【C++】深拷贝和浅拷贝 ④ ( 深拷贝示例 )

文章目录 一、深拷贝示例1、浅拷贝问题2、自己实现深拷贝 二、深拷贝完整代码示例 一、深拷贝示例 1、浅拷贝问题 在上一篇博客 【C】深拷贝和浅拷贝 ③ ( 浅拷贝内存分析 ) 中 , 使用了浅拷贝 , 将 原始对象 Students 赋值给了 拷贝对象 Student s2 ; 使用 C 编译器 生成的 默…

Mysql的基本查询练习

目录 一、Create 1.1单行数据全列插入 1.2 多行数据指定列插入 1.3插入否则更新 1.4 替换 二、Retrieve 2.1全列查询 2.2指定列查询 2.3查询字段为表达式 2.4为查询结果指定别名 2.5 结果去重 2.6 where 条件 2.6 NULL的查询 2.7 结果排序 三、 Update 四、Dele…

电力系统直流潮流分析【N-1】(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

VHOST-SCSI代码分析(0)VHOST概述

与VIRTIO框架相比,VHOST将设备放到HOST上,让Guest和Host Kernal Space之间共享virtqueue,减少Exception Level切换。 对于数据的传递,依次经历:Guest UserSpace(EL0)-> Guest KernelSpace&am…

MySQL索引,事务及存储引擎

目录 MySQL索引 创建索引的依据: 索引的类型 普通索引 唯一索引 主键索引 组合索引 全文索引 查看索引 删除索引 事务 事务的 ACID 特性 原子性 一致性 隔离性 持久性 隔离级别 设置隔离级别 事务管理操作 自动提交事务 存储引擎 M…

GODIVA论文阅读

论文链接:GODIVA: Generating Open-DomaIn Videos from nAtural Descriptions 文章目录 摘要引言相关工作Video-to-video generationText-to-image generationText-to-video generation GODIVA方法逐帧视频自动编码器GODIVA视频生成器 实验数据集评价指标自动评估指…

QT基础教程(对话框1)

文章目录 前言一、对话框概念二、模态对话框三、非模态对话框总结 前言 本篇文章我们来讲解QT中的对话框。 资料合集地微信公众号:优质程序猿一、对话框概念 在Qt中,对话框(Dialog)是一种用于与用户进行交互、收集输入或展示信…

适用于 Android 的 Windows 子系统™️发行说明

🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 内部版本 2304.40000.3.0 内部版本 2303.40000.3.0 内部版本 2302.4000 内部版本 2301.40000.4.0 内部版本 221…

【wxWidgets 如何实现wxAccordion 手风琴组件】

1. 简要说明 wxWidgets 并没有提供wxAccordion 手风琴组件面板, 网上也基本没有找到资料,CSDN有个标题:wxAccordion:wxWidgets的手风琴控件下载链接,再无资料可查, 但是其他语言是提供了手风琴面板组件的, 那么怎么办呢,开干喽… 2. 效果展示 3. 交流探讨 代码就暂时不发了,…

【LeetCode-简单题】225. 用队列实现栈

文章目录 题目方法一:单个队列实现 题目 方法一:单个队列实现 入栈 和入队正常进行出栈的元素其实就是队列的尾部元素,所以直接将尾部元素弹出即可,其实就可以将除了最后一个元素的其他元素出队再加入队,然后弹出队首元…

第二章 进程与线程 八、处理机调度(时机切换、过程调度方式)

一、进程调度的时机 二、进程调度的方式 1、非剥夺调度方式: 非剥夺调度方式,又称非抢占方式。即只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻…