当前位置:
首页>
科技>
数码 > 用malloc分配内存,操作系统会为程序分配物理内存,什么时候会分配?
用malloc分配内存,操作系统会为程序分配物理内存,什么时候会分配?
时间:2025/9/14 11:39:33来源:https://blog.csdn.net/m0_59680769/article/details/142338614 浏览次数:0次
虚拟内存与物理内存的分配时机
- 虚拟内存的分配:
- 当程序调用
malloc
函数请求一定大小的内存时,malloc
会首先尝试在进程的虚拟地址空间中为该请求分配一块连续的虚拟内存区域。这个过程通常是通过系统调用如brk
(对于小块内存)或mmap
(对于大块内存)来完成的。 - 重要的是要理解,这个步骤只是分配了虚拟内存,并没有直接涉及物理内存的分配。虚拟内存空间在逻辑上是连续的,但实际上它与物理内存的映射关系是动态的,即按需建立。
- 物理内存的分配:
- 物理内存的分配发生在进程第一次尝试访问已分配的虚拟内存时。此时,如果虚拟内存对应的物理内存页尚未分配(即该页不在物理内存中),就会触发缺页中断(Page Fault)。
- 缺页中断发生后,操作系统会介入,查找可用的物理内存页,并将其分配给该虚拟内存页,同时更新页表以建立虚拟内存与物理内存之间的映射关系。
具体过程
- 小内存分配(如小于128KB):
- 通常通过
brk
系统调用进行。brk
会将堆顶指针(_brk
或_edata
等)向高地址方向移动,从而扩大堆区的大小,但此时并不会立即分配物理内存。 - 只有在进程首次访问新分配的虚拟内存区域时,才会通过缺页中断机制分配物理内存。
- 大内存分配(如大于128KB):
- 通常通过
mmap
系统调用进行。mmap
会在文件映射区(或匿名映射区)为进程分配一块连续的虚拟内存区域,并且这块内存区域可以映射到物理内存中的任何位置(如果尚未映射的话)。 - 同样,物理内存的分配也是按需进行的,即在进程首次访问该虚拟内存区域时触发缺页中断。
虚拟内存转换为物理内存
基本步骤
- 分段机制(如果启用):
- 首先,如果系统启用了分段机制,CPU会将虚拟地址(由段选择子和段偏移组成)转换为线性地址。这一步骤中,CPU会根据段选择子在段描述符表中找到对应的段描述符,然后将段描述符中的段基址与段偏移相加,形成线性地址。
- 如果未启用分页机制,线性地址将直接作为物理地址使用。
- 分页机制:
- 接下来,如果系统启用了分页机制,CPU会将线性地址转换为物理地址。这一过程通常涉及多级页表(如一级页表、二级页表等),具体级数取决于系统架构和配置。
- 在多级页表结构中,线性地址被划分为多个部分,每部分作为索引来访问不同级别的页表。例如,在32位系统中,线性地址可能被划分为10位、10位和12位三部分,分别用于索引一级页表、二级页表和页内偏移。
- CPU首先使用线性地址的高位部分作为索引访问一级页表,找到对应的页表项(PTE),该页表项中包含了二级页表的基地址。
- 然后,CPU使用线性地址的中间部分作为索引访问二级页表,找到最终的物理页框号(PPN)。
- 最后,CPU将物理页框号与线性地址的低位部分(页内偏移)组合,形成物理地址。
涉及的数据结构和寄存器
- 页目录(Page Directory)和页表(Page Table):这些数据结构用于存储虚拟地址到物理地址的映射信息。页目录包含指向页表的指针,页表则包含物理页框号。
- CR3寄存器:也称为页目录基地址寄存器(PDBR),用于存储当前进程的页目录的基地址。CPU通过CR3寄存器来访问进程的页目录。
- TLB(Translation Lookaside Buffer):TLB是MMU中的一个缓存,用于存储最近访问过的页表项。当CPU需要转换虚拟地址时,它会首先检查TLB中是否已缓存了对应的页表项,以提高转换效率。
转换过程优化
- 多级页表:通过引入多级页表结构,可以减少页表占用的内存空间,并提高内存利用率。
- TLB缓存:TLB缓存的引入可以显著减少访问内存的次数,从而提高虚拟地址到物理地址的转换速度。
关键字:用malloc分配内存,操作系统会为程序分配物理内存,什么时候会分配?
版权声明:
本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。
我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com
责任编辑: