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

posted @ 2019-12-01 11:43  Let_Life_Stop  阅读(951)  评论(0编辑  收藏  举报