重庆哪些网站推广公司,四川网站建设多少钱,女生学动漫制作技术好就业吗,盐城网站建设hx1818目录 前言#xff1a; 地址空间回顾 验证#xff1a;一个变量是否会有两个值#xff1f; 
一. 什么是地址空间 
虚拟地址与物理地址之间的关系 
二. 地址空间是如何设计的  
1. 回答一个变量两个值 
2.扩展 
继续深入理解 
三. 为什么要有地址空间 
原因#xff1a; 
1. 使…目录 前言 地址空间回顾 验证一个变量是否会有两个值 
一. 什么是地址空间 
虚拟地址与物理地址之间的关系 
二. 地址空间是如何设计的  
1. 回答一个变量两个值 
2.扩展 
继续深入理解 
三. 为什么要有地址空间 
原因 
1. 使操作系统对访问或者映射的合法性检查杀掉非法进程从而保护数据安全。  
2.  使物理内存分配与进程管理通过页表进行解耦在加载时确定映射关系后相互独立 
3. 保证每个进程以统一的视角有序的区域划分进行管理完成进程独立性的实现 
页表补充 前言 地址空间回顾 
之前我们学习C是对内存分布的了解  字符串常量在静态常量区静态区  那么这真的是内存吗 答案是不是 那我们之前所了解的上图又是什么 那真正的内存又是指什么让我们来解释其中的奥秘 验证一个变量是否会有两个值 
我们运行下面的代码 #include iostream2 #include unistd.h3 using namespace std;4 5 int _gar  100;6 int main()7 {8    pid_t pd  fork();9 10    if (pd  0)11    {// 子进程12      int cen  0;13      while (1)14      {15        cout  I am child ,Pid :  getpid()   PPid:  getppi    d()   _gar    _gar  地址:  _gar  endl;16        sleep(1);17        cen;18        if (cen  5)19        {20          _gar  200;                                                21          cout  100 - 200 seccoss -gar    _gar        endl; 22        }23      }24    }25    else26    {27     // 父进程28     while (1)29     {30        cout  I am father ,Pid :  getpid()   PPid:  getpp    id()   _gar    _gar  地址:  _gar  endl;31     sleep(1);32     }33    }34    35   return 0;36 } 
根据我们实验出来的结果 
这其实是虚拟地址也叫线性地址。 几乎所有的语言所说的“地址”指的并非物理地址而是虚拟地址 这里对本文刚开始的内存进行解释 内存可以分为主存储器主内存和辅助存储器如硬盘、固态硬盘等。主内存是计算机中直接与CPU交互的存储器用于存储当前正在执行的程序和数据。辅助存储器则用于长期存储数据当程序或数据不再需要时可以将其保存在辅助存储器中。来源chatgpt 一. 什么是地址空间 
虚拟地址与物理地址之间的关系 
任何数据都需要加载到内存中都有各自的物理地址。如果我们进程A,B同时运行相互独立万一出现错误将A将B中的数据读取了这是极不安全的而如果在虚拟地址上先操作再通过一定的机制确保访问的安全性。因此虚拟地址的存在保护了物理地址上的数据安全。 地址空间的本质是一种内核的数据结构里面至少有各个区域的划分。 二. 地址空间是如何设计的  
我们知道每个进程都有自己的PCB同时task_struct里面有进程地址空间数据的存储结构也就是mm_struct。虚拟地址经过页表映射指向物理地址。 注意每个进程中不只是地址空间页表也有自己私有一份。 这样我们只要保证每个进程之间经过页表映射后的物理地址不同即可保证进程之间互不干涉。 1. 回答一个变量两个值 
解释 父进程通过自己的task_struct中地址空间数据访问到在物理空间上的数据子进程则是共享父进程的代码但当子进程想对数据进行修改为了保证进程之间的独立性系统决定进行写时拷贝为子进程拷贝一份数据同时修改子进程页表映射数据。这样就在表面上看就是相同变量不同的值但本质上是相同的虚拟地址不同的页表不同的物理地址不同的值。 具体的就体现在id的两次写入 2.扩展 结论在可执行程序编译时内部就有地址了 我们在分析地址空间时一直使用的是OS的视角而不只是操作系统要遵守编译器也要遵守 即在编译器编译代码时就已经在内部形成了地址而且有各个区域代码区数据区...并且采用与linux内核一样的编址方式每一个变量每一行代码都有其虚拟地址。 继续深入理解 我们知道执行进程是通过虚拟地址页表的方式来访问物理地址的那可执行程序的虚拟地址和页表的数据又是从那里来的呢 流程分析  
所以CPU在读取到变量a时根据虚拟地址0x100在代码段中寻找在代码段查询页表后再跳转0x169地址找到数据a,CPU获取其内部跳转虚拟地址0x123再从虚拟地址中寻找通过页表访问到函数func。物理内存位置随便加载 三. 为什么要有地址空间 
原因 
1. 使操作系统对访问或者映射的合法性检查杀掉非法进程从而保护数据安全。  例假设char* man  鸡你太美;  *man  ‘寄’  我们在C语言期间就清楚字符常量无法修改其原因来自底层页表中会记录代码段地址并且记录其读写权限操作系统检测到非法操作后就会中断结束进程保护数据。在物理内存我们是可以任意修改的所以页表上的判断确保了操作的合法性保护了数据的安全 2.  使物理内存分配与进程管理通过页表进行解耦在加载时确定映射关系后相互独立 问是否可以提前加载未来的数据到物理内存中呢 答可以 解析: 物理内存的分配和进程管理之间可以说没有关系。这种关系叫做解耦合那什么是强耦合呢就是之间关系紧密不容易分开例如你把函数内容写在main函数里面。   我们在学习C,C时在语言层面上new,malloc等内存分配上的操作都是在对虚拟地址上的操作。那疑问来了 问在进行虚拟地址分配的时候是否在物理内存上分配资源 答不会只在你访问时才申请物理内存空间通过这延迟分配的策略提高整机效率。这个操作仅操作系统自动完成用户进程0感知 3. 保证每个进程以统一的视角有序的区域划分进行管理完成进程独立性的实现 页表补充 
以现在的视角看进程加载内存就好像是创建进程那是否会加载全部的数据到内存上呢 我们在玩游戏时有的游戏动则40G甚至是100G我们的电脑是绝对装不下的因此内存有一种内存换下机制一些数据在一定时间内不再使用则被换下加载新数据说到这里要对页表进行补充页表不只映射物理内存也映射硬盘地址再次使用被换下的数据直接查询页表用磁盘地址快速访问加载到内存中。 结语 本小节就到这里了感谢小伙伴的浏览如果有什么建议欢迎在评论区评论如果给小伙伴带来一些收获请留下你的小赞你的点赞和关注将会成为博主创作的动力。