操作系统笔记(一)

一概述

  OS为了并发,从而引入了进程,但是进程引入只是起步,必须要深入了解一下进程。从进程的概念开始,进程控制块(PCB),进程的几种状态(创建·、就绪、运行、等待、结束)及其转换条件(图),这还只是基础,进而我们需要使用进程来满足并发需求。

  由于多个进程之间可能存在协作关系,于是需要解决多进程间的通信问题,(共享内存块、消息机制),进程通信又可以依据进程间是否在一台机器中划分。如果多进程在不同系统里的话,就引出了RPC(远程程序调用)。

  进程有很多,他们之间又有哪些关系呢?有序列关系或者无关系,或者互斥,这是就需要进程同步控制了(硬件同步、信号量机制),有了前面的基础,后面我们可以真正开始着手实现并发,即进程的调度,并发也是有前提的(即并发的进程不能存在序列关系),其本质是充分利用CPU资源,不让计算资源浪费,比如一个进程在进行I/O操作,那么此时就应该调用其他进程进行计算操作,还有就是,现在的多处理器的存在,于是,多任务的并发执行成为了必然。

  那么如何组织进程,或者线程间的调度问题呢,我们有几种经典调度算法(FIFO、SJF、优先权调度,round robin、最高响应比、多级反馈调节算法等),其本质都是为了,充分利用cpu的同时,还要保证用户体验和实际情况,比如响应时间不能太久,每个任务都要能处理,等待时间不能太久,或者用户的那种独享的体验,等分为抢占式调度(主流)非抢占式调度,在选择调度算法的时候是有指标可以依据的,但这些指标是不同方面的展现,所以存在一定的矛盾,某种算法不可能全部能够满足的,这些指标有吞吐量、响应时间、等待时间、等。

进程间的关系:进程树的存在,即父进程创建子进程,递归创建,当然,父进程关闭时子进程也将关闭,子进程完成时,其资源也就被回收给父进程或者给系统。

进程与线程的关系:线程是轻量级进程,是操作系统最基本的调度单位却不是资源分配单位,而进程则是拥有资源的,比如内存,处理机资源等,即首先系统把资源分配给进程,接着系统调用线程,但线程必须有其进程,其从属进程的资源是其上限,线程间共享进程的资源,也就更容易进行线程间的切换了,有利于并发性的性能提升。

进程并发与同步存在的问题:死锁。首先由于系统资源有限,为实现并发肯定有多个进程,那么每个进程都要申请一定资源,如果几个进程都拥有一部分资源,那么如果无法拥有自己需要的所有资源,并且无法对其他进程拥有的资源进行剥夺时,谁也无法执行,这种现象即为死锁。

死锁有四个必要条件,即这四个条件必须同时满足,死锁才可能形成。

①互斥:至少有一个资源必须处于非共享模式,即只有互斥访问才可能出现资源缺乏的情况

②占有并等待:占有并等待,即每个进程首先要拥有一定互斥资源,又同时需要一些其他资源才能运行

③非抢占:资源不能被抢占,即资源只能在进程完成任务后自动释放

④循环等待:即进程间资源等待关系需要是个环,只有这样才可能死锁,反之,则总有进程能够执行,然后释放资源,也就不存在死锁了。

那么对于死锁,OS就有几种处理方案

1)使用协议来预防或者避免死锁,确保系统不会进入死锁状态

2)允许系统进入死锁,发生后再对死锁进行检测,恢复

3)忽视死锁

然而,最不安全的3)却成为了绝大多数的首选。于是,死锁的处理环节落到了应用程序员身上。

接下来,分别从死锁预防、死锁避免、死锁检测和死锁解除来介绍。

首先我们来看看死锁预防,由上文介绍的死锁四个必要条件,我们想,如果破坏四个之一,是不是就可以有效进行死锁预防了呢。

接下来,我们看看哪个比较容易破坏:

  对于互斥条件,对于OS中,很多资源确实需要互斥性地使用,否则可能出现内容破坏(比如,同一文件不能同时支持写操作)等结果,所以互斥,在很多时候是需要保护的,故不予考虑。

  对于占有并等待,我们可以通过一次性分类,进程所需要的全部资源,或者只允许进程在没有资源的时候才允许继续申请资源,即想申请资源首先要释放已拥有的资源。

  关于破坏非抢占,可以通过设计一种抢占式的协议,比如,如果一个·进程占有资源并申请一个不能立即获得的资源,则允许它拥有的资源被抢占。设计得当,还是可以实现的。

  为破坏循环等待,我们可以为资源类型进行排序,且要求每个进程按递增顺序来申请资源。这样便会使得某些资源只能被某个拥有高资源类型进程申请,而想申请低序号资源,必须先释放已经拥有的高序号资源,所以不会形成环。

no free lunch,死锁避免带来的副作用,便是降低了设备使用率和系统吞吐率,给的限制那么多,效率能不低吗,这也不能用那也不能申请的。于是,死锁避免便有了市场。

  避免死锁的一种重要方法,即获得以后如何申请资源的附加信息。依据这一方法,设计出了死锁避免算法,如银行家算法,它动态地检测资源分配状态以确保循环等待条件不可能成立,让进城始终处理安全状态。算法的具体细节这里不再赘述。

  死锁检测与恢复:这个技术是对没有前面的死锁预防与避免的情况下,具体而言,对于每种资源类型只有单个实例的情况可使用等待图,然后检测图中是否存在环来判断死锁存在与否;而对于每种资源类型有多个实例的情况处理则与银行家算法类似,这里不再详述;当死锁检测确定已经发生,则可采取以下措施:

1)通知操作员死锁发生,以便人工处理死锁;

2)让系统从死锁状态中自动恢复过来可让进程分别死锁必要条件中的非抢占与循环等待条件:

  ①简单终止一个或多个进程以打破循环等待;

  ②从一个或多个死锁进程那里抢占一个或多个资源;

  死锁原因:①资源有限;(互斥)②进程推进顺序不当;③各个进程已经获得的资源又不能被剥夺;(请求和保持)④成环,(循环等待、无线等待)

posted @ 2019-09-11 17:00  云之意逸  阅读(128)  评论(0)    收藏  举报