当前位置: 首页 > news >正文

虚拟地址空间

一  C C++内存空间布局验证

  •  下图的结果符合第一个图的结构,而且我们可以发现堆向上增长,栈向下增长,堆栈相对而生,且第一个图不叫物理内存,叫进程地址空间 

二  虚拟地址的引出

  •  我们可以看到fork之后数据共享

 

  •   当我们修改子进程的gval,我们可以发现子进程的gval一直在改变,而父进程的gval不变,可以验证独立性,但是我们观察到他们的gval的地址是一样的,但是值不一样(虽然我们并不知道这个地址是怎么回事,但是我可以100%肯定,这个地址不是物理内存地址,我们把它叫做虚拟地址
  • 我们在c/c++所学的都是虚拟地址,物理内存地址我们看不见

三 虚拟地址空间和物理内存的关系 

虚拟地址空间的栈的上层还有一个内核空间和命令行参数环境变量,我们把除了内核空间的地址叫做用户空间,程序员可以直接用地址来进行访问,而访问内核空间必须要用系统调用

数据共享的原理

  • 子进程会以父进程位模板创建tash_struct,拷贝虚拟地址内存,和页表(浅拷贝,所以指向的地址是一样的)通过页表指向同一个物理空间,所以数据是共享的

四 独立性的原理

  • 一旦子进程开始要更改数据,操作系统就会在物理内存中重新开辟空间,拷贝内容 ,更改映射关系(这个操作叫做写时拷贝),做这些操作的时候虚拟地址不会改变,造成它的地址不同内容却不一样,而进程 = 内核数据结构(task_struct, mm_struct, 页表)+ 进程的代码和数据,内核数据结构是独立的,进程的代码是只读的(页表中有一行会记录它的权限),数据再写入的时候会发生写实拷贝,所以进程是独立的。

(1) 回答为什么fork()返回会有两个

  • 任何一个变量都有地址(虚拟地址)当我们接受fork的返回值的时候本质是对id变量进行写入,这个时候会发生写时拷贝

五 如何理解空间划分

(1) 什么叫虚拟地址空间

举个例子

  • 有一个大富翁他有10个亿,和许多私生子(他们彼此之间并不知道),他告诉每一个私生子将来会继承它的10个亿,假设私生子找大富翁要一些生活费,大富翁一定会给,但是如果一次性要10个亿他一定不会给,所以大富翁对于私生子们是有求必应的,但是不会将他的全部财产都一次给他,每一个私生子都知道自己会有10个亿,私生子就是进程,大富翁就是操作系统,画的10个亿大饼就是虚拟地址

  • 当大富翁的私生子越来越多它的承诺就会越来越多,需要管理(先描述再组织),所以虚拟地址空间,是OS给进程们的承诺,本质一定是一个内核数据结构

 (2) 如何理解空间划分

例子:

  • 我们小时候都划过38线,假设我们将100cm的桌子划38线【0,49】归你自己,【50,99】归同桌,其实他的本质就是划分区域,所以什么就做区域 :其实只要有线性空间的一段开始地址和结束地址表明一段范围即可,所以虚拟地址空间里面一定有许多的start和end

  •  结论:虚拟地址空间,本质其实是一个结构体struct mm_struct

(3) 为什么可以拿到命令行参数和环境变量

  • 定义全局变量,全局有效,地址空间只要存在,那么全局数据区(初始化数据区)就要存在所以全局变量会一直存在,包括static静态变量
  • 字符串常量,其实和代码是编译在一起的,都是只读的。(因为代码就是只读的)这也就是字符常量区的数字不能改(字符常量区,被页表映射的时候,有权限约束,不让写入操作进行转换)const: 约束编译器,让编译器进行写入时候报错,如果不加会在运行时(报错,查页表发现权限不允许)
  • 命令行参数和环境变量属于父进程的地址空间内的数据资源,和代码区一样,子进程会继承父进程的地址空间,所以子进程也能看到命令行参数和环境变量
  • 为什么要有虚拟地址空间
  • 因为有了虚拟地址-》就必须转换成为物理地址(避免造成一个进程妨碍到另一个进程,不符合独立性)-》要访问内存,必须先转换(在你虚拟到物理内存转换的时候,进行安全审核)-》变相保证物理内存的安全,维护进程独立性特性
  • 我们的可执行程序,加载到物理内存,可以在物理内存的任意位置加载(理论上),造成十分无序的状态,但是因为有了虚拟地址空间,从操作系统的角度来看,进程看到自己的代码和数据都是有序的-》无序变有序
  • 创建一个进程的时候,先有内核数据结构,再有进程的代码和数据,可以一边执行,一边加载(这就是惰性加载)提高内存的效率
  • 进程管理和内存管理进行解耦合了。 

六 vm_area_struct

  • 以双链表组织,多了的话也可以以红黑树组织
  • 我们在上面区域划分就是一堆的开始start和end,但是像堆这种空间,我们会一段一段的申请,且每一段的地址都会不一样,这就要依靠vm_area_struct数据结构了
  • 源代码

http://www.dtcms.com/a/289519.html

相关文章:

  • rman清理归档
  • 2024年全国青少年信息素养大赛Scratch编程挑战赛 小低组初赛
  • 【JDK内置工具】常用工具和实战指令
  • 贝叶斯分类器的相关理论学习
  • 力扣面试150(34/150)
  • 人脸识别:AI 如何精准 “认人”?
  • Florence2-通用表征完成多种视觉任务的视觉基础模型
  • 最新轻量美化表白墙系统源码v2.0 带后台版 附搭建教程
  • 分治算法---归并
  • 智能制造——48页毕马威:汽车营销与研发数字化研究【附全文阅读】
  • Muduo库中单例模式详解
  • 【Anaconda】Conda 虚拟环境打包迁移教程
  • 基于ACPs协议的智能体互联网示例(多智能体旅游规划)
  • JMeter连接数据库
  • Linux操作系统从入门到实战(十一)回车换行问题与用户缓冲区问题
  • C++虚函数易错点整理
  • 20250720-4-Kubernetes 调度-指定节点调度:nodeSelectornodeAffinity笔记
  • LeetCode 3202.找出有效子序列的最大长度 II:取模性质(动态规划)
  • JDK8默认垃圾回收器
  • (Python)类和类的方法进阶(基础教程介绍)(Python基础教程)
  • 利用核壳生物支架调控纤维 - 成骨稳态【AbMole】
  • Linux:线程控制
  • 【网络编程】网络传输-JSON
  • 【C语言】字符串与字符函数详解(下)
  • Shell脚本-cut工具
  • 从零到一MCP快速入门实战【1】
  • 疯狂星期四第13天运营日报
  • Java拓扑排序:2115 从给定原材料中找到所有可以做出的菜
  • Linux 基本指令详解
  • Self-Consistency:跨学科一致性的理论与AI推理的可靠性基石