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

  • 相关阅读:
    C#中?、??与?:的使用
    循环的嵌套
    Linux中__init、__devinit等初始化宏
    AUPE学习第十章------信号
    C语言--const详解
    database is locked和SQLITE_BUSY
    vc6.0错误提示
    C/C++程序内存模型
    浅谈C中的malloc和free “来自bccn C语言论坛”
    Java几种内部类总结
  • 原文地址:https://www.cnblogs.com/letlifestop/p/11965473.html
Copyright © 2011-2022 走看看