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

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

相关文章

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

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