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

在这里插入图片描述

阅读导航

  • 前言
  • 一、内存空间分布
  • 二、什么是进程地址空间
    • 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.rhkb.cn/news/137249.html

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

相关文章

Godot配置C#语言编写脚本(使用VSCode作为外部编辑器)

文章目录 Godot部分查看VSCode的所在位置配置外部编辑器 配置VSCode编写脚本中文注释 其他文章字符编码 Godot部分 打开编辑器-编辑器设置; 查看VSCode的所在位置 右键单击你的VScode快捷方式,选择属性。 这里的目标就是你的VSCode所在的位置。 配…

安防监控/视频汇聚/云存储/AI智能视频分析平台EasyCVR下级海康设备无法级联是什么原因?

安防视频监控平台/视频集中存储/云存储/磁盘阵列EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。 有用户反馈&…

初学phar反序列化

以下内容参考大佬博客:PHP Phar反序列化浅学习 - 跳跳糖 首先了解phar是什么东东 Phar是PHP的压缩文档,是PHP中类似于JAR的一种打包文件。它可以把多个文件存放至同一个文件中,无需解压,PHP就可以进行访问并执行内部语句。 默认开…

深度解剖数据在队列的应用

> 作者简介:დ旧言~,目前大一,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 望小伙伴们点赞👍收藏✨加关注哟💕&#x1…

Linux磁盘管理:最佳实践

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

计算机视觉与深度学习-图像分割-视觉识别任务02-目标检测-【北邮鲁鹏】

目录标题 参考目标检测定义深度学习对目标检测的作用单目标检测多任务框架多任务损失预训练模型姿态估计 多目标检测问题滑动窗口(Sliding Window)滑动窗口缺点 AdaBoost(Adaptive Boosting)参考 区域建议 selective search 思想慢…

6.1 使用scikit-learn构建模型

6.1 使用scikit-learn构建模型 6.1.1 使用sklearn转换器处理数据6.1.2 将数据集划分为训练集和测试集6.1.3 使用sklearn转换器进行数据预处理与降维1、数据预处理2、PCA降维算法 代码 scikit-learn(简称sklearn)库整合了多种机器学习算法,可以…

Pytorch学习:torch.max(input,dim,keepdim=False)

文章目录 torch.max()dimkeepdimdim0dim1 out:返回命名元组 (values, indices) torch.max() torch.max(input) → Tensor:返回 input 张量中所有元素的最大值。 注意输入的必须是张量形式,输出的也为张量形式 当输入为tuple类型时&#xf…

《动手学深度学习》(pytorch版+mxnet版)2023最新

我又来推书了,这次分享的这本书可是重量级,目前已经被55个国家300所大学用于教学,同时受到了学术界与工业界的强烈推荐。 这本书就是李沐、阿斯顿张、立顿、斯莫拉四位大佬联合编写的《动手学深度学习》。本书面向中文读者,能运行…

进阶指针(一)

✨博客主页:小钱编程成长记 🎈博客专栏:进阶C语言 进阶指针(一) 0.回顾初阶指针1.字符指针1.1 相关面试题 2.数组指针3.指针数组3.1 数组指针的定义3.2 &数组名VS数组名3.3 数组指针的使用 4.数组传参和指针传参4.…

[Linux入门]---yum软件安装及vim编辑器配置

文章目录 1.Linux软件安装包2.如何安装软件注意事项下载rzsz查看rzsz软件包安装or卸载软件原理 3.简单配置配置文件常用配置选项(测试)使用插件使用链接配置 1.Linux软件安装包 Linux的三种软件安装方法: ①源代码安装。 在Linux系统下载程序…

AI 时代的向量数据库、关系型数据库与 Serverless 技术丨TiDB Hackathon 2023 随想

TiDB Hackathon 2023 刚刚结束,我仔细地审阅了所有的项目。 在并未强调项目必须使用人工智能(AI)相关技术的情况下,引人注目的项目几乎一致地都使用了 AI 来构建自己的应用。 大规模语言模型(LLM)的问世使得…

linux内核——进程

Processes and threads 进程是正在运行的程序,包括下列部分的抽象: (独立的)地址空间一个或者多个线程打开的文件(以描述符fd的形式呈现)套接字信号量Semaphore共享的内存区域定时器信号句柄signal handl…

avi怎么转换成视频?

avi怎么转换成视频?在我们日常使用的视频格式中,AVI是一种常见且经常被使用的音频视频交叉格式之一。它的优点之一是占用的存储空间相对较小,但也明显存在着画质损失的缺点。虽然AVI格式的视频在某种程度上也很常见,但与最常见的M…

缓存之缓存简介

目录 一.缓存的作用二.缓存的使用1.适用缓存的数据场景2.读取缓存流程图 三.本地缓存和分布式缓存 一.缓存的作用 Java缓存技术是在应用程序和数据库之间的一种中间层,用于存储暂时性数据,尤其是读取频繁但更新较少的数据。它的作用是减轻应用程序和数据库之间的负担,提高应用程…

PyCharm安装教程,新手详细

首先进入官网:https://www.jetbrains.com/pycharm/download/?sectionwindows#sectionwindows 然后选择版本,我下载的是社区版,一般学习是够了 然后点击Download进行下载。 双击exe运行 然后选择安装路径,建议放在D盘 然后这…

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…

Qt---day4---9.20

qt完成时钟&#xff1a; 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include <QtDebug> #include <QPainter> #include <QTimerEvent> #include <QTime>QT_BEGIN_NAMESPACE names…

wpf资源Resources探究性学习(一)

测试环境&#xff1a; vistual studio 2017 .net framework 3.5 window 10 新建WPF应用(.net framework)&#xff0c;项目名称为&#xff1a;WpfDemo&#xff0c;如下图&#xff1a; 新建完项目后&#xff0c;默认带有一个名为MainWindow.xaml的代码 一 简单使用字符串资源…

OpenCV实现“蓝线挑战“特效

原理 算法原理可以分为三个流程&#xff1a; 1、将视频&#xff08;图像&#xff09;从&#xff08;顶->底&#xff09;或&#xff08;左->右&#xff09;逐行&#xff08;列&#xff09;扫描图像。 2、将扫描完成的行&#xff08;列&#xff09;像素重新生成定格图像…