• malloc的底层实现


    1. Allocate分配器中,如何解决多线程锁的争夺问题?

    答:为了解决多线程锁的争夺问题,内存分配器分为了主分配区main_area和非主分配区no_main_area。主分配区和非主分配区

    主分配区和非主分配区们形成一个环形链表,每一个分配区都是由一个互斥锁来控制,主分配区可以通过brk和mmap实现内存的分配,非主分配区只能通过mmap实现,在收集小内存的时候,ptmalloc也要对分配进行上锁操作。

    在执行当前线程的时候,会查看当前线程的私有变量是否已经有分配区,如果存在的话,尝试是否能加锁,如果能加锁的话,就使用该分配区分配内存。否则,遍历环形链表查看是否有空闲的,能上锁的分配区,如果有的话,使用该内存分配区去分配内存;如果没有的话,malloc会再分配一个分配区供当前线程使用,同时将该分配区加入到环形链表中。

     

    2. 在一台内存为2G的机器上,malloc(20G) 会怎样?如果是new(20G) 会怎样?

    答:

    • 首先,malloc和new申请的都是虚拟内存。和物理内存没有直接关系

    • 每个进程允许的虚拟内存是4G,如果是20G的话,已经超出了4G这个上限,无法申请。
    • new的话,底层实现还是malloc,在分配失败的时候会抛出bad_alloc类型的异常

     

    内容参考:

    https://blog.csdn.net/z_ryan/article/details/79950737

  • 相关阅读:
    HDU4857 逃生 拓扑排序
    HDU1285 确定名次 拓扑排序
    【noip模拟赛4】找啊找啊找BF 拓扑排序
    拓扑排序基础
    【noip模拟赛5】任务分配 降维dp
    【noip模拟赛6】收入计划 最大值的最小值 二分答案
    【noip模拟赛5】水流
    标记预期失败
    跳过:
    pytest配置文件:
  • 原文地址:https://www.cnblogs.com/letlifestop/p/11965473.html
Copyright © 2020-2023  润新知