什么是死锁,如何避免死锁?
死锁是一组互相竞争资源的线程因为互相等待对方释放资源而陷入永久阻塞的过程。
死锁需要满足 4 个必要条件:
- 互斥条件:如果一个线程占有了某个资源,那么其他线程不能再占有这个资源。
- 请求保持条件:一个线程当申请某个资源陷入等待时,不会释放自己拥有的资源。
- 不可剥夺条件:资源不能强行从某个线程中被剥夺,只能由持有者资源释放。
- 循环等待条件:不同线程形成了一个循环等待资源的链。每一个线程都在等待下一个线程释放资源。
如何避免死锁:
只要破坏 4 个必要条件之一即可。
- 互斥条件不能被破坏。因为锁本身就是通过互斥解决线程安全问题的。
- 可以破坏请求等待条件。让一个资源一次性申请所有资源,这样就不会陷入等待。
- 可以破坏不可剥夺条件。当一个线程申请资源失败时,让它主动释放自己占有的资源。
- 可以破坏循环等待条件。让所有线程按照相同的顺序顺序去申请资源。
介绍一下几种典型的锁
互斥锁:互斥锁是最常见的锁。用于互斥地访问共享资源。同一时刻只允许一个线程访问共享资源并持有互斥锁,其他线程会被阻塞。直到持有资源的线程释放互斥锁并唤醒其他线程。
自旋锁:自旋锁是一种基于忙等待的锁。当获取不到锁时,会一直轮询。直到锁被释放。
其他锁都是基于这两种。
读写锁:允许多个线程同时读共享资源,但只允许一个进程写共享资源。分为读(共享)和写(排他)状态。
悲观锁:悲观锁认为多线程同时修改共享资源的概率很大,线程安全问题一定会发生。所以访问资源前会先上锁。
乐观锁:乐观锁认为多线程同时修改共享资源的概率很小。会先修改资源再说。然后看资源是否被其他线程同时修改。如果是,则放弃本次修改。
讲一讲你理解的虚拟内存
虚拟内存是一个进程在创建的时候,给它分配一段虚拟的地址空间。这个空间不是真实存在的,而是通过映射与实际物理空间对应。这样可以使每个进程都有自己独立的地址空间,访问比物理内存 RAM 更大的地址空间。每个进程都有足够的内存去允许。
虚拟内存有以下作用:
- 内存扩展:虚拟内存可以使一个进程拥有比实际可用内存更多的内存。这可以运行更大的程序、处理更多的数据。
- 内存隔离:由于每个进程都是独立的虚拟地址空间,一个进程无法直接访问到另一个进程。
- 页面交换:物理内存不足时,操作系统可以将部分数据从物理内存加载到磁盘的虚拟内存中,这称为页面交换。当需要时,数据可以再次从磁盘的虚拟内存加载到物理内存。这使得尽管物理内存有限,系统仍然可以运行。
- 物理内存管理:虚拟内存允许操作系统动态地将数据和程序的部分从虚拟内存加载到物理内存中,以满足当前进程的需要。当物理内存不足时,将不常用的数据暂时移到硬盘上,从而释放内存供其他进程使用。

被折叠的 条评论
为什么被折叠?



