malloc和new出来的地址都是虚拟地址 你就说内存管理单元怎么可能让你直接操作硬件内存地址!

简介:
malloc的实现与物理内存自然是无关的,内核为每个进程维护一张页表,页表存储进程空间内每页的虚拟地址,页表项中有的虚拟内存页对应着某个物理内存页面,也有的虚拟内存页没有实际的物理页面对应。无论malloc通过sbrk还是mmap实现,分配到的内存只是虚拟内存,而且只是虚拟内存的页号,代表这块空间进程可以用,实际上还没有分配到实际的物理页面。等你的进程访问到这个新分配的内存空间的时候,如果其还没有对应的物理页面分配,就会产生缺页中断,内核这个时候会给进程分配实际的物理页面,以与这个未被映射的虚拟页面对应起来,然后程序就可以欢快的继续往下跑了。



摘自:https://www.zhihu.com/question/20220583/answer/28490955

 

malloc是一个库函数,不同的操作系统上具体实现细节是不同的,以下就以linux条件下进行分析:linux采用的是glibc中堆内存管理ptmalloc实现,虚拟内存的布局规定了malloc申请位置以及大小,malloc一次性能申请小内存(小于128KB),分配的是在堆区(heap),用sbrk()进行对齐生长,而malloc一次性申请大内存(大于128KB时)分配到的是在映射区,而不是在堆区,采用的mmap()系统调用进行映射。当然虚拟地址只是规定了一种最理想的状态,实际分配还是要考虑到物理内存加交换内存总量的限制,因为每次分配,特别是大内存分配采用mmap()映射内存需要记录物理内存加交换内存地址,所有物理内存加交换内存限制了malloc实际分配。比如32位情况下,最新版本的linux的映射区在用户空间区的3G位置,而映射区向下生长,所以理想情况下大概能有2.9GB(除去开始地址128M),如果你的物理内存加交换区只有2G,malloc一次申请最多1.8G左右,如果你的物理内存加交换区大于4G,那么最多能有2.9G或者2.8G左右。网上能找到测试代码的。



摘自:https://www.zhihu.com/question/20220583/answer/22913516















本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/7235378.html ,如需转载请自行联系原作者



相关文章
|
1月前
关于为什么要在链表中用malloc来分配内存
关于为什么要在链表中用malloc来分配内存
|
1天前
|
程序员 编译器 C语言
C语言知识:动态内存管理(malloc free calloc realloc)
C语言知识:动态内存管理(malloc free calloc realloc)
|
10天前
|
存储 缓存 监控
Java内存管理:垃圾回收与内存泄漏
【4月更文挑战第16天】本文探讨了Java的内存管理机制,重点在于垃圾回收和内存泄漏。垃圾回收通过标记-清除过程回收无用对象,Java提供了多种GC类型,如Serial、Parallel、CMS和G1。内存泄漏导致内存无法释放,常见原因包括静态集合、监听器、内部类、未关闭资源和缓存。内存泄漏影响性能,可能导致应用崩溃。避免内存泄漏的策略包括代码审查、使用分析工具、合理设计和及时释放资源。理解这些原理对开发高性能Java应用至关重要。
|
26天前
|
缓存 算法 Java
Java内存管理:优化性能和避免内存泄漏的关键技巧
综上所述,通过合适的数据结构选择、资源释放、对象复用、引用管理等技巧,可以优化Java程序的性能并避免内存泄漏问题。
27 5
|
1月前
|
存储 算法 Linux
深入理解Linux内存管理brk 和 sbrk 与以及使用C++ list实现内存分配器
深入理解Linux内存管理brk 和 sbrk 与以及使用C++ list实现内存分配器
36 0
|
1月前
|
存储 算法 内存技术
深入理解操作系统内存管理:从虚拟内存到物理内存
【2月更文挑战第30天】 在现代计算机系统中,操作系统的内存管理是确保系统高效稳定运行的关键组成部分。本文将深入探讨操作系统内存管理的复杂世界,特别是虚拟内存和物理内存之间的关联与转换机制。通过分析分页系统的工作原理、虚拟地址空间的结构以及页面置换算法,文章旨在为读者提供一个清晰的框架,以理解内存管理在操作系统中的重要性和实现细节。
|
1月前
|
存储 程序员 Shell
【C/C++ 内存管理函数】C语言动态内存管理大揭秘:malloc、calloc、realloc与new的对比与差异
【C/C++ 内存管理函数】C语言动态内存管理大揭秘:malloc、calloc、realloc与new的对比与差异
175 0
|
1月前
|
存储
内存管理之内存释放函数
内存管理之内存释放函数
15 0
|
1月前
|
存储 程序员 C语言
内存管理——内存分配函数
内存管理——内存分配函数
21 0
|
1月前
|
存储 算法 程序员
实现一个malloc内存分配器(图文并茂)
实现一个malloc内存分配器(图文并茂)
101404 0