操作系统面试真题总结(七)

2024-09-05 11:04

本文主要是介绍操作系统面试真题总结(七),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章收录在网站: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算法,它设置了一个循环链表装载页面,有一个指针指向最旧的页面
    • 每次置换从这个指针开始搜索,若此位置页面未被访问,则置换,否则取消访问位,并前移此指针。

这篇关于操作系统面试真题总结(七)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138774

相关文章

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解