佛山网站建设哪家好哪里有做区块链网站的
- 作者: 五速梦信息网
- 时间: 2026年03月21日 11:17
当前位置: 首页 > news >正文
佛山网站建设哪家好,哪里有做区块链网站的,东莞网站建设服务协议,网络营销推广外包服务目录 回顾C/C语言的程序地址空间 感性认识虚拟地址空间 虚拟地址空间与物理空间如何建立映射关系 为什么要虚拟地址空间#xff1f; 回顾C/C语言的程序地址空间 在学习C/C语言时我们知道了一个概念叫程序地址空间。通俗来说就是如下一张表#xff0c;从中可以得知系统的几…目录 回顾C/C语言的程序地址空间 感性认识虚拟地址空间 虚拟地址空间与物理空间如何建立映射关系 为什么要虚拟地址空间 回顾C/C语言的程序地址空间 在学习C/C语言时我们知道了一个概念叫程序地址空间。通俗来说就是如下一张表从中可以得知系统的几个区域 现在有个问题这个表是内存吗来看个例子就知道了 可以看到一开始父进程和子进程对应打印的全局变量数值和地址都一样奇怪的事情出现了当全局变量的值在子进程中被改变后父进程的变量地址和子进程的地址还是同一个但是两个的值不一样 这是不可想象的之前讲进程的时候说了进程具有独立性多进程下进程间是互不干扰的即使共用代码但也会根据条件判断语句分开执行。 一个物理地址对应的数据流只有一个对应的值也只有一个但是这里确实出现了一个地址对应两个不同值的情况。这只能说明一个事实这里的地址不是物理地址 这里的地址叫做虚拟地址也叫线性地址或逻辑地址。这就回答了上面的问题那不是物理意义的内存而是虚拟内存所以以前学语言的时候说的指针不是物理地址而是虚拟地址。 感性认识虚拟地址空间 进程在运行的时候会有一个错觉它觉得它是独占CPU资源的实际上在我们看来根本不是这样CPU每时每刻都在调度不同进程不断进行着切换。 根据这一点我举个例子帮助感性理解 有个大帮派势力暗中统治着几座城市帮主手下有两个心腹但是他们俩互相不知道对方的存在。 为了让两个心腹好好干活别想着觊觎帮主之位帮主对心腹A说我死后这个集团就交给你打理了同时他也对心腹B说了一样的话相当于分别给他们俩画了个大饼而他们两人都不知道帮主和另一个人也许下了承诺。于是两人好好干有一天A对帮主说想要更多实权帮主说反正我快走了到时候一切都交给你但你现在先别急于是A愉快地干活去了B也经历了同样的事。 这里帮主就好比操作系统两个心腹A,B就是进程两个进程以为自己独占着操作系统资源操作系统为了更好地调度他们给他们画了大饼这张饼也就是”进程地址空间“当进程想要向操作系统多要点空间资源时操作系统不能一次全给它本身内存吃紧要节省空间就会分批一次一次给空间——对应我们malloc/new开空间。 那么操作系统是如何画饼的呢————还是类比刚刚的例子实际上画饼就是在人的脑中构建蓝图可以看成一个数据结构 struct 蓝图 {char* who;char* when;char* target; }; 那么操作系统也是一样是对进程地址空间做管理管理的本质是先描述再组织描述也一样用struct结构体描述起来地址空间的本质就是内核的数据结构mm_struct 地址空间上有heap,stack等区域那么操作系统是怎么在地址空间上将它们描述起来的呢————下面再举个例子 帮主的帮派很大管理着几个城市但是同等大小的势力也存在并和该帮派对抗着。为了不引起大规模的乱斗两个帮派划地分界谁都不准越界半步。那么用数据结构进行区域划分是这样的 struct area //区域 {unsigned int A_start; //帮派A区域起始位置unsigned int A_end; //帮派A区域结束位置unsigned int B_start; //帮派B区域起始位置unsigned int B_end; //帮派B区域结束位置 };struct area partition {1,50,51,100}; //帮派A区域 [1,50] //帮派B区域 [51,100] 两个帮派定好地界后还是有问题因为货物运输交易经常牵扯到边界附近地带容易造成摩擦所以经过商量将小镇T作为公共使用区域两边都可涉足 struct area partition {1,45,55,100}; 这是区域调整的方法。 类比以上操作系统也是一个道理。 地址空间描述的基本空间大小是字节32位下是2^32个地址1个地址1字节一共大概4GB空间。每一个字节都要有唯一的地址。 如此一来操作系统就可以根据划分好的地址描述heap等区域 struct mm_struct {unsigned int code_start;unsigned int code_end;unsigned int stack_start;unsigned int stack_end;……. }; 假设mm_struct这个内核数据结构就是这样的里面区域划分假定如上总之默认占4GB大小。 code_start 到 code_end这段区域里面有很多地址叫做虚拟地址。 想要调整区域像例子中的设定公共区域其实就是改变区域的起始地址和结束地址比如要扩大stack区域可以增加stack_end。我们写C/C代码时malloc/new空间实际上就是扩大堆区free就是缩小堆区。 我们知道进程在创建的时候操作系统会创建一个PCB内核数据结构task_struct里面存了进程的相关信息如优先级…然后操作系统给进程 “画大饼” 进程为了得到这块大饼它的task_struct里面有个指针指向mm_struct。 虚拟地址空间与物理空间如何建立映射关系 这里牵扯到页表等相关概念我们处理一下简单讲解。 我们已经知道磁盘上的程序会加载到内存并且一字节对应内存上的一个物理地址空间。 假设mytest.exe程序大小是8KB内存起始地址是0x1111 1111那么虚拟进程地址空间是如何与物理内存建立映射关系的呢————系统中有一个东西叫页表可以建立映射。 关于页表页等概念这里先不说主要看进程地址空间。 虚拟地址空间的一个字节0xFF01 EEEC存到页表左边与右边存物理地址空间的0x2100 1110对应。 假设我们写代码int a 10; 这里a就是虚拟地址会对应虚拟进程地址空间的一个字节再对应页表的数据再与物理空间对应。当修改a的值物理内存存储的值也被改变。 补充 1、在Linux下我们认为虚拟地址和线性地址是一个概念在其它某些OS下不一样。因为2^32个虚拟地址都是紧挨一起线性排布下去的。 2、再次画图理解整个过程 每个进程都有自己的task_struct和mm_struct以及页表当然物理内存只有一个通过上述方式建立联系。操作系统OS操控管理着一切给进程 “画大饼”让进程看似好像独享操作系统资源坐拥2^32字节大小空间但其实进程无法直接查看物理内存大小和占用情况只能通过 mm_struct — 页表—-物理内存的方式而进程胃口也比较小一次开个10MB.100MB很多了再多OS也不会再给进程空间了。 为什么要虚拟地址空间 1、虚拟地址空间可以保护物理空间不被错误修改提高了系统的安全性。 试想一下要是没有虚拟地址空间用户直接访问物理空间会发生什么。 假设你想修改一个数据但是你访问错位置了将一块重要的数据给修改了或者你写的程序出现野指针等错误容易造成系统的崩溃。 刚刚提到的页表除了建立虚拟空间地址和物理内存的映射关系外还有其他作用其中之一是保护与拦截。 当进程做出违反操作系统的行为访问物理内存时页表会进行拦截。因为进程不能直接访问物理内存需要通过mm_struct—页表此时页表就可以拦截越界行为保护物理内存。 2、虚拟进程地址的存在可以更方便的进行进程与进程数据代码的解耦保证进程的独立性。 这段话很抽象我们用例子来理解。还记得上面父子进程的那个程序吗在子进程内部改变了全局变量globol_val子进程和父进程打印的变量数值不同但虚拟地址相同。 现在我们结合刚刚获取的知识再来深入理解一下为什么虚拟地址相同。 系统生成父进程后再生成子进程子进程是以父进程为模板构建出来的tast_struct , mm_struct页表都一样。它们里面的全局变量globol_val的虚拟地址都依据映射指向物理内存的同一地址所以一开始执行的时候打印的变量数值一样地址也一样。 当子进程内想要改变全局变量globol_val, 要经过虚拟地址、页表访问物理内存此时操作系统会做一个工作——拷贝物理内存对应位置的数据给它另一块地址然后更改页表映射将子进程虚拟地址映射指向新的物理内存地址最后更改新的globol_val的值。 为什么操作系统要做这一步————因为进程具有独立性当一个进程对被共享的数据进行修改时会破坏独立性影响其他共享数据的进程所以为了让进程改变数据的同时不破坏独立性操作系统将该进程的页表映射更改所以产生了虚拟地址相同但对应值不同的现象。 这里的拷贝方式叫做写时拷贝它可以让不同进程的数据分离。 3、 虚拟地址空间可以让进程以统一的视角来看待进程对应的代码和数据等各个区域方便使用。 编译器也是以同样的视角来编译代码地址。 问题可执行程序内部代码有地址吗————有。进入汇编可以查看代码对应的地址并且在链接的过程中也需要代码地址与库链接。 既然可执行程序代码有地址那这个地址是什么地址呢是物理地址还是虚拟地址————自然是虚拟地址或者这里更准确的说应该叫逻辑地址。 磁盘上的可执行程序里面有一个main函数其内部调用了fun函数并且fun函数的地址是0x1122main函数的地址是0xFEE0, 程序也有全局数据区代码区等32位平台下和上面讲的虚拟地址空间编址方式一样是以32位编址的。 可执行程序加载到内存天然地就有了一个外部的物理地址和程序内部编址方式一样的。在程序内部main函数寻址调用fun函数外部物理内存也是一样通过物理寻址main函数调用fun函数。 所以我们现在有两套地址标识物理内存中代码和数据的地址还有在程序内部进行跳转的虚拟地址。 内存将进程数据加载到CPUCPU收到数据包括main函数和fun函数的地址注意此时CPU接收到的地址是虚拟地址因为CPU读取的是指令指令内部就有地址)PC指针记录下fun函数的地址CPU先拿着main函数的虚拟地址到页表查表映射物理内存找到对应的main函数的物理地址然后执行main函数。 这里有个问题CPU执行出来的地址是物理地址还是虚拟地址————是虚拟地址虚拟地址通过页表映射到物理内存。再调用main函数内部的fun函数根据PC指针保存的fun函数地址CPU再通过页表映射物理内存此时CPU出来的还是虚拟地址。这样就形成了一个循环。 CPU在这整个过程中没有见到过物理地址全都是虚拟地址。
- 上一篇: 佛山网站建设流程crm客户管理系统模板
- 下一篇: 佛山网站建设全方位服务wordpress抽奖源码
相关文章
-
佛山网站建设流程crm客户管理系统模板
佛山网站建设流程crm客户管理系统模板
- 技术栈
- 2026年03月21日
-
佛山网站建设及推广服务公司兰州网站建设怎么选
佛山网站建设及推广服务公司兰州网站建设怎么选
- 技术栈
- 2026年03月21日
-
佛山网站建设公司如何组建wordpress jquery异步请求
佛山网站建设公司如何组建wordpress jquery异步请求
- 技术栈
- 2026年03月21日
-
佛山网站建设全方位服务wordpress抽奖源码
佛山网站建设全方位服务wordpress抽奖源码
- 技术栈
- 2026年03月21日
-
佛山网站建设网站制作公司哪家好外国酷炫网站
佛山网站建设网站制作公司哪家好外国酷炫网站
- 技术栈
- 2026年03月21日
-
佛山网站建设怎么选择网站制作客户寻找
佛山网站建设怎么选择网站制作客户寻找
- 技术栈
- 2026年03月21日






