动态声请内存,操作系统会做哪些事情?
发布网友
发布时间: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是在堆中申请的.