操作系统 锁原理_操作系统互斥锁实现原理 - CSDN
  • 操作系统原理-死锁

    2019-06-18 15:11:25
    系统模型 如果一个进程申请某个资源类型的一个实例,分配这种类型的任何实例都可以满足申请 进程在使用资源前应当申请资源,在使用资源应当释放资源 进程在正常操作模式下只能按如下顺序使用资源 申请 进程请求...

    死锁

    如果申请的资源被其他等待进程占有,该等待进程有可能再也无法改变状态

    系统模型

    1. 如果一个进程申请某个资源类型的一个实例,分配这种类型的任何实例都可以满足申请
    2. 进程在使用资源前应当申请资源,在使用资源应当释放资源
    3. 进程在正常操作模式下只能按如下顺序使用资源
    • 申请 进程请求资源,如果不能被立即允许,则申请进程等待直到能获得该资源为止
    • 使用 进程对资源进行操作
    • 释放 进程释放资源
    1. 当一组进程内的每个进程都在等待一个事件,而这一事件只能由这一组进程的另一个进程引起,那么这组进程就处于死锁状态

    死锁特征

    死锁必要条件

    1. 互斥 至少有一个资源处于非共享模式
    2. 占用并等待 一个进程应占用至少一个资源,并等待另一个被其他进程占有的资源
    3. 非抢占 资源不能被抢占,而是在进程完成任务后被释放
    4. 循环等待 一组等待进程,每个进程等待的资源被另一个进程占用

    资源分配图

    1. 系统资源分配图是有向图,以PiP_i 表示进程 RjR_j表示申请的资源,有向边Pi>RjP_i->R_j 称为申请边,而有向边Rj>PiR_j->P_i称为分配边,申请边表示进程申请了资源类型的一个实例且正在等待这个资源,而分配边表示资源的一个实例已经分配给了进程
    2. 如果分配图没有环,那么系统就没有进程死锁。如果分配图有环,那么可能存在死锁。即如果每个资源类型恰好有一个实例,那么有环就意味着已经出现死锁,如果每个资源类型有多个实例,那么有环并不意味着已经出现死锁。因此只要资源分配图没有环,系统就不处于死锁状态。

    死锁处理方法

    1. 一般有三种方法:通过协议来预防或避免死锁,确保系统不会进入死锁状态;允许系统进入死锁状态,然后检测它并加以修复;忽略这个问题,认为死锁不会在系统内发生
    2. 死锁预防:确保一个死锁必要条件不成立;死锁避免:操作系统事先得到有关进程申请资源和使用资源的额外信息。进而确定对于每个申请,进程是否应当等待。
    3. 但是忽略死锁的可能性,有可能比其他方法效果更好,对于某些系统,死锁很少发生,因此相比于使用频繁的且开销昂贵的死锁预防、死锁避免、死锁检测和恢复相比,直接忽略更好。

    死锁预防

    互斥

    互斥条件必须成立,至少有一个资源是非共享的

    占用并等待

    1. 一种是每个进程在执行前申请并获得所有资源,即申请资源的系统调用在所有其他系统调用之前进行
    2. 另一种是进程没有资源时才可以申请资源,即进程在申请资源前必须释放已经分配的所有资源
    3. 第一种协议的资源利用率可能比较低,因为许多资源可能被分配但是不被使用;而且可能发生饥饿,因为申请的资源可能被另一个进程占用

    无抢占

    1. 规则是如果一个进程持有资源且申请另一个不能被立即分配的资源,那么它现在分配的资源都可抢占;
    2. 如果进程申请资源,首先检查是否可用,如果不可用,检查是否分配给等待额外资源的其他进程,并抢占这些资源,否则等待,且在等待时,别的进程也可抢占该进程的资源
    3. 这个协议通常用于状态可以保存或者恢复的资源,如CPU寄存器和内存,不适用于互斥锁和信号量

    循环等待

    对所有资源类型进行完全排序,而且要求每个进程按照递增顺序申请资源,常用方法是为每个资源类型分配一个唯一整数,进而比较两个资源以确定其先后顺序

    1. 每个进程只能按照递增顺序来申请资源。即一个进程开始时可以申请任何数量资源类型RjR_j的实例,之后当且仅当F(Rj)>F(Ri)F(R_j)>F(R_i) 时,进程才可以申请RiR_i的实例,进而防止了循环等待条件发生
    2. 设计了一个完全排序或者层次结构本身并不能防止死锁,而是要靠顺序编写的程序,且也有机制来检查锁顺序,如果不按顺序申请,该机制会发出死锁的警告。

    死锁避免

    通过死锁预防来避免死锁是有副作用的,设备使用率低和系统吞吐率低,而死锁避免这种方式会需要额外的信息(进程如何申请资源),根据信息,系统可以决定在每次请求时进程是否等待以避免未来可能的死锁。在这种方法下,每个进程都应当声明可能需要的每种类型的资源的最大数量。

    1. 死锁避免算法动态检查资源分配状态,以便确保循环等待条件不能成立,资源分配状态包括可用的资源、已分配的资源和进程的最大需求。

    安全状态

    1. 如果系统能按一定顺序为每个进程分配资源,且避免死锁,那么系统的状态就是安全的,只有存在一个安全序列,系统才处于安全状态。
    2. 安全序列是指一个进程序列<P1,P2,Pn><P_1, P_2,… P_n> 对于PiP_i 其仍然可以申请的资源数小于当前可用资源加上所有进程PjP_j所占有的资源,这种情况下,PiP_i申请的资源不能立即可用,可以等待别的进程释放资源,再完成任务
    3. 如果没有这样的序列,那系统是非安全的,安全状态不会发生死锁,且死锁状态是非安全状态的子集,因为非安全状态下操作系统不能阻止进程申请资源。
    4. 根据安全状态可以定义避免算法,其核心是当进程申请一个可用资源时,系统应确定资源申请是可以立即分配还是让进程等待。
      采用这种方法,如果进程申请一个现在可用的资源,那么它可能仍然需要等待其他进程释放,因此与没有采用死锁避免算法相比,资源使用率可能更低

    资源分配图算法

    如果每种资源只有一个实例,那么资源分配图有环就代表出现死锁。我们引入新类型的边称为需求边,表示进程可能在将来某个时候申请资源RjR_j 类似于同一方向的申请边,但是用虚线表示。进程申请资源时,需求边变成申请边,进程释放资源时,分配边变成需求边。

    1. 所以 死锁避免算法只有在将申请边变为分配边且不会导致资源分配图产生环时,才能允许申请;(环检测算法的时间复杂度为n2n^2) 如果有环存在,那么分配会使得系统进入不安全状态,此时进程应当等待。

    银行家算法

    对于每种资源有多个实例,出现环也不一定会死锁,故提出银行家算法

    1. 当一个新的进程进入系统时,应当声明可能需要的每种类型资源实例的最大数量,不能超过系统资源的总和,即用户申请一组资源时,系统应确定这些资源的分配是否仍会使系统处于安全状态
    2. 数据结构有:Available 长为m的向量表示每种资源的可用实例数量 Max 为nxm的矩阵,定义每个进程的最大需求 Allocation nxm矩阵,定义每个进程现在分配的每种资源类型的实例数量 Need nxm矩阵,表示每个进程还需要的剩余资源。
    3. 安全算法:
    • WorkFinish分别为长度m和n的向量,对于i=0,1,n1i=0,1 \dots,n-1 初始化Work = AvailableFinish[i] = false
    • 查找这样的i使其满足 Finish[i] == false Need_i <= Work 如果没这样的i就转到第四步
    • Work = Work + Allocation_i Finish[i] = true 返回第二步
    • 如果对于所有i Finish[i] = true 那么系统处于安全状态
    1. 资源请求算法
    • Request_i为进程RiR_i的请求向量,如果Request_i[j] == k 那么 进程PiP_i 需要资源类型RjR_j 的实例数量为k
    • 如果Requesti&lt;=NeediRequest_i&lt;=Need_i 转到第二步,否则生成出错条件,因为进程申请的超过了需求
    • 如果Requesti&lt;=AvailableRequest_i&lt;=Available 转到第三步,否则应当等待新资源
    • 如果可以分配资源,就应当按下方式修改状态Available=AvailableRequestiAllocationi=Allocationi+RequestiNeedi=NeediRequestiAvailable = Available-Request_i \\ Allocation_i = Allocation_i+Request_i\\Need_i = Need_i -Request_i
    • 如果新的资源分配是安全的,那么交易完成且进程分配到自己想要的资源,如果不安全,进程应当等待Request_i 并回复原来的资源分配状态

    死锁检测

    如果一个系统不采用死锁预防也不采用死锁避免算法,那么系统可以提供:一个用来检查系统状态从而确定是否出现死锁的算法,以及一个用来从死锁状态中恢复的算法

    单个实例

    1. 每种资源类型只有单个实例,可以通过资源分配图的变形——等待图来确定是否存在死锁。即从资源分配图中删除所有资源类型节点,合并适当边
    2. 等待图的边意味着一个进程等待另一个进程释放所需的资源,当且仅当等待图中有一个环,系统死锁,因此为了检测死锁需要维护一个等待图,并周期调用搜索图中环的算法,从图中检测环的算法需要n2n^2 数量级的操作。

    多个实例

    1. Available 长度为m的向量,表示各种资源的可用实例数量 Allocation nxm矩阵,表示每个进程每种资源的当前分配数量 Request nxm矩阵 表示当前每个进程每种资源的当前请求
    2. 算法为:
    • WorkFinish 分别为长度m和n的向量,初始化Work=Availble 如果Allocation_i不为0,则Finish[i]=false 否则Finish[i] = true
    • 寻找i,满足Finish[i] ==falseRequest_i <= Work 没有的话转到第四步
    • Work = Work + Allocation_i Finish[i] = true 转到第二步
    • 如果对于某个i Finish[i] == false则系统死锁 且进程PiP_i 造成了死锁

    应用检测算法

    若经常发生死锁,就应该经常调用检测算法,分配给死锁进程的资源会一直空闲,直到死锁被打破

    1. 只有当每个进程提出请求且得不到满足时,这一请求可能是完成等待进程链的最后请求,所以极端情况下每次分配请求不能被允许时,就调用死锁检测算法,这种情况下不仅能确定哪些进程死锁,且可以确定哪个特定进程造成了死锁
    2. 对于每个请求都调用死锁检测算法会造成较大开销,另一个方法是每隔一定时间调用死锁检测算法,或者当CPU使用率低于40%时

    死锁恢复

    一种方法是通知用户死锁发生,一种是让系统从死锁状态中自动恢复,打破死锁同样有两种选择:一个是简单地中止一个或者多个进程来打破循环等待另一个是从一个或者多个死锁进程抢占一个或者多个资源

    进程终止

    1. 中止所有死锁进程,代价较大;或者一次中止一个进程,直到消除死锁循环为止
    2. 中止一个进程并不简单,如果采用部分中止方法,我们应当决策哪个/哪些 死锁进程应当被中止,通常会中止造成最小代价的进程,但是这个最小代价其实并不精确。

    资源抢占

    我们通过抢占进程的资源给其他进程使用,直到打破死锁循环。

    1. 需要处理三个问题: 选择牺牲进程:抢占哪些资源和哪些进程?应确定抢占的顺序使得代价最小。回滚:因为从进程那里抢占了资源,所以应当将进程回滚到安全状态,通常回滚到足够打破死锁的状态。饥饿 如果基于代价来选择牺牲进程,有可能一个进程总被选为牺牲进程,就永远不能完成指定任务。通常确保进程只能有限次地被选择为牺牲进程

    习题

    1. 互斥:一个车辆的位置不能被其他车辆占用 请求保持:一个车辆占用一个位置,并想要行驶到下一位置 非抢占:在其他车辆占用位置时,自车无法强行行驶 循环等待:每一辆车都在等待前方车辆行驶 。 解决办法就是车辆右侧车先行
    2. 是的,资源互斥(一个变量不能同时有多个写者),写者可以请求保持,锁无法被抢占,线程可能发生循环等待
    3. 如果先运行第一个任务,且先获取了两个锁,那么第二任务就会阻塞,不会发生死锁,如果第一个任务获取了第一个锁,紧接着调度第二个任务让其获得了第二个锁,那么就会发生死锁。
    void transaction(Account from, Account to, double amount)
    {
    	mutex lock1,lock2;
    	sort(from,to);//对账户进行排序
    	lock1=get_lock(from);
    	lock2=get_lock(to);
    	acquire(lock1)
    		acquire(lock2)
    			withdraw(from,amount);
    			deposit(to,amount);
    		release(lock2);
    	release(lock1);
    }
    
    1. 循环等待方法由于需要按顺序申请,即需要对同步对象进行完全排序,所以增加了运行时开销,但是吞吐量没有收到影响;安全状态需要在分配时进行检测,故增加了运行时开销,减少了吞吐量,资源使用率低;资源分配图算法需要调用环检测算法。增加了运行时开销。银行家算法需要对资源进行检测,增加运行时开销
    2. a 安全的 b 资源数量减少,可能造成进程等待资源 c 需求的资源增加,可能使得进程等待资源 d 安全的 e 如果进程申请的资源恰巧是其他进程所需要的,也可能发生死锁 f 是安全的
    3. 假设该系统陷入死锁,那么说明每一个进程持有一个资源,等待另一个资源,但是由于有四个实例,所以进程会获取第二个资源,最终将资源返回,因此不会发生死锁。
    4. 如果一个哲学家请求第一根筷子时,没有其他哲学家有两根筷子或者只剩下一根,那么请求就不被允许
    5. (1) 哲学家有两只筷子,且还剩两只 (2) 已经有一只筷子, 且还剩两只 (3) 至少剩一只筷子,但是至少有一个哲学家有三只筷子 (4) 没有筷子,但是剩两只筷子, 且至少一个有两只筷子的哲学家放下他的筷子
    6. 如果系统中存在A B C三种资源,且多资源类型的银行家算法如果不能满足要求,则可能拆分资源类型,就会满足要求了。
    7. 顺序 为 2->1->0->3->4 第二个1->0->2->3->4
    8. 按0->1->2->3->4 即可 b. 可以立即允许这一请求 c. 不能立即允许这一请求 ,因为会造成C资源不足以分配给其他进程,且p4也无法获取足够的资源,形成死锁
    9. 乐观假设是资源分配和进程请求资源的过程中不存在任何的循环等待。那违反当然就是产生循环等待了。
    typedef struct
    {	
    	int value;
    }semaphore;
    void BridgeN(semaphore *S)
    {	
    	wait(S);
    	/*do something*/
    	signal(S);
    }
    void BridgeS(semaphore *S)
    {
    	wait(S);
    	/*do something */
    	signal(S);
    }
    
    展开全文
  • 在多线程编程中,为了保证数据操作的一致性,操作系统引入了机制,用于保证临界区代码的安全。通过机制,能够保证在多核多线程环境中,在某一个时间点上,只能有一个线程进入临界区代码,从而保证临界区中操作...

    转自:http://blog.sina.com.cn/s/blog_75f0b54d0100r7af.html


    在多线程编程中,为了保证数据操作的一致性,操作系统引入了锁机制,用于保证临界区代码的安全。通过锁机制,能够保证在多核多线程环境中,在某一个时间点上,只能有一个线程进入临界区代码,从而保证临界区中操作数据的一致性。


    所谓的锁,说白了就是内存中的一个整型数,拥有两种状态:空闲状态和上锁状态。加锁时,判断锁是否空闲,如果空闲,修改为上锁状态,返回成功;如果已经上锁,则返回失败。解锁时,则把锁状态修改为空闲状态。

    看起来很简单,大家有没有想过,OS是怎样保证这个锁操作本身的原子性呢?举个例子,在多核环境中,两个核上的代码同时申请一个锁,两个核同时取出锁变量,同时判断说这个锁是空闲状态,然后有同时修改为上锁状态,同时返回成功。。。两个核同时获取到了锁,这种情况可能吗?废话,当然是不可能,可能的话,我们使用锁还有啥意义。但是,咦?等等,虽然我知道肯定不可能,但是你刚才说的貌似还有点道理,看来OS实现这个锁还不是看起来这么简单,还是有点道道的。

    为了弄明白锁的实现原理,我们首先看看如果OS不采用任何其他手段,什么情况下会导致上锁失败?假如我们把加锁过程用如下伪码表示:
    1、read lock;
    2、判断lock状态;
    3、如果已经加锁,失败返回;
    4、把锁状态设置为上锁;
    5、返回成功。
    明白汇编的同学一看就明白上述每一步都能对应到一条汇编语句,所以我们可以认为每一步本身是原子的。

    那么什么情况能够导致两个线程同时获取到锁呢?
    1、中断:假设线程A执行完第一步,发生中断,中断返回后,OS调度线程B,线程B也来加锁并且加锁成功,这时OS调度线程A执行,线程从第二步开始执行,也加锁成功。
    2、多核:当然了,想想上面举的例子,描述的就是两个核同时获取到锁的情况。

    既然明白锁失败的原因,解决手段就很明确了:
    先考虑单核场景:
    1、既然只有中断才能把上锁过程打断,造成多线程操作失败。我先关中断不就得了,在加锁操作完成后再开中断。
    2、上面这个手段太笨重了,能不能硬件做一种加锁的原子操作呢?能,大名鼎鼎的“test and set”指令就是做这个事情的。(怎么,test and set是干什么的?同学,看来你上课时不够专心啊,赶紧回头复习复习)

    通过上面的手段,单核环境下,锁的实现问题得到了圆满的解决。那么多核环境呢?简单嘛,还是“test and set”不就得了,这是一条指令,原子的,不会有问题的。真的吗,单独一条指令能够保证该指令在单个核上执行过程中不会被中断打断,但是两个核同时执行这个指令呢?。。。我再想想,硬件执行时还是得从内存中读取lock,判断并设置状态到内存,貌似这个过程也不是那么原子嘛。对,多个核执行确实会存在这个问题。怎么办呢?首先我们得明白这个地方的关键点,关键点是两个核会并行操作内存而且从操作内存这个调度来看“test and set”不是原子的,需要先读内存然后再写内存,如果我们保证这个内存操作是原子的,就能保证锁的正确性了。确实,硬件提供了锁内存总线的机制,我们在锁内存总线的状态下执行test and set操作,就能保证同时只有一个核来test and set,从而避免了多核下发生的问题。

    总结一下,在硬件层面,CPU提供了原子操作、关中断、锁内存总线的机制;OS基于这几个CPU硬件机制,就能够实现锁;再基于锁,就能够实现各种各样的同步机制(信号量、消息、Barrier等等等等)。所以要想理解OS的各种同步手段,首先需要理解本文介绍的内容,这时最原点的机制,所有的OS上层同步手段都基于此。

    希望介绍清楚了:),祝各位同学学习愉快!

    版权所有:浮云随风,转载请注明出处(http://blog.sina.com.cn/u/1978709325
    展开全文
  • 在多线程编程中,为了保证数据操作的一致性,操作系统引入了机制,用于保证临界区代码的安全。通过机制,能够保证在多核多线程环境中,在某一个时间点上,只能有一个线程进入临界区代码,从而保证临界区中操作...

    在多线程编程中,为了保证数据操作的一致性,操作系统引入了锁机制,用于保证临界区代码的安全。通过锁机制,能够保证在多核多线程环境中,在某一个时间点上,只能有一个线程进入临界区代码,从而保证临界区中操作数据的一致性。

    所谓的锁,说白了就是内存中的一个整型数,拥有两种状态:空闲状态和上锁状态。加锁时,判断锁是否空闲,如果空闲,修改为上锁状态,返回成功;如果已经上锁,则返回失败。解锁时,则把锁状态修改为空闲状态。

    看起来很简单,大家有没有想过,OS是怎样保证这个锁操作本身的原子性呢?举个例子,在多核环境中,两个核上的代码同时申请一个锁,两个核同时取出锁变量,同时判断说这个锁是空闲状态,然后有同时修改为上锁状态,同时返回成功。。。两个核同时获取到了锁,这种情况可能吗?废话,当然是不可能,可能的话,我们使用锁还有啥意义。但是,咦?等等,虽然我知道肯定不可能,但是你刚才说的貌似还有点道理,看来OS实现这个锁还不是看起来这么简单,还是有点道道的。

    为了弄明白锁的实现原理,我们首先看看如果OS不采用任何其他手段,什么情况下会导致上锁失败?假如我们把加锁过程用如下伪码表示:
    1、read lock;
    2、判断lock状态;
    3、如果已经加锁,失败返回;
    4、把锁状态设置为上锁;
    5、返回成功。
    明白汇编的同学一看就明白上述每一步都能对应到一条汇编语句,所以我们可以认为每一步本身是原子的。

    那么什么情况能够导致两个线程同时获取到锁呢?
    1、中断:假设线程A执行完第一步,发生中断,中断返回后,OS调度线程B,线程B也来加锁并且加锁成功,这时OS调度线程A执行,线程从第二步开始执行,也加锁成功。
    2、多核:当然了,想想上面举的例子,描述的就是两个核同时获取到锁的情况。

    既然明白锁失败的原因,解决手段就很明确了:
    先考虑单核场景:
    1、既然只有中断才能把上锁过程打断,造成多线程操作失败。我先关中断不就得了,在加锁操作完成后再开中断。
    2、上面这个手段太笨重了,能不能硬件做一种加锁的原子操作呢?能,大名鼎鼎的“test and set”指令就是做这个事情的。(怎么,test and set是干什么的?同学,看来你上课时不够专心啊,赶紧回头复习复习)

    通过上面的手段,单核环境下,锁的实现问题得到了圆满的解决。那么多核环境呢?简单嘛,还是“test and set”不就得了,这是一条指令,原子的,不会有问题的。真的吗,单独一条指令能够保证该指令在单个核上执行过程中不会被中断打断,但是两个核同时执行这个指令呢?。。。我再想想,硬件执行时还是得从内存中读取lock,判断并设置状态到内存,貌似这个过程也不是那么原子嘛。对,多个核执行确实会存在这个问题。怎么办呢?首先我们得明白这个地方的关键点,关键点是两个核会并行操作内存而且从操作内存这个调度来看“test and set”不是原子的,需要先读内存然后再写内存,如果我们保证这个内存操作是原子的,就能保证锁的正确性了。确实,硬件提供了锁内存总线的机制,我们在锁内存总线的状态下执行test and set操作,就能保证同时只有一个核来test and set,从而避免了多核下发生的问题。

    总结一下,在硬件层面,CPU提供了原子操作、关中断、锁内存总线的机制;OS基于这几个CPU硬件机制,就能够实现锁;再基于锁,就能够实现各种各样的同步机制(信号量、消息、Barrier等等等等)。所以要想理解OS的各种同步手段,首先需要理解本文介绍的内容,这时最原点的机制,所有的OS上层同步手段都基于此。

    展开全文
  • 操作系统原理

    2019-09-08 13:16:26
    目录 目录 ... 操作系统原理1 —— 概念 >> 操作系统原理2——OS结构 >> 操作系统原理3——多道程序 >> 操作系统原理4——存储管理 >> 操作系统原理5——文件管理 ...

    原文链接:https://www.cnblogs.com/engine1984/category/155390.html

     

    目录

    目录

    >> 操作系统原理1 —— 概念

    >> 操作系统原理2 —— OS结构

    >> 操作系统原理3 —— 多道程序

    >> 操作系统原理4 —— 存储管理

    >> 操作系统原理5 —— 文件管理

    >> 操作系统原理6 —— 设备管理

    >> 操作系统原理7 —— 作业管理

    >> 操作系统原理8 —— CPU管理,进程

    >> 操作系统原理9 —— 死锁


    >> 操作系统原理1 —— 概念

    学习操作系统,首先我们应该知道操作系统的概念。本章主要讲述了以下几个问题。

    1. 什么是操作系统
    2. 操作系统的形成
    3. 操作系统的类型
    4. 操作系统的功能

    一、什么是操作系统

    在回答这个问题之前,我们先来了解一下什么是计算机系统。计算机系统是按用户的要求接收和存储信息、自动进行数据处理并输出结果信息的系统。

    计算机系统由硬件系统和软件系统组成。软硬件系统的组成部分就是计算机系统的资源,当不同的用户使用计算机时都要占用系统资源并且有不同的控制需求。

    操作系统就是计算机系统的一种系统软件,由它统一管理计算机系统的资源和控制程序的执行。

    操作系统的设计目标一是使计算机系统使用方便。二是使得计算机系统能高效地工作。

    二、操作系统的形成

    早期没有操作系统→原始汇编系统→管理程序→操作系统 可以看到,操作系统是随着计算机硬件的发展和应用需求的推动而形成的。

    三、操作系统的类型

    按照操作系统提供的服务,大致可以把操作系统分为以下几类:

    批处理操作系统、分时操作系统、实时操作系统、网络操作系统和分布式操作系统。其中批处理操作系统分时操作系统实时操作系统是基本的操作系统。

    1. 批处理操作系统按照用户预先规定好的步骤控制作业的执行,实现计算机操作的自动化。又可分为批处理单道系统和批处理多道系统。单道系统每次只有一个作业装入计算机系统的主存储器运行,多个作业可自动、顺序地被装入运行。批处理多道系统则允许多个作业同时装入主存储器,中央处理器轮流地执行各个作业,各个作业可以同时使用各自所需的外围设备,这样可以充分利用计算机系统的资源,缩短作业时间,提高系统的吞吐率。
    2. 分时操作系统,这种系统中,一个计算机系统与许多终端设备连接,分时系统支持多个终端用户,同时以交互方式使用计算机系统,为用户在测试、修改和控制程序执行方面提供了灵活性。分时系统的主要特点是同时性、独立性、及时性和交互性。
    3. 实时操作系统能使计算机系统接收到外部信号后及时进行处理,并在严格的规定时间内完成处理,且给出反馈信号。它是较少有人为干预的监督和控制系统。实时系统对可靠性和安全性要求极高,不强求系统资源的利用率。
    4. 网络操作系统可以把若干计算机联合起来,实现各台计算机之间的通信及网络中各种资源的共享,像我们现在使用的Windows ,UNIX和Linux等操作系统都是网络操作系统。
    5. 分布式操作系统的网络中各台计算机没有主次之分,在任意两台计算机间的可进行信息交换和资源共享。这一点上分布式操作系统和网络操作系统差别不大,他们的本质区别在于:分布式操作系统能使系统中若干计算机相互协作完成一个共同的任务。这使得各台计算机组成一个完整的,功能强大的计算机系统。

    四、操作系统的功能

    从资源管理的观点出发,操作系统功能可分为五大部分:处理器管理、存储管理、文件管理、设备管理和作业管理。


    >> 操作系统原理2 —— OS结构

    计算机系统是由硬件系统软件系统两部分组成,操作系统软件系统的一个组成部分,它是直接在硬件系统的基础上工作的,所以在研究操作系统之前,先必须对计算机系统的结构有一个基本的了解,本章就是讲述计算机系统结构的基本知识。

    本章的知识要点是:

    1. 计算机系统的层次结构
    2. 硬件环境
    3. 操作系统结构

    一、计算机系统的层次结构

    现代的通用计算机系统是由硬件和软件组成的一种层次式结构,最内层是硬件系统,最外层是使用计算机系统的人,人与硬件系统之间是软件系统。

    二、 硬件环境

    (1)CPU和外设的并行工作

    (2)I/O中断的作用

    (3)存储结构

    • 主存储器CPU能直接访问的唯一的存储空间,任何程序和数据都必须被装入主存储器之后,CPU才能对它进行操作。主存储器以“字节(BYTE)”为单位进行编址,若干字节组成一个“字(WORD)”。中央处理器可以按地址读出主存储器中的一个字节或一个字的内容。
    • 辅助存储器解决了主存储器容量不足,以及主存储器无法保存信息的问题。辅助存储器的优点是容量大且能永久保存信息,缺点是无法被中央处理器直接访问,必须通过主存储器才能访问。
    • 中央处理器存储信息的速度依次为:存取寄存器中的信息速度最快;通过系统总线存取主存储器的速度居中;使用辅助存储器的信息速度最慢。

        寄存器用来存放临时的工作信息和系统必须的控制信息。

        主存储器中存放操作系统的核心部分,以及当前需执行的程序和数据。

        辅助存储器是存放操作下的非核心部分和其他程序和数据。

        磁盘的信息可随机存取,磁带上的信息只能顺序存取。

    (4)硬件保护

        在资源共享的计算机系统中,只有有了必要的保护措施,才能使个别的错误不致影响其他程序。

    三、操作系统结构

    层次结构的最大特点是把整体问题局部化。把一个大型复杂的操作系统分解成若干单向依赖的层次,由各层的正确性来保证整个操作系统的正确性。

    采用层次结构,能使结构清晰,便于调试,有利于功能的增、删和修改,正确性容易得到保证,也提高了系统的可维护性和可移植性。

    操作系统的一种层次结构如下图所示:

    作业管理
    文件管理 
    设备管理
    存储管理
    处理器管理
    硬件

    >> 操作系统原理3 —— 多道程序

    通过本章学习应该掌握多道程序设计是如何提高计算机系统效率的;进程与程序有什么区别;进程的基本状态以及状态变化;进程队列及进程调度策略;中断的作用。

    一、 进程

    1. 进程的定义:把一个程序在一个数据集上的一次执行称为一个“进程”。
    2. 进程是由程序、数据集和进程控制块三部分组成。我们举一个例子,比如在有一个用户程序notepad.exe(记事本),当它存放在磁盘上时,就是一个程序,在windows操作系统下运行它时,就会在内存中建立一个记事本程序的进程,而我们在记事本中编辑的当前文字就是这个进程的数据集,操作系统会为当前的进程设置一个进程控制块。如果我们再打开一个记事本程序的窗口,就会建立另一个进程,此时运行的是同一个程序,但存在两个进程,第二个窗口中的编辑内容就是第二个进程的数据集
    3. 进程与程序 的区别及关系。程序是静止的,进程是动态的。进程包括程序和程序处理的对象(数据集),进程能得到程序处理的结果。进程和程序并非一一对应的,一个程序运行在不同的数据集上就构成了不同的进程。通常把进程分为“系统进程”和“用户进程”两大类,把完成操作系统功能的进程称为系统进程,而完成用户功能的进程则称为用户进程。

    二、 进程状态

    通常,根据进程执行过程中不同时刻的状态,可归纳为三种基本状态:

    1.  等待态 :等待某个事件的完成;
    2.  就绪态 :等待系统分配处理器以便运行;
    3.  运行态 :占有处理器正在运行。

    进程的状态变化:

    进程在执行中状态会不断地改变,每个进程在任何时刻总是处于上述三种基本状态的某一种基本状态,进程状态之间转换关系如下图所示:

    运行态→等待态 往往是由于等待外设,等待主存等资源分配或等待人工干预而引起的。

    等待态→就绪态 则是等待的条件已满足,只需分配到处理器后就能运行。

    运行态→就绪态 不是由于自身原因,而是由外界原因使运行状态的进程让出处理器,这时候就变成就绪态。例如时间片用完,或有更高优先级的进程来抢占处理器等。

    就绪态→运行态 系统按某种策略选中就绪队列中的一个进程占用处理器,此时就变成了运行态。

    三、 进程队列

           1、 进程队列的链接。

      在多道程序设计的系统中往往会同时创建多个进程。在单处理器的情况下,每次只能让一个进程运行,其他的进程处于就绪状态或等待状态。为了便于管理,经常把处于相同状态的进程链接在一起,称“进程队列”,由于进程控制块能标志进程的存在和动态刻画进程的特性,因此,进程队列可以用进程控制块的连接来形成。链接的方式有两种:单向链接和双向链接。

           2、 进程基本队列

      就绪队列 :由若干就绪进程按一定次序链接起来的队列。

      等待队列 :把等待资源或等待某些事件的进程排列的队列。

           3、进程的入队和出队。

      出队和入队 :当发生的某个事件使一个进程的状态发生变化时,这个进程就要退出所在的某个队列而排入到另一个队列中去。

      出队 :一个进程从所在的队列退出的操作称为出队

      入队 :一个进程排入到一个指定的队列的操作称为入队。

      系统中负责进程入队和出队的工作称为队列管理

           无论单向链接还是双向链接,解决入,出队问题,都是首先找到该队列的队首指针,沿链找出要入队的进程以及它要插入的位置,或找出要出队的进程,然后修改本进程指针(入队情况)和相邻进程的有关指针值即可。

    四、 中断优先级和中断屏蔽

           1、 中断优先级是硬件设计时确定的。中断装置按预定的顺序来响应同时出现的中断事件,这个预定的顺序称为“中断优先级”。中断优先级是按中断事件的重要性和紧迫程度来确定的 ,是由硬件设计时固定下来的。一般情况下,优先级的高低顺序依次为: 硬件故障中断自愿中断 程序性中断 外部中断 和 输入输出中断 

           2、中断的嵌套处理

           3、中断屏蔽的作用。中断优先级只是规定了中断装置响应同时出现的中断的次序,当中断装置响应了某个中断后中断处理程序在进行处理时,中断装置也可能去响应另一个中断事件。因此会出现优先级低的中断事件的处理打断优先级高的中断事件的处理,使得中断事件的处理顺序与响应顺序不一致,而且会形成多重嵌套处理,使多现场保护、程序返回等工作变的复杂。

    中断屏蔽技术就是为了解决上述问题而提出的在一个中断处理没有结束之前不响应其他中断事件,或者只响应比当前级别高的中断事件。于是,当中断装置检查到有中断事件后,便去查看PSW中中断屏蔽标志,如果没有屏蔽就响应该中断;否则,暂时不响应该中断,待屏蔽标志消除后再响应。自愿中断是不能屏蔽的。


    >> 操作系统原理4 —— 存储管理

    本章考核知识点:1、重定位 2、固定分区存储管理 3、可变分区存储管理 4、页式存储管理 5、段式存储管理 6、虚拟存储器

    操作系统的存储管理如同一个大地主,管着一个大庄园,当有农户需要租用田地时,地主就给分配一块地让他种(用户区分配)。等到地里长出了果实,结果出来后,地主还得来收回这块地(去配)。

    为了管好这片田地,地主还要管好庄园的门,凡是要进去种地的,都得由地主根据他的需要让他到位置确定实际的田地上去干活。(把逻辑地址转换成物理地址)

    庄园里还有一些大家共同可以使用的地方,比如地主的花园,工具房等,大家可以进去,也可以使用,但是不许改变任何现有的东东,还有,每个农户只能在自己的地里刨食吃,如果有人胆敢到别人地里或地主的花园里摘花偷食,可要当心他们养的狼狗跳出来哦。(共享和保护)

    当然,再大的地也是不够多的,地主为了多赚些钱,当所有的地都租出去的时候,他想办法把有些种田人暂时不种的那块地里的东东连地皮一起挖出来放到仓库里先堆着。把地腾出来租给别人种(这一招可够绝的,不过地主说啦,这就是“虚拟存储”。)

    一、 页式存储管理

           1、如何分页和分块

      页式存储管理中有两个名词:“ 页 ”和“ 块 ”,其中的“块”是针对硬件来说的,就是把存储器分成若干相等大小的区,每个区就称为一个块。对应的,在程序中,逻辑地址进行“分页”,其大小和每个块相一致。

      事实上,页面的大小是由块的大小自然决定的。对于程序来说,其逻辑地址还是和原来一样采用连续的地址。只是 按照块的位数取其前面数位做为页号 .

      分配空间时,根据作业长度可以确定它的页面数,根据这个页面数在主存中分配相应的块数,只要是空闲块就可以放入,即使不是相邻的。并把分配情况记在“页表”中,根据页表可以找到相对应的页号与块号,就得出绝对地址了。

      2、采用页式管理,使主存空间充分利用,页不必为了得到连续空间而进行移动。 可以提高系统效率。

      3、页表的构造与作用

      每个被装入主存的作业都有一张 页表 ,指出该作业逻辑地址中的页号与所占用的主存块号之间的对应关系。页表的长度由作页拥有的页面数决定,行号对应为页号,行中记录的是主存中的块号。

      页表是硬件进行地址转换的依据,每执行一条指令时按逻辑地址中的页号查找页表并转换成绝对地址。

      在多道程序设计系统中,进入主存的每个作业都有一张页表,由一个硬件“页表控制寄存器”来记录每个作业的页表所在位置和长度以便作业转换时同时转换页表。

      4、快表的构造与作用

      快表 就是页表的一部分克隆,每行中有页号及其对应的块号,整个快表存放在一个小容量的高速缓存中,访问时快表和内存同时进行查找,因为快表速度很快,而常用的页都登记在快表中,因此可以大大加快执行速度。

      5、采用页式管理的地址转换过程

      (为什么不直接用块分配表来记录而要用位示图呢,因为主存块很多,这样可以节省空间,提高效率。位示图就是用一个位(0或1)来表示一个块的使用状态,一个字32位,可以表示32块。按顺序排列,只需一小段内存就可以记录主存中大量的块状态)

      6、利用位示图实现页式存储空间的分配和回收

      页式存储管理把主存空间分成大小固定的许多块,在装业作业时,如何知道主存中哪些块已使用,哪些还未用,可以用位示图来表示。

      块号=字号×字长+位号

      字号=[i/字长](即块号i除以字长取整)

      位号=i mod 字长(即块号i除以字长取余)。


    >> 操作系统原理5 —— 文件管理

    文件和文件名 :在计算机系统中,把逻辑上具有完整意义的信息集合称为“文件”,每个文件都要用一个名字作标识,称为“文件名”。

    用户请求使用文件的操作步骤

      1)读文件:打开文件→读文件→关闭文件

      2)写文件:建立文件→写文件→关闭文件

      3)删除文件:关闭文件→删除文件


    >> 操作系统原理6 —— 设备管理

    要求了解设备管理与文件管理的合作,文件管理实现文件存取的准备工作,而文件的物理存取由设备管理实现。理解怎样实现独占设备的分配和磁盘的驱动调度;怎样实现虚拟设备。

    一、 独占设备和共享设备

    独占设备好比是你家的抽水马桶,当你坐上去的时候,大家就是想用也得等你完事了站起来才可以用上。

    共享设备呢,就像是我家的水龙头,我在洗手的时候,可以把手移开让我妈来打盆水。然后我又继续洗手。

      1、 独占设备 是指每次只能供一个作业执行期间单独使用的设备。如输入机、磁带机、打印机等。

      2、 共享设备 是指允许几个作业执行期间可同时使用的设备。

      3、共享设备的“同时使用”的含义是指多个作业可以交替启动共享设备,当一个用业正在使用设备时其他作业暂不能使用,即每一时刻仍只有一个作业占用,但当一个作业正在使用设备时其他作业就可使用。


    >> 操作系统原理7 —— 作业管理

    理解计算机系统中把用户要求处理的一项工作称为一个作业,作业可分为批处理作业和交互式作业两大类;掌握操作系统是如何实现作业调度和控制作业执行的;理解作业高度与进程调度之间的关系以及各自的职责。

    一、 作业和作业步

           1、 作业 :我们把用户要求计算机系统处理的一个问题称为一个“作业”

           2、 作业步 :任何一个作业都要经过若干加工步骤才能得到结果,我们把作业的每一个加工步聚称为一个“作业步”。


    >> 操作系统原理8 —— CPU管理,进程

    本章考核知识点 :1、进程的顺序性与并发性 2、与时间有关的错误 3、相关临界区 4、进程的互斥 5、进程的同步 6、进程通信 7、线程的概念

    理解“进程”是操作系统中的基本执行单位,在多道程序设计的系统中往往同时有许多进程存在,它们要轮流占用处理器。这些交叉执行的并发进程相互之间可能是无关,也可能是相关的。当并发进程竞争共享资源时会出现与时间有关的错误,因此,应采用进程同步与互斥手段使其合理使用共享资源,以保证系统安全。当进程间必须通过信息交换进行协作时,可用进程通信的方式达到目的。

    一、 进程的顺序性与并发性

    有人说,在程序中不是有跳转语句和重复语句,怎么就是顺序执行?注意,这里是指进程在处理器中的执行,因为处理器每次只能执行一个操作,因此每条指令必须按顺序进入CPU执行,假使有一条指令是跳转的,那么执行本指令后,会取出跳转目的地址的指令进入CPU运行,这个顺序是程序规定的。所以对CPU而言,进程总是按顺序执行

    进程是一个程序在一个数据集合上的一次执行,同一个程序和同一个数据集的运行结果必然是相同的。这就是可再现性。

    同时执行并不是真的同时,因为任一时刻CPU中只能有一个进程运行。

           1、进程的顺序性 :任何进程在顺序的处理器上的执行是严格按照顺序进行的,这就是进程的顺序性。当一个进程独占处理器顺序执行时,具有两个特性: 一、封闭性 ;二、可再现性 。

      2、进程的同时执行 :在多道程序设计系统中,一个进程的工作没有全部完成之前,另一个进程就可以开始工作,它们的执行在时间上重迭的,我们把它们称为是“可同时执行的”。

      3、进程的并发性 :若系统中存在一组可同时执行的进程,则说该组进程具有并发性,并把可同时执行的进程称为“并发进程” 。

      4、并发进程间的关系:并发进程相互之间可能是无关的,也可能是交往的。如果一个进程的执行不影响其他进程的执行,且与其他进程的进展情况无关,即它们是各自独立的,则这些并发进程相互之间是无关的。如果一个进程的执行依赖其他进程的执行,则这些并发进程之间是有交往的。

    二、 与时间有关的错误

           1、并发进程的执行速度取决于自身和进程调度策略。一个进程运行时会被中断,且断点是不固定的,一个进程被中断后,哪个进程可以运行,被中断的进程什么时候占用处理器,是与进程调度策略有关的。因此进程的执行速度不能由自己决定。

           2、并发进程交替使用共享资源时会出现与时间有关的错误。 由于共享资源的原因,加上进程并发执行的随机性,一个进程对另一个进程的影响是不可预测的。造成不正确的因素与进程占用处理器的时间、执行的速度以及外界的影响有关。因此被称为与时间有关的错误。

    三、 相关临界区

           1、 临界区的定义:并发进程中与共享变量有关的程序段称为“临界区”

      2、什么是相关临界区 : 相关临界区是指并发进程中涉及到相同变量的那些程序段 

      3、对相关临界区的管理要求。

      1) 一次最多让一个 进程在临界区执行,当有进程在临界区时其他想进入临界区执行的进程必须等待。

      2)任何一个进入临界区执行的进程必须在有限的时间内退出临界区,即任何一个进程都不应该无限地逗留在自己的临界区。

      3)不能强迫一个进程无限地等待进入它的临界区,即有进程退出时应让一个等待进入临界区的进程进入它的临界区。

    四、 进程的互斥

    1) 进程互斥的含义:进程的互斥是指当有若干进程都要使用某一共享资源时,任何时刻最多只允许一个进程去使用,其他要使用该资源的进程必须等待,直到占用资源者释放了该资源。

    PV操作是两个过程,由他们两个来控制一个信号S,假设S是红灯的个数。

    每个进程进入临界区前都要先执行P操作退出临界区执行V操作。用下面的比喻很容易理解:

           临界区门前有棵树(S)

      用来挂红灯

      进程想进CPU的门

      先得上树取盏灯(调用一次P操作)

      取下一个去敲门(S=S-1)

      如果树上没灯取(S≤0)

      树说欠你一盏灯(S为负时)

      没辙只好外边排队等( W ait (S))

      得灯进程续运行

      运行完了要出门(调用一次V操作)

      马上还回一盏灯(S=S+1)

      若有进程在催债(S≤0)

      放个进去事完成( Release (S))

    2) 实现进程互斥的工具——PV操作。

    PV操作是由两个操作,即P操作和V操作组成。P操作和V操作是两个在信号量上进行操作的过程。假定用S表示信号量则把这两个过程记作P(S)和V(S),它们的定义如下: 

    Procedue P(Var S: Semaphore);
    begin S:=S-1;
    if S<0 
    then W(S) 
    end;
    {P} 
    
    Procedue V(Var S: Semaphore);
    begin S:=S+1;
    if S<=0 
    then R(S) 
    end;
    {V}

    为了确保PV操作自身的正确执行,因此P(S)和V(S)操作中不可中断,这种 不可被中断的过程称为“原语 ”。

    3) 用PV操作管理相关临界区的一般形式

    一个信号量与一组涉及共享变量的相关临界区联系起来,信号量的初值定为“1”。

    任何一个进程要进入临界区前先调用P操作,执行临界区的操作后,退出临界区时调用V操作。

    由于信号量的初值为“1”,P操作起到了限制一次只有一个进程进入临界区的作用,其余进程欲进入临界区必须符合对临界区管理的第一个要求,即一次最多让一个进程在临界区执行。进程退出后执行V操作,若有进程在等待则释放一个进程,这样就达到了对临界区管理的第二个和第三个要求(即不能无限逗留也不能无限等待)。


    >> 操作系统原理9 —— 死锁

    本章考核知识点 :1、死锁的产生 2、死锁的防止 3、死锁的避免4、死锁的检测

    一、 死锁的产生

    话说狼GG和狼MM面对面走上一根独木桥。

    狼GG说:呵呵,小MM,我已经占领了这座桥的一半,你不如退出去让我先过去吧。

    狼MM说,哼哼,老兄,我也占了这座桥的一半,你咋不让给我?

    狼GG和狼MM互不相让,都在等对方先让步。结果两个都过不了河。等着猎人来处理后事了。

           1、什么叫死锁 : 若系统中存在一组进程(两个或多个进程),它们中的每一个进程都占用了某种资源而又都在等待其中另一个进程所占用的资源,这种等待永远不能结束,则说系统出现了“死锁”。或说这组进程处于“死锁”状态。

      2、引起死锁的因素:死锁的出现除了与资源的分配策略有关外,也与并发进程的执行速度有关,即操作系统对资源管理不得当或没有顾及进程并发执行时可能出现的情况,则就可能形成死锁。

    二、 死锁的防止

    我们把桥的一半看作一个资源的话,那么,当狼MM占用了其中一个资源后,狼GG就只好等待了。

           狼GG狼MM各自占有了一段资源又在等另外的资源,又不肯放弃自己占有的资源。

      他们又不能把对方踢下河去,把另一段资源抢过来自己用。

      只好互相等待了。

    这4个条件是必要条件而不是充分条件,意思是,只要发生死锁,那么这四个条件必然都成立。反之则不然,有时候即使四个条件都满足,那也不一定发生死锁。(从资源分配图中可以分析得到,即使形成循环等待资源,也不一定形成死锁。)

    1、系统出现死锁必然同时保持的四个必要条件:

      1)互斥使用资源

      2)占有并等待资源

      3)不可抢夺资源

      4)循环等待资源

    2、死锁的防止策略 :要防止死锁形成,只要采用的资源分配策略能使上述4个条件中有一个条件不成立就可以了。

           1)破坏互斥使用资源的条件经常是行不通的。因为资源本身特性就是互斥使用的

      2)要破坏“占有并等待条件”则可以采取两种办法: 静态分配 和 释放已占资源 .

      静态分配 也称为 预分配资源 ,要求每一个进程在开始执行前就申请它所需要的全部资源,仅当系统能满足进程的资源申请要求且把资源分配给进程后,该进程才能开始执行。

      释放已占资源 就是指进程申请资源时必须没有占用资源,如果已经占用了资源就要先归还所占的资源再申请。

      3)实现 可抢夺式分配 :如果一个进程已经占有了某些资源又要申请新资源,而新资源不能满足(已被其它进程占用)必须等待时,系统可以抢夺该进程已占有的资源。

      4)实现 按序分配 :把系统中所有资源排一个顺序,对每一个资源给一个确定的编号,规定任何一个进程申请两个以上的资源时,总是先申请编号小的资源,再申请编号大的资源。

    三、 死锁的避免

    死锁的避免不同于死锁的防止,死锁的防止是采用某种分配策略后,系统就不会产生死锁,这好比是你打过了某种预防针,再也不会得那种病。而死锁的避免是没有打预防针,但是通过其他办法,避免得病。因此有“安全状态”的说法,对应的,当然也有不安全状态。就像人都有得病的可能,不必任何病都打预防针。只要注意防病,仍然可以安全健康的生活。

           1、 安全状态 :如果操作系统能保证所有的进程在 有限的时间 内得到需要的 全部资源 ,则称系统处于“安全状态”。

      2、区分死锁的 避免 与死锁的 防止 :当采用了防止死锁的资源分配策略后,系统中就不会形成死锁。但是可以防止死锁的资源分配策略中,有的只适用于对某些资源的分配,有的会影响资源的使用效率。这时可用使用死锁的避免。

    死锁的避免是解决死锁的另一种方法,它不同于死锁的防止。在系统中不采用防止死锁的资源分配策略,而是估计到可能有死锁发生时避免死锁的发生。

      3、银行算法是怎样避免死锁的:

      银行家算法是这样的

      1)当一个用户对资金的最大的需求量不超过银行家现有的资金时就可以接纳该用户。

      2)用户可以分期贷款,但贷款的总数不能超过最大需求量。

      3)当银行家现有的资金不能满足用户的尚需贷款时,对用户的贷款可推迟支付,但总能使用户在有限的时间里得到贷款。

      4)当用户得到所需的全部资金后,一定能在有限的时间里归还所有资金。

      我们把操作系统看作是银行家,操作系统管理的资源相当于是银行家管理的资金,则银行家算法就是:

      1)当一个进程首次申请资源时,测试该进程对资源的最大的需求量,如果不超过系统现存资源时就可以按他的当前申请量为其分配资源。 否则推迟分配。

      2)进程执行中继续申请资源时,测试该进程占用资源和本次申请资源总数有没有超过最大需求量。超过就不分配,没超过则再测试现存资源是否满足进程还需要的最大资源量,满足则按当前申请量分配,否则也推迟分配。

    总之,银行家算法要保证分配资源时系统现存资源一定能满足至少一个进程所需的全部资源。这样就可以保证所有进程都能在有限时间内得到需要的全部资源。这就是安全状态。

    四、 死锁的检测

    就是既不打预防针,也不去避免得病,而是经常去体检,如果发现有病了就治疗。这是一种事后解决的办法,也算是解决死锁问题的一条途径。但这毕竟要付出较大代价。

      1、什么是 死锁的检测 :对资源的申请和分配不加限制,只要有剩余的资源就可把资源分配给申请者。这样可能会出现死锁,系统定时运行一个“死锁检测程序”,如果检测到死锁发生,则必须先解除死锁再继续工作。

      2、怎样实现死锁的检测:1、每个资源当用中只有一个资源 2、资源类中含有若干个资源。

      3、 死锁的解除 :一般采用两种方式来解除死锁,一种是终止一个或几个进程的执行以破坏循环等待;另一种是从涉及死锁的进程中抢夺资源。

      检测死锁和解除死锁都要付出很大代价。所以用死锁检测的方法解决死锁问题只适用于 不经常发生死锁 的系统中。

    展开全文
  • 操作系统原理总结

    2018-07-10 23:15:47
    转载:https://blog.csdn.net/yanglingwell/article/details/53745758 操作系统原理总结made by @杨领well (yanglingwell@sina.com)一、基础知识点1. 操作系统的资源管理技术资源管理解决物理资源数量不足和合理...
  • 第一阶段:状态机操作系统(1940年以前) 这是计算机处在萌芽时期出现的操作系统。这种操作系统运行在英国人巴贝斯(Babbes)想象中的自动机中。所谓状态机操作系统实际上算不上是我们现在通常所定义的操作系统,...
  • 重要提示尊敬的用户您好,由于该计算机的心智:操作系统之哲学原理pdf电子书受百度网盘影响无法做公共分享,只能私密分享,有不到之处请多多谅解! 百度网盘链接: http://pan.baidu.com/s/1F0rAa 密码: tkq9 ...
  • 所以咱们这篇文章就来聊聊分布式这块知识,具体的来看看Redis分布式的实现原理。 说实话,如果在公司里落地生产环境用分布式的时候,一定是会用开源类库的,比如Redis分布式,一般就是...
  •  所谓进程互斥,就是对于系统的某种资源,若一个进程正在访问它,其他进程必须等待,不能同时使用。这是一种源于资源共享的制约关系,也称为间接制约关系。   接下来,我们来简要的了解一下几个概念: 这种...
  • zookeeper 分布式锁原理: 1 大家也许都很熟悉了多个线程或者多个进程间的共享锁的实现方式了,但是在分布式场景中我们会面临多个Server之间的锁的问题,实现的复杂度比较高。利用基于google chubby原理开发的开源...
  • 比如,下订单和扣库存的操作,这两个操作必须连贯,一个线程执行完这两个操作后,下面一个线程才可以介入执行,如果同时并发执行,极大可能会出现“多卖”的现象。 解决方法: synchronized 关键字,给方法加一把...
  • Linux 读写自旋锁原理

    2012-02-08 15:30:35
    简介: 读写自旋是一种特殊...后续两篇文章论述如何设计和实现基于简单共享变 量的读写自旋,以及针对大规模多核系统讨论如何提高读写自旋的可扩展性。 读写自旋简介 什么是读写自旋 自旋(Spinlock
  • 进程和线程有何区别? 进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以...
  • 计算机与操作系统启动原理 转载自:http://wolfhacker.blogchina.com/wolfhacker/1719979.html近由于学习操作系统原理,加上自己对底层的兴趣,查阅了不少资料,现结合《INSIDE WINDOWS NT》以及网上不少网友的文章...
  • 一、自旋的概念 首先是一种,与互斥相似,基本作用是用于线程(进程)之间的同步。与普通不同的是,一个线程A在获得普通后,如果再有线程B试图获取,那么这个线程B将会挂起(阻塞);试想下,如果两个...
  • futex(快速用户区互斥的简称)是一个在Linux上实现锁定和构建高级抽象如...在Linux下,信号量和线程互斥的实现都是通过futex系统调用。 futex(快速用户区互斥的简称)是一个在Linux上实现锁定和构建高级抽象
  • 互斥基本原理 互斥是一个二元变量,其状态为开锁(允许0)和上(禁止1),将某个共享资源与某个特定互斥在逻辑上绑定(要申请该资源必须先获取)。 访问公共资源前,必须申请该互斥,若处于开锁状态,则...
  • 根据《Unix 环境高级编程》对打开文件的介绍,打开的文件在进程表和操作系统中的对应的结构如下图所示:每个进程在进程表中都一个对应的项目,叫做进程表项,上图是最左边展示了进程表中两进程表项...
1 2 3 4 5 ... 20
收藏数 147,835
精华内容 59,134
关键字:

操作系统 锁原理