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. 写实拷贝的方式也能够提高我们内存申请的速度,虽然在总的时间上与申请开辟一体化的耗时相同,但单独对于申请的速度是有明显提升的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云计算探索-如何在服务器上配置RAID(附模拟器)

一&#xff0c;引言 RAID&#xff08;Redundant Array of Independent Disks&#xff09;是一种将多个物理硬盘组合成一个逻辑单元的技术&#xff0c;旨在提升数据存取速度、增大存储容量以及提高数据可靠性。在服务器环境中配置RAID尤其重要&#xff0c;它不仅能够应对高并发访…

力扣Lc25--- 821. 字符的最短距离(java版)-2024年3月31日

1.题目描述 2.知识点 从左向右遍历&#xff1a; 这一遍历可以帮助我们找到每个位置到其左边最近的目标字符的距离。 从右向左遍历&#xff1a; 这一遍历可以帮助我们找到每个位置到其右边最近的目标字符的距离&#xff0c;并将这个距离与之前从左向右遍历得到的距离进行比较&…

腾讯云轻量2核2G3M云服务器优惠价格61元一年,配置详解

腾讯云轻量2核2G3M云服务器优惠价格61元一年&#xff0c;配置为轻量2核2G、3M带宽、200GB月流量、40GB SSD盘&#xff0c;腾讯云优惠活动 yunfuwuqiba.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云轻量2核2G云服务器优惠价格 腾讯云&#xff1a;轻量应用服务器100%CPU性能…

Linux速览(2)——环境基础开发工具篇(其一)

本章我们来介绍一些linux的常用工具 目录 一. Linux 软件包管理器 yum 1.什么是软件包? 2. 查看软件包 3. 如何安装软件 4. 如何卸载软件 5.yum补充 6. 关于 rzsz 二. Linux编辑器-vim使用 1. vim的基本概念 2. vim的基本操作 3. vim正常模式命令集 4. vim末行模式…

【核弹级软安全事件】XZ Utils库中发现秘密后门,影响主要Linux发行版,软件供应链安全大事件

Red Hat 发布了一份“紧急安全警报”&#xff0c;警告称两款流行的数据压缩库XZ Utils&#xff08;先前称为LZMA Utils&#xff09;的两个版本已被植入恶意代码后门&#xff0c;这些代码旨在允许未授权的远程访问。 此次软件供应链攻击被追踪为CVE-2024-3094&#xff0c;其CVS…

数据结构——二叉树——堆

前言&#xff1a; 在前面我们已经学习了数据结构的基础操作&#xff1a;顺序表和链表及其相关内容&#xff0c;今天我们来学一点有些难度的知识——数据结构中的二叉树&#xff0c;今天我们先来学习二叉树中堆的知识&#xff0c;这部分内容还是非常有意思的&#xff0c;下面我们…

docker-compose命令管理docker命令集合

Docker-Compose 简介 Docker-Compose 项目是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Docker-Compose 项目由 Python 编写&#xff0c;调用 Docker 服务提供的API来对容器进行管理。因此&#xff0c;只要所操作的平台支持 Docker API&#xff…

zookeeper如何管理客户端与服务端之间的链接?(zookeeper sessions)

zookeeper客户端与服务端之间的链接用zookeeper session表示。 zookeeper session有三个状态&#xff1a; CONNECTING, ASSOCIATING, CONNECTED, CONNECTEDREADONLY, CLOSED, AUTH_FAILED, NOT_CONNECTED&#xff08;start时的状态&#xff09; 1、CONNECTING 。 表明客户…

期货学习笔记-MACD指标学习1

MACD常规参数与优化参数降低容错率的使用技巧 MACD的基本概念及组成 概念 MACD是杰拉德 阿佩尔于1979年提出的&#xff0c;利用收盘价的短期&#xff08;常用为12日&#xff09;指数移动平均线与长期&#xff08;常用为26日&#xff09;指数移动平均线之间的聚合与分离情况&a…

【Gd2O3】Gd2O3栅极电介质增强GaN器件的可靠性

【Effects of Gd2O3 Gate Dielectric on Proton-Irradiated AlGaN/GaN HEMTs】 概括总结&#xff1a; 该研究探讨了质子辐射对使用Gd2O3作为栅极电介质的AlGaN/GaN高电子迁移率晶体管&#xff08;HEMTs&#xff09;的影响。通过对比肖特基栅极HEMTs和MOS-HEMTs在2 MeV质子辐射…

基础布局之LinearLayout线性布局

目录 一、基础属性二、重点属性2.1 weight(权重)属性&#xff1a;2.2 gravity 一、基础属性 LinearLayout默认方向是水平排放 属性作用android:id控件的ID&#xff0c;可以通过这个ID号来找到对应的控件android:layout_width控件的宽度android:layout_height控件的高度androi…

HarmonyOS实战开发-switch、chart组件的使用

介绍 本篇Codelab基于switch组件和chart组件&#xff0c;实现线形图、占比图、柱状图&#xff0c;并通过switch切换chart组件数据的动静态显示。要求实现以下功能&#xff1a; 实现静态数据可视化图表。打开开关&#xff0c;实现静态图切换为动态可视化图表。 相关概念 swit…

浅谈WPF之路由事件

为了降低由事件订阅带来的耦合度&#xff0c;和代码量&#xff0c;WPF推出了路由事件机制。路由事件与直接事件的区别在于&#xff0c;直接事件激发时&#xff0c;发送者直接将消息通过事件订阅者交给事件响应者&#xff0c;事件响应者对事件的发生做出响应。路由事件的订阅者和…

pnpm比npm、yarn好在哪里?

前言 pnpm对比npm/yarn的优点&#xff1a; 更快速的依赖下载更高效的利用磁盘空间更优秀的依赖管理 我们按照包管理工具的发展历史&#xff0c;从 npm2 开始讲起&#xff1a; npm2 使用早期的npm1/2安装依赖&#xff0c;node_modules文件会以递归的形式呈现&#xff0c;严格…

简单了解波 Mono-repo Multi-repo(Poly-repo)

Mono-repo 和 Multi-repo 是软件开发中代码管理的两个不同策略。Mono-repo & Multi-repo 孰优孰劣是个老生常谈得话题了&#xff0c;这里就不 PK 了&#xff0c;“略微”看下两者区别。 当我们使用 Git 作为版本控制系统管理项目的代码时&#xff0c;那么 monorepo 与 mul…

模拟游戏《幸福工厂》好玩吗?《幸福工厂》怎么在mac电脑上打开?

关于《幸福工厂》这款游戏是否好玩&#xff0c;普遍的玩家反馈和评价表明&#xff0c;《幸福工厂》&#xff08;Satisfactory&#xff09;因其深度的工厂建造模拟、自由度极高的探索以及精美的图形表现而受到许多玩家的喜爱。它允许玩家在一个开放的世界中规划并建立复杂的生产…

02-JDK新特性-Lambda表达式

JDK新特性 Lambda表达式 什么是Lambda表达式 Lambda表达式是一个匿名代码块&#xff0c;用于简单的传递一段代码片段。 Lambda表达式标准格式 格式&#xff1a;(形式参数) -> {代码块} 形式参数 如果有多个参数&#xff0c;参数只见用逗号隔开&#xff1b;如果没有&…

leetcode90. 子集 II

去重逻辑&#xff1a; 关键是画出递归树&#xff01;当我们即将进入第二个2的递归的时候&#xff0c;发现isVisit数组是100&#xff0c;也就是说这俩重复的数是False&#xff0c;并且这俩在nums值相同&#xff0c;所以写出去重逻辑&#xff01; class Solution { public:vector…

Mock.js的基本使用

mock顾名思义&#xff0c;就是模拟的意思&#xff0c;它模拟什么呢&#xff1f;假设我们在开发的过程中&#xff0c;我们需要使用到接口&#xff0c;但是后端接口并没有完善&#xff0c;那么我们就可以使用到mock.js&#xff0c;它可以随机生成数据&#xff0c;拦截AJAX请求&am…

mysql执行脚本导入表和数据后中文注释乱码解决

本人在使用不同版本下进行操作时&#xff0c;就会出现中文乱码的问题。例如我本地安装mysql8&#xff0c;服务器安装的是mysql5&#xff0c;然后本地连接服务器的mysql后&#xff0c;执行SQL脚本之后发现中文全部乱码 使用工具查看&#xff0c;注释也都是乱码 解决方案 本地…