操作系统面试题

能理解最好,不理解先背,不要花太多时间

进程与线程概念

进程:是并发执行程序在之执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位
线程:是进程的一个执行单元,是进程内调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。
协程:是一种比线程更加轻量级的存在。一个线程可以拥有多个协程。其执行过程更类似于子例程,或者说不带返回值的函数调用。

区别
  • (1) 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
  • (2) 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行
  • (3) 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的资源。
  • (4)系统开销:在创建或撤销进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤销线程的开销
状态

状态:运行、阻塞、挂起阻塞、就绪、挂起就绪
状态之间的转换:准备就绪的进程,被CPU调度执行,变成运行状态;
运行中的进程,进行I/O请求或者不能得到所请求的资源,变成阻塞态;
运行中的进程,进程执行完毕(或时间片已到),变成就绪态;
将阻塞态进程挂起,变成挂起阻塞态,当导致进程阻塞的I/O操作在用户重启进程前完成(称之为唤醒),挂起阻塞态变成挂起就绪态,当用户在I/O操作结束之前重启进程,挂起阻塞态变成阻塞态;
将就绪(或运行)中的进程挂起,变成挂起就绪态,当该进程恢复之后,挂起就绪态变成了就绪态;

同步

当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源。例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件中的字符数。当然,在把整个文件调入内存之前,统计它的计数是没有意义的。但是,由于每个操作都有自己的线程,操作系统会把两个线程当作是互不相干的任务分别执行,这样就可能在没有把整个文件装入内存时统计字数。为解决此问题,你必须使两个线程同步工作。

所谓同步,是指散布在不同进程之间的若干程序片段,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定任务。如果用对资源访问来定义的话,同步是指在互斥的基础上(大多数情况),通过其他机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是可以允许多个访问者同时访问资源。

所谓互斥,是指散布在不同进程之间的若干程序片段,当某个进程运行其中的一个程序片段时,其他进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。如果用对资源的访问来定义的话,互斥某一资源同时只允许一个访问者对其进行访问,具有唯一性和排他性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

死锁
死锁概述

定义:
如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程就是死锁的

死锁的四个必要条件:

  • 互斥: 在一个时间只能有一个进程使用资源
  • 持有并等待: 进程保持至少一个资源正在等待获取其他进程持有的额外资源。
  • 不可抢占: 一个资源只能在进程已经完成了它的任务之后,被自愿释放。
  • 循环等待: 在存在n个进程,进行循环等待所占资源。

对于死锁的处理方法:死锁预防,死锁避免,死锁检测,死锁恢复

死锁的预防

预防死锁的思想就是设计一种方法,一定不会出现死锁,即破坏死锁出现的四个必要条件。

1.破坏互斥

让共享资源不是必须的,必须占用非共享资源。
缺点:扼杀了共享资源,系统有了很大的局限性

2.破坏请求和保持

必须保证当一个进程请求的资源,它不持有任何其他资源
缺点:需要进程请求并分配其所有资源,它开始执行之前或允许进程请求资源仅当进程没有资源,资源利用率很低,可能引发饥饿。
改进后的方法 允许一个进程只获得运行初期所需的资源,便开始运行,运行过程中再逐步释放不用的资源,请求新的资源。能够提高设备的利用率,减少进程发生饥饿的几率。

3.破坏不可抢占

如果进程占有某些资源,并请求其他不能被立即分配的资源,则释放当前正占有的资源。

实现细节
1.被抢占资源添加到资源列表中。
2.只有当它能够获得旧的资源并且请求新的资源存在,进程可以得到执行。

缺点:
实现复杂,代价高

4.破坏循环等待

对所有资源类型进行排序并且赋上序号,要求每个进程按照资源的顺序进行申请。如果需要多种资源,必须先请求序号低的资源,再请求序号高的。如果占有序号高的又想请求序号低的,必须释放所有序号大于低序号的资源。采用这种线性方式,能够打破循环等待的条件。

缺点:
1.资源的序号必须相对稳定,限制新设备的增加
2.作业使用各类资源的顺序与系统规定的顺序不同,造成浪费
3.增加用户程序编程时的代价,必须按照规定次序申请资源

死锁的避免

既然死锁的预防策略都显得特点的极端,就看看哪些避免策略。避免死锁抓住了进程请求资源的这一契机,进程请求资源时先判断会不会产生死锁,如果会就不给。而不是基于破坏死锁的必要条件的考虑。

主要思路:
  • 1.最简单和最有效的模式时要求每个进程声明它可能需要的每个类型资源的最大数目。
  • 2.资源的分配状态是通过限定与分配的资源数量和进程的最大需求。
  • 3.死锁避免算法动态检查的资源分配状态,以确保永远都不会有一个环形等待状态
银行家算法 直接看别人的资料吧

银行家算法是用于避免死锁的算法
前提条件

  • 1)多个实例
  • 2)每个进程都必须能最大限度的利用资源
  • 3)当一个进程请求一个资源,就不得不等待
  • 4)当一个进程获得所有的资源就必须在一段有限的时间释放他们
需要的数据结构

n = 进程数量, m = 资源类型数量
Max(总需求量): n x m 矩阵。 如果 Max[i,j]=k, 表示进程Pi 最多请求资源类型Rj的K个实例
Available(剩余空闲量): 长度为m的向量。如果Available[j] = k, 有k个类型Rj的资源实例可用。
Allocation(已分配量): nxm 矩阵。 如果allocation[i,j] = k, 则Pi当前分配了k个Rj的实例
Need(未来需要量): n x m 矩阵。如果Need[i,j]=k,则Pi可能需要至少k个Rj实例完成任务。

need[i,j] = Max[i,j] - Allocation[i,j]

银行家算法

银行家算法主要用于资源的预分配判断记录各个变量的改变

在这里插入图片描述

死锁检测和恢复

死锁检测则说明运行系统进入死锁状态,基于死锁检测算法判断是否初于死锁状态,如果进入死锁状态就触发恢复机制。

死锁检测算法

设置Availabel,Allocation, Request 变量。和安全算法很像。
1.初始化:Work=Available。遍历进程,当Allocation[i,j] > 0 , Finish[i] = false; 否则Finish[i] = true.
解释:work和finish分别是长度为m和n的向量。Allocation[i,j]>0, 说明进程持有资源。此时把不占用资源的进程都计入表中。
2.找到Finish[i] == false && Resquest[i,j] <= Work, 没有则转到步骤4.
解释:把持有资源并且Request[i,j] <= Work 的进程进行预分配,
3.Work[j] = Work[j] + Allocation[i,j]; Finish[i] = ture。 转到步骤2
解释:让进程释放资源,增加工作向量,能够正常的结束的进程,记录到表中。
4.如果有一个进程处于false,则处于不安全状态
此算法的时间复杂度是O m X n X n

总结 由于死锁出现的概率比较小 ,银行家算法以及检测算法的开销都比较大,而且需要预知进程对资源的最大需求数,因此一般用于系统调试,而不会真正的用于操作系统的运行中。

死锁的解除

最常用的就是抢占资源终止进程
终止
撤销陷入死锁的全部进程;
逐个撤销陷于死锁的进程,直到死锁不存在。

抢占
从陷入死锁的进程中逐个强迫放弃所占用的资源,直到死锁消失
从另外的进程中强行剥夺足够数量的资源分配给死锁进程,以解除死锁状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值