当前位置:首页 > 内存 > 正文

堆内存申请

  • 内存
  • 2024-08-27 05:42:38
  • 8639

一、数组在定义的时候就被分配了内存空间,那为什么还要申请堆内存空间呢动态数组仅适用于堆上的内存,而局部数组变量适用于堆栈上的内存。
二、c#中的new也是申请堆内存吗在内存堆上为引用类型分配空间,而不自动释放。
三、动态声请内存,操作系统会做哪些事情?更详细地说:
1。至于定义变量,局部变量实际上是放在栈中的,而静态变量或全局变量则是放在程序的数据段中,动态内存所需的内存是从堆中分配的。栈和数据段由程序管理和使用,而堆中内存的分配和回收则必须由系统管理。
2.当程序动态申请内存时,程序通过API向系统中堆管理器的前端分配器申请,如果堆段中有足够的内存,就会分配给程序。否则,堆管理器将使用后端。分配器向系统的虚拟内存管理器请求内存。
3.初始堆段、堆栈、代码段和各个数据段所占用的内存是在进程创建时由系统的虚拟内存管理器分配的。
4.进程创建时会执行许多复杂的操作,如:向系统内存池申请内存、创建进程的页表、内核对象等关键结构、创建进程的虚拟内存空间、从系统内存分配内存等。虚拟内存空间加载程序,从虚拟内存空间分配内存,并初始化堆和栈。
5.虚拟内存管理器只管理虚拟内存。虚拟内存地址必须通过分段和分页机制进行两次转换才会导致虚拟内存的物理内存地址与物理内存地址不匹配。硬盘驱动器上的内存也可以交换,系统的工作也是确保您能够访问正确的物理内存。
6.虚拟内存管理器分配内存时,首先要在虚拟地址空间中找到合适的地址,然后从页框数据库中找到合适的物理内存,并利用分段和分页机制在map中划分这块物理内存内存到这个虚拟地址,然后将此地址返回给请求者。
7.除了申请动态内存外,其他内存都是在进程初始化时申请的,所以使用时不需要再次申请,效率显然很高。当请求动态内存时,过程可以很简单,程序调用API向堆管理器申请,堆管理器从初始化堆段中为你找到一块内存,有时过程可能会很复杂;并且程序向堆管理器请求堆。管理器询问虚拟内存管理器,虚拟内存管理器询问物理内存管理器。
8.总之,总之,这是一个非常复杂的过程,也体现了一个操作系统在资源管理方面的强大功能。