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

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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

Linux操作系统 初识

在认识操作系统之前,我们首先来了解一下计算机的发展: 计算机的发展 世界上第一台计算机名叫埃尼阿克,诞生在1945年2月14日,用于军事用途。 后来因为计算机的优势和潜力巨大,计算机开始飞速发展,并产生了一个当时一直有效的定律:摩尔定律--当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 那么相应的,计算机就会变得越来越快,越来越小型化。

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel