本文主要是介绍操作系统面试真题总结(七),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
乐观锁和悲观锁有什么区别?
乐观锁和悲观锁是并发控制中两种不同的策略,用于处理多个线程对共享资源的并发访问问题。
它们的区别如下:
悲观锁(Pessimistic Locking):
- 悲观锁的策略是在访问共享资源之前,假设会发生冲突并进行保护。
- 在悲观锁机制下,如果一个线程要访问共享资源,它会假设其他线程可能会对该资源进行修改
- 因此会将资源加锁,直到完成操作后才会释放锁。
乐观锁(Optimistic Locking):
- 乐观锁的策略是在访问共享资源时不加锁,而是在更新操作时进行冲突检测。
- 线程在读取共享资源时,不会对其加锁,而是记录下读取时的版本号或其他标识信息。
- 在提交更新操作时,会再次检查共享资源是否被其他线程修改过。
- 如果没有冲突,就执行更新操作
- 如果有冲突,就放弃当前更新并重新尝试。
性能比较:
- 悲观锁会在访问共享资源之前就加锁,即使没有实际的冲突,也会造成性能的损失。
- 而乐观锁避免了大部分的锁竞争,提高了并发性能。
- 但是,如果冲突频繁发生,乐观锁需要不断地进行重试,可能会导致性能下降。
悲观锁假设会有冲突发生,因此在访问共享资源前进行加锁
而乐观锁假设不会有冲突发生,在更新操作时进行冲突检测。
- 选择哪种锁策略应根据具体场景和需求来决定。
什么是死锁?
死锁(
Deadlock
)是指在多任务环境下:
- 当两个或更多的任务各自拥有一个资源并且等待获取另一个任务持有的资源时,就会发生的一种状态。
涉及的任务无法继续执行,因为每个任务都在等待其他任务释放资源,但是没有任务会释放它的资源,因为它们都在等待。
- 这就形成了一个循环的等待状态,从而导致了死锁。
死锁的四个必要条件:
互斥条件:
- 一个资源只能由一个任务拥有,在资源释放之前任何其他任务都无法请求到。
占有并等待:
- 一个任务持有至少一个资源,但又申请新的资源,而新资源正被别的任务持有
- 所以申请任务阻塞,但又对自己已获得的资源保持不放。
不可抢占:
- 别的任务不能把已获得的资源从任务中强行回收,资源只能由获得它的任务自行释放。
循环等待:
- 存在一种可能,即任务之间形成一种任务-资源的环形链,链中每个任务都占有下一个任务所需的资源。
只要这四个条件中的任意一个得不到满足,就不会发生死锁。
操作系统的设计者通过算法来破坏这些条件从而避免死锁。
- 例如,可以采用资源按顺序分配策略来避免循环等待,通过设置资源申请超时来避免无限期的资源等待等方法。
解决死锁的基本方法?
解决死锁的主要方法可以归结为四类:
- 预防、避免、检测和恢复。
死锁预防:
- 预防策略的主要思想是破坏造成死锁的四个必要条件中的至少一个。
- 例如,可以通过资源互斥访问的限制或者一次性请求所有所需资源的方式来阻止占有并等待的条件
- 或者在任务请求资源时先检查这是否会引起循环等待,等等。
- 这种策略的问题是可能会导致资源的低效使用。
死锁避免:
- 死锁避免采取了一种更加精细的策略。
- 它需要保持关于系统当前的哪些资源被哪些任务占用、哪些资源是空闲的、哪些任务正在等待资源等的信息。
- 然后,操作系统在每次有资源请求时,都会先检查是否授予该资源可能导致系统进入不安全状态(即可能死锁)
- 如果是,就不给任务分配资源。
死锁检测和恢复:
- 有时,我们可能认为死锁可能发生得比较少,或者避免死锁的成本比较高
- 所以我们愿意冒险,但是当检测到死锁时需要有一种恢复办法。
- 这就需要一种检测死锁的算法。
- 当检测到死锁后,通常的做法是中止一些任务或抢占一些资源,以解除死锁状态。
忽略死锁:
- 这是一种鸵鸟算法–即忽略问题的存在。
- 这种做法假定死锁很少发生,即使发生了,系统崩溃或重启可能对用户影响更小。
- 尽管这种做法并不总是有用,但是在某些具体情况下
- 特别是在一些非关键的用户交互式系统中,这可能是一种实用的方法。
总的来说,避免和预防死锁是一种权衡,需要在资源的有效利用和系统稳定性之间做出平衡。
在实际系统中,可能会使用多种策略与技术相结合的方式来处理死锁。
怎么解除死锁?
一旦死锁已经发生,解除死锁可能会涉及到比较复杂的操作。
下面介绍几种解除已发生死锁的方法:
资源抢占:
- 选择一些进程,并强制终止它们或抢占它们占有的资源,然后将这些资源分配给其他进程。
- 这种方法需要谨慎选择终止或抢占的进程,以及决策哪些资源应该被抢占、如何选择抢占的顺序等。
回滚(Rollback):
- 回滚是将一部分进程的状态和操作撤销到先前的状态,通过释放资源来解除死锁。
- 回滚涉及到保存和回复进程状态的机制,需要合理地决定回滚的程度和方式,以及如何避免进一步的死锁发生。
进程终止:
- 选择一些死锁的进程,将它们终止并释放它们占用的资源,以解除死锁。
- 终止进程会导致数据丢失或系统服务中断,因此需要权衡决策。
页面置换算法有哪些?
页面置换算法是操作系统中用来管理内存的方法,它决定了当内存已经满了
- 我们应该置换出哪个页面来为新的页面提供空间。
以下是一些常见的页面置换算法:
最佳页面置换 (OPT, Optimal Page Replacement)
- 这个算法会选择是否使用最少的页面。
- 实际上,它通常是一种理论算法,因为要了解一个页面在未来将被多少次引用,这是非常困难的。
最近最少使用 (LRU, Least Recently Used):
- LRU 置换掉最近最少被使用的页面。
- 这种算法假设如果一个页面在最近一段时间没有被使用,那么在未来一段时间中也不太可能被使用,这个也是最常用的算法。
先进先出(FIFO):
- FIFO算法按照页进入内存的时间先后,选择最早进入的页进行淘汰。
- 这个算法易于理解和实现,但可能会出现 Belady现象,也称为FIFO异常
- 也就是当内存页帧数增加时反而导致页面错误率增加。
CLOCK(时钟):
- 这是一种改善版的FIFO算法,它设置了一个循环链表装载页面,有一个指针指向最旧的页面
- 每次置换从这个指针开始搜索,若此位置页面未被访问,则置换,否则取消访问位,并前移此指针。
这篇关于操作系统面试真题总结(七)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!