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

在这里插入图片描述

阅读导航

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

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

相关文章

3. MongoDB高级进阶

3. MongoDB高级进阶 3.1. MongoDB的复制集 3.1.1. 复制集及原理 MongoDB复制集的主要意义在于实现服务高可用 复制集的现实依赖于两个方面的功能: 数据写入时将数据迅速复制到另一个独立节点上在接受写入的节点发生故障时自动选举出一个新的替代节点 复制集在实现高可用的…

抽象类和接口

目录 抽象类 接口 基本概念 多接口使用 为什么接口解决了Java的多继承问题? 接口的继承 克隆 Clonable接口 拷贝 Object类 抽象类 1.使用abstract修饰的方法称为抽象方法 2.使用abstract修饰的类称为抽象类 3.抽象类不可以被实例化 e.g.Shape shape ne…

计算机毕业设计 基于SSM+Vue的农业信息管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

Docker概念通讲

目录 什么是Docker? Docker的应用场景有哪些? Docker的优点有哪些? Docker与虚拟机的区别是什么? Docker的三大核心是什么? 如何快速安装Docker? 如何修改Docker的存储位置? Docker镜像常…

shell脚本学习教程(一)

shell脚本学习 一、什么是 Shell?1. shell概述2. Shell 的分类3. 第一个shell脚本4. 多命令执行 二、Shell 变量3.1 变量的命名规则3.2 变量的特殊符号3.3 用户自定义变量3.4 环境变量3.5 位置参数变量3.6 预定义变量3.7 接受键盘输入 三、Shell 运算符3.1 算术运算…

解决 SQLyog 连接 MySQL8.0+ 报错:错误号码2058

文章目录 一、问题现象二、原因分析三、解决方案1. 方案1:更新SQLyog版本2. 方案2:修改用户的授权插件3. 方案3:修复my.cnf 或 my.ini配置文件 四、最后总结 本文将总结如何解决 SQLyog 连接 MySQL8.0 时报错:错误号码2058 一、问…

管理类联考——数学——汇总篇——知识点突破——代数——等差数列——最值

等差数列 S n S_n Sn​的最值问题 1.等差数列前n项和 S n S_n Sn​有最值的条件 &#xff08;1&#xff09;若 a 1 < 0 &#xff0c; d > 0 a_1<0&#xff0c;d>0 a1​<0&#xff0c;d>0时&#xff0c; S n S_n Sn​有最小值。 &#xff08;2&#xff09;若…

Linux网络基础

一.协议的概念 1.1协议的概念 什么是协议 从应用的角度出发&#xff0c;协议可理解为“规则”&#xff0c;是数据传输和数据的解释的规则。假设&#xff0c;A、B双方欲传输文件。规定: 第一次&#xff0c;传输文件名&#xff0c;接收方接收到文件名&#xff0c;应答OK给传输方…

LeetCode(力扣)134. 加油站Python

LeetCode134. 加油站 题目链接代码 题目链接 https://leetcode.cn/problems/gas-station/description/ 代码 class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:cursum 0minfuel float(inf)for i in range(len(gas)):rest gas[i…

[EI复现】基于主从博弈的新型城镇配电系统产消者竞价策略(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

数据库连接工具Chat2DB介绍

1、Chat2DB介绍 Chat2DB 是一款有开源免费的多数据库客户端工具&#xff0c;支持windows、mac本地安装&#xff0c;也支持服务器端部署&#xff0c;web网页访问。和传统的数据库客户端软件Navicat、DBeaver 相比Chat2DB集成了AIGC的能力&#xff0c;能够将自然语言转换为SQL&a…

vue+element-ui el-descriptions 详情渲染组件二次封装(Vue项目)

目录 1、需求 2.想要的效果就是由图一变成图二 ​编辑 3.组件集成了以下功能 4.参数配置 示例代码 参数说明 5,组件 6.页面使用 1、需求 一般后台管理系统&#xff0c;通常页面都有增删改查&#xff1b;而查不外乎就是渲染新增/修改的数据&#xff08;由输入框变成输…

安卓恶意应用识别(三)(批量反编译与属性值提取)

前言 上篇说到对安卓APK反编译&#xff0c;本篇实现批量反编译和批量特征提取及计算&#xff0c;主要就是通过python代码与cmd进行批量化交互&#xff0c;我在写文章之前&#xff0c;尝试批量下载了安卓apk&#xff08;大约10来个&#xff09;&#xff0c;发现现在这个应用软件…

腾讯mini项目-【指标监控服务重构】2023-08-23

今日已办 进度和问题汇总 请求合并 feature/venus tracefeature/venus metricfeature/profile-otel-baserunner-stylebugfix/profile-logger-Syncfeature/profile_otelclient_enable_config 完成otel 开关 trace-采样metrice-reader 已经都在各自服务器运行&#xff0c;并接入…

SmartSQL 一款开源的数据库文档管理工具

建议直接蓝奏云下载安装 蓝奏云下载&#xff1a;https://wwoc.lanzoum.com/b04dpvcxe 蓝奏云密码&#xff1a;123 项目介绍 SmartSQL 是一款方便、快捷的数据库文档查询、导出工具&#xff01;从最初仅支持 数据库、CHM文档格式开始&#xff0c;通过不断地探索开发、集思广…

【C刷题】day2

一、选择题 1、以下程序段的输出结果是&#xff08; &#xff09; #include<stdio.h> int main() { char s[] "\\123456\123456\t"; printf("%d\n", strlen(s)); return 0; } A: 12 B: 13 C: 16 D: 以上都不对【答案】&#xff1a; A 【解析】…

springboot和vue:二、springboot特点介绍+热部署热更新

springboot特点介绍 能够使用内嵌的Tomcat、Jetty服务器&#xff0c;不需要部署war文件。提供定制化的启动器Starters&#xff0c;简化Maven配置&#xff0c;开箱即用。纯Java配置&#xff0c;没有代码生成&#xff0c;也不需要XML配置。提供了生产级的服务监控方案&#xff0…

Linux Day15:线程安全

一、线程安全方法 线程安全即就是在多线程运行的时候&#xff0c;不论线程的调度顺序怎样&#xff0c;最终的结果都是 一样的、正确的。那么就说这些线程是安全的。 要保证线程安全需要做到&#xff1a; 1&#xff09; 对线程同步&#xff0c;保证同一时刻只有一个线程访问临…

Spring 的注入

目录 一、注入&#xff08;Injection&#xff09; 1、什么是注入 &#xff08;1&#xff09;为什么需要注入 &#xff08;2&#xff09;如何进行注入 2、Spring 注入原理分析&#xff08;简易版&#xff09; 二、Set 注入详解 1、JDK 内置类型 &#xff08;1&#xff09…

CountDownLatch 使用例子和代码流程

目录 CountDownLatch意思理解普通多线程运行Thread.join()实现CountDownLatch实现CountDownLatch流程new CountDownLatch(3)countDown 方法await方法 CountDownLatch意思理解 单词1: countdown 常见释义: 英[ˈkaʊntdaʊn] 美[ˈkaʊntdaʊn] n. 倒数读秒&#xff0c;倒计时(…