问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

动态声请内存,操作系统会做哪些事情?

发布网友 发布时间:2022-04-11 19:25

我来回答

3个回答

热心网友 时间:2022-04-11 20:55

说得详细一点:
1.对于变量的定义,局部变量确实是放在栈中的,但静态变量或全局变量是放在程序数据段中的;动态内存申请的内存从堆中分配。栈和数据段由程序管理和使用,而堆中内存的分配和回收必须由系统管理。
2.程序动态申请内存时,程序通过API向系统中的堆管理器前端分配器申请,如果堆段中有合适内存则分配给程序使用,如果没有,则堆管理器通过后端分配器向系统虚拟内存管理器申请内存。
3.初始堆段、栈以及代码段和各数据段占用的内存,都是进程创建时由系统虚拟内存管理器分配。
4.进程创建时,进行了许多复杂的操作,如:从系统内存池中申请内存创建页表、内核对象等进程关键结构,创建进程的虚拟内存空间,从虚拟内存空间分配内存加载程序,从虚拟内存空间分配内存初始化堆及栈。
5.虚拟内存管理器管理的只是虚拟内存,虚拟内存地址需要经过分段和分页两次机制转换才是虚拟内存的物理内存地址,当你访问虚拟内存时,它可能没有对应物理内存,也可能被交换到了硬盘,确保你能访问到正确的物理内存也是系统的任务。
6.虚拟内存管理器分配内存,先要在虚拟地址空间中找一块合适的地址,再从页框数据库中找一块适合的物理内存,通过分段和分页机制将这块物理内存映射到这块虚拟地址上,然后将这块地址返回给申请者。
7.除了动态内存的申请,其他内存都是在进程初始化中申请好了的,所以使用时不用再申请,效率当然要高。而动态内存申请时,过程可能很简单,程序调用API向堆管理器申请,堆管理器从初始化堆段中找一块内存给你;有时候过程可能也很复杂,程序向堆管理器要,堆管理器要向虚拟内存管理器要,虚拟内存管理器要向物理内存管理器要。
8.总而言之,言而总之,这是个非常复杂的过程,也显示了一个操作系统在资源管理方面的强大功能。

热心网友 时间:2022-04-11 22:13

我说一下我理解的吧 在函数内 int i=0 看好是函数内 这是在栈空间中申请一个变量 i 与 0都是在栈空间中的 就是在函数结束后会释放掉 从汇编角度说 就是在call之后(调用子函数)跳转到一个新的地址 在那个地址定义了一个a。 如果用malloc (就是new)会在堆中申请一片空间 堆中的数据不会随着函数结束释放掉,对于汇编来说就是将某一寄存器 比如es指向表示堆的地址 然后进行操作 地址跳跃比较大。 栈有一个固定大小,栈中的数据是队列形式 堆是链表的形式 针对不懂操作不同数据结构的方便性也不一样。。 不知道你看懂没追问能不能再说得详细一点
比如,对于汇编来说就是将某一寄存器 比如es指向表示堆的地址 然后进行操作 地址跳跃比较大。
究竟是怎么操作,怎么跳转的,
堆是链表的形式 针对不懂操作不同数据结构的方便性也不一样
到底怎么个方便法撒
请详细说明一下

追答这个涉及到数据结构 队列和链表的优劣性 队列 就是数组形势的数据再找特定数据时很方便,因为他们在地址上是连续的。而链表在地址上不是连续的 链表进行插入删除操作很容易 但要找特定元素比较麻烦 需要遍历链表

热心网友 时间:2022-04-11 23:47

C++是高级编程语言,至于计算机低层做什么处理,这个对于我们来说没必要掌握,掌握起来也比较费劲.
另外静态变量是要用关键词static来申请的.你所说的int i这个不是静态变量,而是在栈中申请的变量.用new是在堆中申请的.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
天涯论坛的网址是什么啊? 如何辨别天涯社区的官方网站? 天涯社区的官方网址是什么呀? 嘉陵火星人(150CC)报价 广西能上150C的摩托车牌吗 隆鑫200cc和150cc的发动机怎么辨认_百度问一问 150cc大船摩托车问题!请高手帮我·· 我想问问这是125cc还是150cc 滁州琅琊山的门票要多少钱 为什么手机连上WiFi却无法上网了? stl 内存分配器什么时候释放 the internet is important作文 web-accessible 是什么意思 想给我家的E70上前端,有推荐的吗 runescape item,runescape account,runescape power leveling 这些是什么? 麻烦英语好的大哥帮忙翻译一下~跪谢了! 找个高手帮我翻译一下,不要百度谷歌翻译 翻译汉语课文成英文 一百分拿下它 请大家帮忙人工翻译一篇摘要,最好是英语很好的,直接通过在线翻译的就别帖上来啦,谢谢;急用。 网络资源带给人们的好处英语作文 想找一篇关于《网络营销与传统营销的比较研究》的外文文献和翻译 求一个PVP为主的魔兽世界私服 C#如何保存多个textbox的值到一个文件,然后可以提取文件到多个textbox里 请求专家 关于 法语 过去将来时用法的2 道题. 中文翻法文 ! 需要法文高手进来!!! 急急急 不要翻译软体 part2 求3DMAX9快捷文档,新手基础入门,急用,我QQ108495245,英文版本的 红葡萄酒应怎样喝才更健康? 喝哪種紅酒比較養顏? 求IE6浏览器专用的css hack(即该部分语句只对IE6有效) c#怎么提取xml里的某几行数据? 0x77dl8d8a指令引用的0x003d84f4内存,该内存不能为read 什么是嵌入式系统的好的C 内存分配器 "0x7c9308d3"指令引用的"0x01c17008"内存。该内存不能为"written"。 C++语言中,new表示什么的关键字? C语言中动态内存分配的问题 int * p=(int*)malloc(8) 这样理解对不对:(in 【C/C++】如何判断指针式malloc/new分配出来的 SAP 如何连接 DB2? sap ides with db2 如何扩展表空间 sap环境下搞db2的hadr是不是有特殊要求 学SAP需要oracle数据库的知识和linux系统的知识吗? sap的后台主流的数据库一般都是oracle的吗?还有其他的数据库吗? sap系统应该怎么选择 cocos2dx中label为什么不支持中文 Cocos2dx 3.1.1 半透明的Layer中如何实现屏蔽后面层的事件(屏蔽层)(不用CocoStudio的json文件)? cocos2dx 3.1 vs里怎么配置cocostudio cocos2dx3.1怎么编译 求助Cocos2dx 3.1 读取Cocos Studio 1.6 的UI slider的问题 cocos2dx3.1 xcode 怎么新建文件,选择基类 cocos2dx3.1 lua绑定c++类中怎么出错了 怎么在cocos2dx的基础上学习opengl,shader