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

转载于:https://www.cnblogs.com/bonelee/p/7235378.html

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

  1. 程序中的地址转换(虚拟地址-物理地址)

    虚拟地址由链接器产生: 链接器的作用吧多个代码模块组装在一起,并解决模块之间的应用,即处理程序代码间的地址引用,形成程序运行的静态内存空间视图. 物理地址 通过地址总线选择内存单元的地址. 虚拟地址到 ...

  2. 一文搞懂栈(stack)、堆(heap)、单片机裸机内存管理malloc

    大家好,我是无际. 有一周没水文了,俗话说夜路走多了难免遇到鬼. 最近就被一个热心网友喷了. 说我的文章没啥营养,所以今天来一篇烧脑的. 哈哈,开个玩笑,不要脸就没人能把我绑架. 主要是最近研发第二代 ...

  3. Linux内存管理和分析vmalloc使用的地址范围

    From: http://www.cnblogs.com/dubingsky/archive/2010/04/20/1716158.html Vmalloc可以获得的地址在VMALLOC_START到 ...

  4. linux 物理内存用完了_12张图解Linux内存管理,程序员内功修炼,看过都说懂了!...

    本文已收录Github:imcoderlemon/CodeClass从小白到架构师,关于编程所有你需要掌握的内容都在这里 今天来带大家研究一下Linux内存管理.对于精通 CURD 的业务同学,内存管 ...

  5. 万字整理,肝翻Linux内存管理所有知识点【Linux内核开发人员必学】都是精髓

    Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理的知识,也就打通了Linux的任督二脉,这一点不夸张.有人问网上有很多Linux内存管理的内容,为什 ...

  6. linux内存管理---虚拟地址、逻辑地址、线性地址、物理地址的区别(一)

    分析linux内存管理机制,离不了上述几个概念,在介绍上述几个概念之前,先从<深入理解linux内核>这本书中摘抄几段关于上述名词的解释: 一.<深入理解linux内核>的解释 ...

  7. 玄铁C910内存管理与地址转换技术

    玄铁C910内存管理与地址转换技术 玄铁 C910 简介 C910 兼容 RISC-V 架构,采用12级超标量流水线,针对算术运算.内存访问以及多核同步等方面进行了优化,同时标配内存管理单元,可运行 ...

  8. Linux内核内存管理:地址转换和MMU

    地址转换和MMU 虚拟内存是一个概念,是给进程的一种错觉,因此它认为自己拥有巨大的.几乎无限的内存,有时甚至比系统实际拥有的内存还要多.每次访问内存位置时,由CPU将虚拟地址转换为物理地址.这种机制称 ...

  9. A、B、C、D、E类IP地址都是怎么划分的?

    IP地址的格式:IP地址=网络地址+主机地址 如果IP进行了子网划分: 则IP地址=网络地址+子网地址+主机地址 网络地址是互联网上的节点在网络中具有的逻辑地址.MAC地址,处于数据链路层,IP地址处 ...

最新文章

  1. 深度学习中的注意力机制(一)
  2. java读取文件路径中文,分分钟搞定!
  3. python绘制坐标图_Python绘制主次坐标图
  4. php文件安全实现方法,php安全下载大文件的实现代码
  5. 获得进程id_浅谈python中的多线程和多进程(二)
  6. 重新学习c++--理解引用、智能指针、虚函数、模板、容器
  7. nginx配置和安装
  8. SEGGER-RTT调试(代替串口printf输出)的使用方法
  9. php while次数,PHP While 循环
  10. PLC编程软件等工具打包下载1.0【好用绿色三菱plc编程软件】
  11. PreScan快速入门到精通第二讲PreScan功能介绍
  12. 怎样做小游戏挖金子(VC,源码4)
  13. C盘AppData文件占用83.7G?
  14. 6s微信连接不上服务器失败是什么原因,6s手机微信打不开怎么回事
  15. 机器学习--特征降维方法总结
  16. 极线的绘制(已知相机的内外参数,极线几何)
  17. Sentence-BERT 论文阅读
  18. 如何建设IDC数据中心机房?看完你就明白了!
  19. 深度学习DBN深度置信网络
  20. leetcode刷题网站

热门文章

  1. Git的撤销操作 git reset HEAD -- <file>
  2. 计算机名字更改时不显示文字,教大家电脑中文件夹不显示名字怎么办
  3. 2014江苏省职称计算机,2014年江苏省职称计算机office多选题.doc
  4. cdn与服务器的关系_IPFS是一个天生的CDN,将会在全世界进行内容加速
  5. math.hypot java_Java Math.hypot() 方法
  6. 【Java Web前端开发】BootStrap入门
  7. 【网络爬虫】BeautfulSoup爬百度百科(真の能看懂~!)
  8. 【深度学习笔记】分类指标accuracy,recall,precision等的区别
  9. c语言程序设计迷宫,C语言程序设计课程设计-迷宫.doc
  10. 取消管理员取得所有权_企业取得违约补偿款是否一律应缴增值税呢?