zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ubuntu20.04.2设置配置静态ip方法
    如何在windows10上面运行HyperLedger Fabric1.4
    powershell中临时修改环境变量
    openssl查看pem格式证书细节
    git clone的时候遭遇fatal: early EOF fatal: index-pack failed解决办法
    修改sourcetree的推送账户
    ubuntu上kafka的配置与使用(二)--kafka和zookeeper集群的配置(kafka自带的zookeeper)
    ubuntu上kafka的配置与使用(一)--单机kafka的配置
    李航老师的《统计学习方法》第二章算法的matlab程序
    第8题——计算糖果
  • 原文地址:https://www.cnblogs.com/bonelee/p/7235378.html
Copyright © 2011-2022 走看看