程序地址空间

news2024/11/15 10:40:30

目录

1. 验证程序地址空间布局图

2. 虚拟地址空间

 什么是虚拟地址空间

3. 进程地址空间 

4. 为什么要有虚拟地址空间 

1. 有效保护物理内存

2. 使内存管理模块和进程管理模块实现解耦合 

3. 将内存分布有序化 

1. 验证程序地址空间布局图

 下面我们写段代码验证一下上图中的各数据地址什么从低到高,以及堆栈地址相对增长:

运行验证:

根据运行结果,我们可以知道我们的布局图是正确的!

2. 虚拟地址空间

先演示一段代码看结果:

 

从结果上可以发现:父进程,子进程的 g_val 的地址相同,值却不同,这不是很矛盾吗? 

我们从中得出以下结论:

  • 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量
  • 但地址值是一样的,说明,该地址绝对不是物理内存地址!
  • Linux地址下,这种地址叫做 虚拟地址(线性地址).
  • 我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理。OS必须负责将 虚拟地址 转化成 物理地址 。

 什么是虚拟地址空间

地址空间是一种内核数据结构它里面至少要有:各个区域的划分:

 每个进程都会创建一个独属于自己的虚拟地址空间和页表页表将虚拟地址与物理内存地址建立联系(映射关系)只要保证每一个进程的页表映射的是物理内存的不同区域,就能做到进程间互不干扰,实现进程的独立性。

3. 进程地址空间 

        所以之前说‘ 程序的地址空间 是不准确的,准确的应该说成 “进程地址空间” ,那该如何理解呢?看图:

 现在,我们就可以根据这张图很好的解释第2点演示代码中 g_val 地址相同值却不同的原因了。

解释:子进程以父进程为模板,所以子进程内虚拟地址空间的 g_val 的虚拟地址是一样的,映射在物理内存中的位置也一样但是!当子进程修改g_val值时,会发生写时拷贝,即子进程修改g_val值时,页表会把物理内存中g_val的地址映射到不同于父进程中g_val地址的新地址(如上图所示)因此,演示代码中g_val地址相同是指虚拟地址相同,值不同其实是因为被映射到了不同的物理地址!

4. 为什么要有虚拟地址空间 

1. 有效保护物理内存

因为地址空间和页表是OS创建并维护的,也就意味着想使用地址空间好页表进行映射就必须在OS监管下进行当有非法访问或者映射时,OS会识别并终止这个进程,这样就很好的保护了物理内存中所有的合法数据,包括各个进程,以及内核的相关有效数据。

2. 使内存管理模块和进程管理模块实现解耦合 

因为有地址空间和页表的映射关系存在,在物理内存中,我们可以对未来的数据进行任意位置的加载!物理内存的分配和进程的管理就可以做到没有关系!从而实现 进程管理模块 和 内存管理模块的解耦合。

Tip:

        实际上,因为有地址空间的存在,所以上层用户申请空间,实际上是申请地址空间,物理内存甚至可以一个字节都不分配!而当你真正对物理内存进行访问的时候,OS才会执行内存的相关管理算法,帮你申请内存,构建页表映射关系,然后才让你进行内存的访问。这种延时分配的策略可以提高整机的效率,使内存的有效使用几乎是100%的!

3. 将内存分布有序化 

因为在物理内存中理论上可以在任意位置进行加载,因此物理内存中几乎所有的数据和代码在物理内存中都是乱序的。但是!因为页表的存在,可以将地址空间上的虚拟地址和物理地址进行映射,那么在进程视角,所有的内存分布,都可以是有序的!

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

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

相关文章

qt调用matlab生成的dll库

最近由于在项目中要用到matlab的算法,而用C转换matlab算法非常麻烦,所以采用qtmatlab混合编程的方法,在使用中遇到了些许问题,特记录如下。 一、生成matlab库 1、首先需要下载matlab完整版,之前在网上下载的简版&…

基于C#制作一个休息提醒闹钟

> 此文主要通过WinForm来制作一个休息提醒闹钟,通过设置时间间隔进行提醒,避免沉浸式的投入到工作或者学习当中,战斗的同时也要照顾好自己。 实现流程1.1、创建项目1.2、时间间隔配置页1.3、闹钟提醒页1.4、开机自启动配置1.5、日志记录1.…

一个数据库文档生成神器

Gitee项目地址,可以直接去开源项目查看(推荐) 简介 在企业级开发中、我们经常会有编写数据库表结构文档的时间付出,从业以来,待过几家企业,关于数据库表结构文档状态:要么没有、要么有、但都是…

MySql 5.7.40备份到腾讯云cos+从cos恢复

1 备份 1.1 安装coscli # wget https://github.com/tencentyun/coscli/releases/download/v0.12.0-beta/coscli-linux # mv coscli-linux /usr/bin/coscli # chmod 755 /usr/bin/coscli # coscli --version如果github慢可以使用国内镜像: wget https://cosbrowse…

数电相关知识

文章目录 逻辑电路与或非异或 门电路与的物理电路电压比较器D型锁存器优先编码器边沿触发器RS触发器施密特触发器基本原理555定时器数电电平TTL器件CMOS器件逻辑电路 与或非异或 门电路 与乘大于1或加大于1异或异性为1,异吗? 与的物理电路

Leetcode:17. 电话号码的字母组合(C++)

目录 问题描述: 实现代码与解析: 回溯: 原理思路: 问题描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&…

【数据库】必须知道的MySQL优化

文章目录SQL语言有哪几部分组成为什么要进行MySQL优化?优化方法有哪些?SQL层面优化MySQL配置方面架构设计方面硬件和操作系统方面.SQL语言有哪几部分组成 数据定义语言,简称DDL:DROP,CREATE,ALTER等语句。数据操作语言&#xff0…

【Java|golang】2299. 强密码检验器 II

如果一个密码满足以下所有条件,我们称它是一个 强 密码: 它有至少 8 个字符。 至少包含 一个小写英文 字母。 至少包含 一个大写英文 字母。 至少包含 一个数字 。 至少包含 一个特殊字符 。特殊字符为:“!#$%^&*()-” 中的一个。 它 不…

VMware 安装 OpenWrt 旁路由并配置 PassWall

准备 OpenWrt 镜像包,本例使用的是在恩山论坛上面下载的https://www.right.com.cn/forum/thread-8271618-1-1.html网络选择 NAT 模式创建虚拟机一直下一步至一直下一步至,这里选择 NAT 方式一直下一步至,这里选择“使用现在虚拟磁盘”&#x…

高并发系统设计 -- 粉丝关注列表如何设计

粉丝关注列表如何设计和落地 业务场景 上图我们简称relation页。relation页展示用户的关系相关信息,包含两个子页面: follower页,展示关注该用户的所有用户信息。attention页,展示该用户关注的所有用户信息 主要操作 用户可以…

数论之欧拉筛法(含朴素筛选、埃式筛选详细代码)

文章目录前言朴素筛法(纯暴力,O(n^2^))埃式筛法(找出合数来确认质数, O(n*log(logn)))欧拉筛法(线性筛选,O(n))参考文章前言 在学习Acwing c蓝桥杯辅导课第八讲数论-1295. X的因子链…

Linux常用命令——tcpdump命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) tcpdump 一款sniffer工具,是Linux上的抓包工具,嗅探器。 补充说明 tcpdump命令是一款抓包,嗅探器工具,它可以打印所有经过网络接口的数据包的头信息,…

【MySQL】CentOS7 卸载以及安装 MySQL 详细流程

一、卸载 MySQL 查看 MySQL 安装版本 mysqladmin --version通过 rpm 查找 MySQL rpm -qa|grep -i mysql查看 MySQL 运行状态 systemctl status mysqld.service关闭 MySQL 服务 systemctl stop mysqld.service通过 yum remove 删除 MySQL 安装包 把上面所有的安装包挨个删除…

用友U8和旺店通·企业奇门单据接口对接

对接系统旺店通企业奇门旺店通是北京掌上先机网络科技有限公司旗下品牌,国内的零售云服务提供商,基于云计算SaaS服务模式,以体系化解决方案,助力零售企业数字化智能化管理升级。为零售电商企业的订单管理及仓储管理提供解决方案&a…

Java寒假作业——编程题

二、编程题(ACM模式)1-2题1 (2022蚂蚁金服)一个字母可以拆分成两个字母表顺序的前一个字母,例如,b可以拆分成aa,c可以拆分成bb。打印出最短的可以拆分成 K 个 a 的字符串,字母顺序无…

Spring的三种装配机制(XML、JavaConfig、自动装配)

Spring中bean有三种装配机制一、在xml中显示装配二、 在java中显式装配&#xff0c;都需要在Config配置类重写三、自动装配1. xml方式自动装配2. 使用注解装配等于依赖关系注入&#xff0c;即一个Bean作为属性&#xff0c;装配到另一个Bean。 一、在xml中显示装配 <!--1. …

GCC是什么

GCC是什么 说到 GCC&#xff0c;就不得不提 GNU&#xff0c;“GNU”是“GNUs Not Unix!”&#xff08;GNU并非Unix&#xff01;&#xff09;的首字母递归缩写&#xff0c;中文名“革奴计划”。GNU 计划的最终目标是打造出一套完全自由&#xff08;即自由使用、自由更改、自由发…

Java基础之《netty(28)—TCP粘包拆包原理》

一、基本介绍 1、TCP是面向连接的&#xff0c;面向流的&#xff0c;提供高可靠性服务。收发两端&#xff08;客户端和服务器端&#xff09;都要有一一成对的socket&#xff0c;因此&#xff0c;发送端为了将多个发给接收端的包&#xff0c;更有效的发给对方&#xff0c;使用了…

C++语法复习笔记-第6章 c++指针

文章目录1. 计算机内存1. 储存层次2. 内存单元与地址3. 指针定义2. 左值与右值1. 数组与指针1. 概念3. C中的原始指针1. 数组指针与指针数组2. const pointer 与 pointer to const3. 指向指针的指针4.关于野指针4.1 指向指针的指针4.2 NULL指针4.3 野指针5. 指针的基本运算5.1 …

MySQL 批量插入

文章目录MySQL批量插入10w条数据创建表创建函数创建存储过程调用存储过程MySQL批量插入10w条数据 创建表 创建emp&#xff08;部门&#xff09;表 创建dept&#xff08;员工&#xff09;表 创建函数 创建rand_num函数&#xff0c;随机生成部门编号&#xff0c;保证部门编…