Linux学习:进程(4)程序地址空间(笔记)

目录

  • 1. Linux下各种资源的内存分布
  • 2. 物理地址与虚拟(线性)地址
  • 3. 程序地址空间的区域划分
  • 4. 地址映射与页表
  • 5. 缺页中断

1. Linux下各种资源的内存分布

在这里插入图片描述

2. 物理地址与虚拟(线性)地址

  1. 在有关进程创建的初步学习中,我们了解了fork函数创建子进程的方式。此种进程的创建方式使得同一个变量在不同的进程可以有不同的值,我们初步了解的原因,为子进程进行了写时拷贝,重新开辟了一块空间来存放值。
  2. 那么,既然是不同的地址空间,那么父子进程中的同名变量的地址一定是不同,可事实是这样我们,接下来我们进行相关验证。
int main()
{pid_t id = fork();int i = 0;if(id){i = 10;while(1){printf("this is father process i=%d,&i=%p\n", i, &i);                                                                                                                     sleep(2);}}else{i = 20;while(1){printf("this is children process i=%d,&i=%p\n", i, &i);sleep(2);}}return 0;
}

在这里插入图片描述

  1. 运行结果如上,父子进程中的同名变量居然是同一块地址空间,一块地址空间是绝对无法存储两个数据的,可为什么这里却又显示它们的地址空间相同呢。
  2. 事实上,我们使用取地址操作得到的地址并非是真实的物理地址,而是虚拟的程序地址空间中的地址。
  3. Linux操作系统中,会在真实物理地址空间与每个程序之间生成一块虚拟的地址空间,每一个程序都有一块独属于自己的程序虚拟地址空间。我们取地址操作所获得的资源地址,只是其在这块虚拟地址空间上的地址,这些虚拟地址只是真正物理地址在这块空间上的映射。

在这里插入图片描述

3. 程序地址空间的区域划分

  1. Linux32位操作系统下,程序地址空间的大小都为4GB,与指针的物理地址空间大小相同。
  2. 程序地址空间也是一种数据结构对象,操作系统对计算机软硬件资源的管理方式都是信息管理,先描述对应事物的信息,然后再将其组织起来。
  3. 程序地址空间的信息属性:
    <1> 程序地址空间要做到的就是模拟一份与物理地址空间大小相同的虚拟空间。
    <2> 其次要能够对整块区域进行区域划分,来区分存储不同程序资源。
    <3> 在这一过程中,也要能够做到对越界资源的检测。
//大致的数据结构
struct area
{int code_start;int code_end;int init_start;int init_end;int uninit_start;int uninit_end;//.......
}
  1. 通过如上此种数据结构,对数据越界的检测也就编程了对数据区域的比对,而扩大与缩小区域,也就变成了结构内成员数据的增大与缩小。
  2. 程序地址空间不具有数据存储的能力,数据是存储在物理内存中的。

4. 地址映射与页表

  1. 前面我们已经提及,虚拟地址只是物理地址映射,可是映射方式具体是什么呢,在实现上是怎么做从而达成了这一目的的呢。
  2. 在虚拟地址与物理地址之间有一张记录它们映射关系的记录表,我们称之为页表。
  3. 在程序被执行的过程中,CPU获取对应进程真实地址空间的方式,为通过MMU硬件模块中的CR3寄存器中记录的页表地址,以虚拟地址空间为key值从而直接通过页表找到映射的真实物理地址。

在这里插入图片描述

  1. 虚拟地址空间与地址映射存在的意义:
    <1> 使得原本因进程众多,切换调度而无序的物理地址空间变成了有序的虚拟地址空间,让所有进程都可以以统一的视角看待内存,大大提高了进程运行的效率。
    <2> 使得物理地址存储数据的实现与虚拟地址程序运行的实现区分开来,互不干涉,达到了方便设计与解耦合的效果。

5. 缺页中断

  1. 有了程序地址空间,我们再来了解一下动态空间管理的相关操作(malloc/new)。我们使用malloc/new申请款空间后,空间真的被开辟出来了吗?
  2. 当我们程序地址空间的堆区上申请了空间之后,物理空间上,我们所需的空间并不一定立刻会被开辟出来,在我们未对这段空间进行写入操作时,这段空间并不会被申请出来。只有在我们尝试进行写入时,操作系统才会为我们将这段空间真正开辟出来,并在页表中创建映射关系。
  3. 上述在对动态开辟空间进行写入的操作中,因为空间没有被指针开辟,页表上映射关系的缺失导致的操作短暂中断,我们称之为缺页中断。
  4. 操作系统为什么要进行这样写时拷贝的操作呢?操作系统是计算机资源的管理这,它为计算机的效率与资源使用率负责,如果在我们申请空间后,直接将进行开辟与权限开放,当我们只是申请而不使用的时候,就会浪费掉这块空间资源。操作系统为了杜绝防止这种资源浪费的风险,由此添加了写实拷贝的步骤。
  5. 写实拷贝的方式也能够提高我们内存申请的速度,虽然在总的时间上与申请开辟一体化的耗时相同,但单独对于申请的速度是有明显提升的。

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

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

相关文章

Spring Boot 一.基础和项目搭建(上)

之前也自学过SSM框架&#xff0c;Spring Boot框架&#xff0c;也动手写过几个项目&#xff0c;但是这是第一次完整的记录。从0开始&#xff0c;把一些细节整理了一下。 大概会分为十几小节&#xff0c;这是一个学习的过程&#xff0c;更是一个思考的过程&#xff0c;废话不多说…

金融汽车科技LLM

汇丰银行 众安保险 1. AIGC重塑保险价值链 小额高频 2.构建智能应用的技术方案演进 增加微服务 长记忆&#xff1a;向量库短记忆&#xff1a;对话历史&#xff0c;思考路径&#xff0c;执行历史 中台架构设计 蔚来汽车在大模型的应用实践 公司介绍 应用架构 应用实践 4.大…

Django框架之DRF(武沛齐全)

一、FBV和CBV FBV&#xff0c;function base views&#xff0c;其实就是编写函数来处理业务请求。 from django.contrib import admin from django.urls import path from app01 import views urlpatterns [path(users/, views.users), ] from django.http import JsonResp…

Java学习笔记NO.28

Java常用类 在Java编程中&#xff0c;有许多常用的类提供了丰富的功能和方法&#xff0c;帮助开发者更高效地完成各种任务。本文将介绍包装类、字符串相关类、日期时间类、Math类和枚举类&#xff0c;并提供相应的代码示例。 1. 包装类&#xff08;Wrapper Classes&#xff0…

快速排序---算法

1、算法概念 快速排序&#xff1a;通过一趟排序将待排记录分隔成独立的两部分&#xff0c;其中一部分记录的数据均比另一部分的数据小&#xff0c;则可分别对这两部分记录继续进行排序&#xff0c;以达到震哥哥序列有序。 快速排序的最坏运行情况是O()&#xff0c;比如说顺序数…

Java agent 使用

Java agent 使用 一、入口 public class ClassAgentApplication {public static void premain(String agentArgs, Instrumentation inst) {System.out.println("premain");}public static void agentmain(String agentArgs, Instrumentation inst){System.out.prin…

网络基础二补充——json与http协议

五、市面上常用序列化和反序列化工具 ​ 常用的有&#xff1a;json、protobuf、xml三种方案&#xff1b; 5.1json的使用 1.安装jsoncpp库&#xff0c;是一个第三方的开发库文件&#xff1b; sudo yum install -y jsoncpp-devel2.使用json ​ 经常使用的头文件是json.h&…

【uC/OS-III篇】uC/OS-III 创建第一个任务(For STM32)

uC/OS-III 创建第一个任务&#xff08;For STM32&#xff09; 日期&#xff1a;2024-3-30 23:55&#xff0c;结尾总结了今天学习的一些小收获 本博客对应的项目源码工程 源码项目工程 1. 首先定义错误码变量 // 用于使用uC/OS函数时返回错误码 OS_ERR err; 2. 定义任务控制…

Golang | Leetcode Golang题解之第2题两数相加

题目&#xff1a; 题解&#xff1a; func addTwoNumbers(l1, l2 *ListNode) (head *ListNode) {var tail *ListNodecarry : 0for l1 ! nil || l2 ! nil {n1, n2 : 0, 0if l1 ! nil {n1 l1.Vall1 l1.Next}if l2 ! nil {n2 l2.Vall2 l2.Next}sum : n1 n2 carrysum, carry …

leetcode350-Intersection of Two Arrays II

这道题目要求返回俩个数组的交集&#xff0c;且元素个数不再是唯一的&#xff0c;而是要和元素在两个数组中都出现的次数一致&#xff0c;如果元素在俩个数组中出现的次数不一样则取那个更小的。这道题目可以继续沿用上一道题目的思路&#xff0c;遍历第一个数组&#xff0c;用…

深入探索语言模型:原理、应用与评估

深入探索语言模型&#xff1a;原理、应用与评估 目录 深入探索语言模型&#xff1a;原理、应用与评估 一、 引言 二、语言模型原理 三、概率语言模型 四、 深度学习语言模型 五、 代码示例 六、 语言模型的评估 七、案例研究 一、 引言 在自然语言处理&#xff08;NL…

好用的编辑器Typora分享

好用的编辑器Typora分享 Typora是一个极简易风格的Markdown编辑器和阅读器&#xff0c;可以提供无缝的编辑和阅读体验。 一、下载和安装 Typora中文网&#xff1a;https://www.typora.net/ 可以下载安装试用版试用15天 如果需要永久使用&#xff0c;则需要安装带激活码的版…

力扣102. 二叉树的层序遍历(O(n)时间复杂度,通过queue实现简单BFS)

Problem: 102. 二叉树的层序遍历 思路 记录层次&#xff0c;要么建立树时记录&#xff0c;要么遍历时记录&#xff08;利用queue&#xff09; 解题方法 queue<pair<TreeNode*,int>>q; 记录节点及其层次 vector<vector> res; res[i]表示第i层(从0开始)的所有…

Github2024-03-31 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-31统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目6Jupyter Notebook项目3C项目1TypeScript项目1PHP项目1OpenDevin: 编写更少,实现更多 创建周期:14 天开发语言:Jupyter Notebook协…

npm 常用命令详解 详细

npm&#xff08;Node Package Manager&#xff09;是Node.js的包管理器&#xff0c;它允许JavaScript开发者分享和重用代码包&#xff0c;这样开发者就可以专注于自己的代码&#xff0c;而不必重新发明轮子。npm提供了大量的命令&#xff0c;用于安装、更新、删除和管理项目中的…

Vue ElementPlus Input输入框

Input 输入框 通过鼠标或键盘输入字符 input 为受控组件&#xff0c;它总会显示 Vue 绑定值。 通常情况下&#xff0c;应当处理 input 事件&#xff0c;并更新组件的绑定值&#xff08;或使用v-model&#xff09;。否则&#xff0c;输入框内显示的值将不会改变。不支持 v-mode…

【面试经典150 | 动态规划】最小路径和

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;动态规划方法二&#xff1a;空间优化 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题…

MCGS学习——水位控制

要求 插入一个水罐&#xff0c;液位最大值为37插入一个滑动输入器&#xff0c;用来调节水罐水位&#xff0c;滑动输入器最大调节为液位最大值&#xff0c;并能清楚的显示出液位情况用仪表显示水位变化情况&#xff0c;仪表最大显示设置直观清楚方便读数&#xff0c;主划线为小…

深入探索前端与后端数据交互:打造稳健、高效的数据通道

在软件开发中&#xff0c;前端与后端的数据交互不仅仅是简单的请求与响应过程&#xff0c;更是一个涉及多个层面、需要综合考虑多种因素的复杂系统。为了深入理解并优化这一过程&#xff0c;本文将从原理、常见的交互方法、技术选型、性能优化、安全性保障等方面展开详细探讨。…

设计模式-结构型-享元模式Flyweight

享元模式的特点&#xff1a; 享元模式可以共享相同的对象&#xff0c;避免创建过多的对象实例&#xff0c;从而节省内存资源 使用场景&#xff1a; 常用于需要创建大量相似的对象的情况 享元接口类 public interface Flyweight { void operate(String extrinsicState); } 享…