面试题答案
一键面试并发问题
- 内存竞争:多个线程同时申请或释放MEM_ROOT内存,可能导致数据不一致,比如内存分配冲突,重复释放等问题。
- 死锁风险:在并发控制机制中,如果线程获取锁的顺序不一致,可能导致死锁,使得线程相互等待对方释放资源,无法继续执行。
- 内存碎片:多线程并发分配和释放内存时,可能导致内存碎片化严重,降低内存利用率,影响后续的内存分配效率。
现有的并发控制机制
- 锁机制:通过互斥锁(Mutex)来保护对MEM_ROOT内存操作的临界区,保证同一时间只有一个线程可以访问和操作MEM_ROOT相关数据结构,避免内存竞争问题。
- 读写锁:对于读多写少的场景,采用读写锁,允许多个线程同时读MEM_ROOT相关数据结构,但写操作需要独占锁,从而提高并发性能。
优化方案
- 线程本地缓存(Thread - Local Cache):
- 每个线程维护自己的MEM_ROOT本地缓存。线程在需要分配内存时,首先从本地缓存中获取,如果本地缓存不足,再从全局的MEM_ROOT中分配一块较大的内存块到本地缓存。
- 当线程释放内存时,先将内存归还给本地缓存,当本地缓存达到一定阈值或线程结束时,再将本地缓存中的内存归还给全局MEM_ROOT。
- 优点:减少了线程对全局MEM_ROOT的竞争,大大提高了并发场景下的内存分配和回收效率,同时降低了锁的争用。
- 内存池预分配:
- 在系统启动时,预先分配若干个大小不同的内存池,每个内存池专门用于分配特定大小范围的内存块。
- 线程需要分配内存时,直接从对应的内存池中获取,释放时也归还到对应的内存池。
- 优点:减少了动态内存分配和释放的次数,降低了内存碎片化的可能性,并且由于内存池的管理相对简单,锁的粒度可以更细,进一步提高并发性能。