元婴期
15. 什么是线程池?它如何提高系统性能?
线程池是一种多线程管理模式,允许应用程序在执行任务时复用有限数量的线程,而不需要为每个任务单独创建和销毁线程。
提高性能的原因:
降低线程创建和销毁的开销:创建和销毁线程需要操作系统进行资源分配,而线程池通过复用线程,减少了频繁的资源分配和回收。
更好地控制并发数量:线程池可以限制同时执行的线程数,防止系统资源被大量线程耗尽。
任务队列管理:未完成的任务会进入等待队列,有序执行,避免系统过载。
16. 什么是内存碎片?如何处理和减少内存碎片?
内存碎片 是指内存分配后,剩余的小块内存无法被有效利用。
内存碎片分为两种类型:
外部碎片:多个小块空闲内存分散存在,但无法满足大块内存分配请求。
内部碎片:已分配的内存块比实际需要的内存大,导致部分空间浪费。
处理和减少内存碎片的方法:
内存紧凑:通过将数据移动,合并分散的空闲内存块,减少外部碎片。
分页或分段:使用分页或分段机制,分配固定大小的内存块,减少内部碎片。
垃圾回收:使用自动垃圾回收机制回收无用的内存并进行优化。
17. 计算机系统中的 LRU(最近最少使用)缓存置换算法是什么?如何实现?
LRU算法 是一种常用的缓存替换策略。当缓存已满,需要替换时,LRU
会移除最近最少使用的缓存块。
实现:
维护一个有序的链表,每次数据被访问时,移动到链表的头部。
当缓存满了时,删除链表尾部的数据块。
更高效的实现可以使用 哈希表 + 双向链表,哈希表用于快速查找缓存块,双向链表维护访问顺序。
18. 非易失性存储(NVM)与易失性存储的区别是什么?NVM 在现代系统中的应用有哪些?
非易失性存储(NVM):在设备断电后数据依然保留(如
SSD
、硬盘)。易失性存储:断电后数据丢失(如
RAM
)。
NVM 的应用:
SSD:现代固态硬盘通过
NVM
提供高速、稳定的存储。持久性内存(如 Intel Optane):结合了
RAM
的速度和硬盘的持久性,应用于高性能计算领域。NVM Express(NVMe)协议:优化了
NVM
存储设备与主机之间的数据传输速度。
19. 什么是 NUMA(非均匀内存访问架构)?它对系统性能的影响是什么?
NUMA 是一种计算机内存架构,在多处理器系统中,每个处理器有自己专属的本地内存,访问本地内存较快,访问其他处理器的内存较慢(非均匀访问)。
对系统性能的影响:
提高局部性:当处理器优先访问本地内存时,系统性能提高。
降低内存访问延迟:但如果处理器频繁访问其他处理器的内存,系统性能会下降。
NUMA
适用于高并发、多核系统的优化设计,通过合理调度任务和数据,避免跨节点访问,提升整体性能。
20. 什么是自旋锁?它与互斥锁(Mutex)的区别是什么?
自旋锁 和 互斥锁 都是多线程编程中的同步机制,但它们的工作方式不同。
自旋锁:当一个线程尝试获取锁而锁被占用时,线程会一直处于忙等待状态(自旋),直到锁释放。
简单理解就是当线程获取到锁被占用时,该线程就会一直在这里循环等待,直到检测到锁可用。自旋锁适合锁等待时间较短的场景。
互斥锁:当线程获取锁失败时,操作系统会将该线程挂起,直到锁可用,避免 CPU
资源的浪费。适合锁等待时间较长的场景。
区别:
自旋锁不会阻塞线程,但会占用
CPU
资源。互斥锁会阻塞线程,但在等待锁期间不占用
CPU
资源。
21. 什么是CAS(Compare-And-Swap)操作?它在并发编程中的应用是什么?
CAS 是一种无锁的原子操作,用于解决多线程并发问题。
工作原理:
读取内存中的某个值。
比较该值是否为预期值。
如果相等,则将该值更新为新值;如果不相等,表示该值已经被其他线程修改,操作失败。
CAS
操作常用于无锁数据结构的实现,如 原子变量 和 无锁队列,能在多线程环境下确保数据的一致性和安全性,而无需使用锁,减少了锁竞争,提高了并发性能。