首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    银行家算法C语言版「建议收藏」

    1、定义了一个结构体,结构体里面的三个域分别表示三种资源的数量。 2、定义一个最大需求矩阵,写出已分配资源数矩阵、需求矩阵、可用资源 向量、记录安全序列的数组、试探分配序列。 3、银行家算法使用的是试探分配的策略,如果进程请求分配的资源既不大 于自己尚需的资源,又不大于系统现存的资源,那就可以先试探着将资源分配给该进程,然后测试分配后是不是有可能造成死锁,如果不会引起死锁(即安全状态)就可以完成分配,否则(即不安全状态)就将试探分配的资源回收回来让其等待。 二、实施步骤 1. 银行家算法中的数据结构   为了实现银行家算法,在系统中必须设置这样四个数据结构,分别用来描述系统中可利用的资源、所有进程对资源的最大需求、系统中的资源分配,以及所有进程还需要多少资源的情况。   (1) 可利用资源向量Available。   (2) 最大需求矩阵Max。   (3) 分配矩阵Allocation。   (4) 需求矩阵Need。 2. 银行家算法   设Requesti是进程Pi的请求向量,如果Request i[j]=K,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:   (1) 如果Request i[j]≤Need[i, j],便转向步骤(2); 否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。   (2) 如果Request i[j]≤Available[j],便转向步骤(3); 否则,表示尚无足够资源,Pi须等待。 (3) 系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:  Available[j] = Available[j] – Request i[j];     Allocation[i, j] = Allocation[i, j] + Request i[j];    Need[i, j] = Need[i, j] – Request i[j];   (4) 系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。 3. 安全性算法   系统所执行的安全性算法可描述如下:   (1) 设置两个向量: ① 工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目, 它含有m个元素,在执行安全算法开始时,Work := Available; ② Finish:它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i] := false;当有足够资源分配给进程时,再令Finish[i] := true。实现以下功能。   (2) 从进程集合中找到一个能满足下述条件的进程:   ① Finish[i]=false;   ② Need[i, j]≤Work[j];   若找到,执行步骤(3),否则,执行步骤(4)。   (3) 当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:     Work[j] = Work[j]+Allocation[i, j];     Finish[i] =true;     go to step 2;   (4) 如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。 假定系统中有五个进程{P0, P1, P2, P3, P4}和三类资源{A, B, C},各种资源的数量分别为10、5、7,在T0时刻的资源分配情况如图:

    04

    《现代操作系统》—— 死锁

    在计算机系统中有很多独占性的资源,在任何一个时刻它们都只能被一个进程使用。比如硬件资源:打印机、扫描仪、光驱。也有一些软件资源:数据库表中的某一个记录、文件系统中某些文件等。两个进程同时使用同一个文件系统中的某个文件会引起文件系统的瘫痪,因此操作系统都具有授权一个进程(临时)拍他的访问某一资源的能力。不然可能会因为两个进程同时请求被占用的资源而导致死锁。 本文中的资源可以是硬件资源、软件资源以及一些数据资源(也属于软件资源),死锁可能出现在软件资源和硬件资源上。 本文只讨论进程死锁,至于线程死锁,其原理基本是一样的。

    00

    银行家算法

    Dijkstra(1965)提出了一种能够避免死锁的调度算法,称为银行家算法(banker's algorithm),这是6.4.1节中给出的死锁检测算法的扩展。该模型基于一个小城镇的银行家,他向一群客户分别承诺了一定的贷款额度。算法要做的是判断对请求的满足是否会导致进入不安全状态。如果是,就拒绝请求;如果满足请求后系统仍然是安全的,就予以分配。在图6-11a中我们看到4个客户A、B、C、D,每个客户都被授予一定数量的贷款单位(比如1单位是1千美元),银行家知道不可能所有客户同时都需要最大贷款额,所以他只保留10个单位而不是22个单位的资金来为客户服务。这里将客户比作进程,贷款单位比作资源,银行家比作操作系统。

    01

    Java 程序死锁问题原理及解决方案

    Java 语言通过 synchronized 关键字来保证原子性,这是因为每一个 Object 都有一个隐含的锁,这个也称作监视器对象。在进入 synchronized 之前自动获取此内部锁,而一旦离开此方式,无论是完成或者中断都会自动释放锁。显然这是一个独占锁,每个锁请求之间是互斥的。相对于众多高级锁 (Lock/ReadWriteLock 等),synchronized 的代价都比后者要高。但是 synchronzied 的语法比较简单,而且也比较容易使用和理解。Lock 一旦调用了 lock() 方法获取到锁而未正确释放的话很有可能造成死锁,所以 Lock 的释放操作总是跟在 finally 代码块里面,这在代码结构上也是一次调整和冗余。Lock 的实现已经将硬件资源用到了极致,所以未来可优化的空间不大,除非硬件有了更高的性能,但是 synchronized 只是规范的一种实现,这在不同的平台不同的硬件还有很高的提升空间,未来 Java 锁上的优化也会主要在这上面。既然 synchronzied 都不可能避免死锁产生,那么死锁情况会是经常容易出现的错误,下面具体描述死锁发生的原因及解决方法。

    01

    进程间通信基础知识

    1.顺序程序与并发程序的特征 1)顺序程序特征:顺序性、封闭性(运行环境的封闭性)、确定性、可再现性。 2)并发程序特征:共享性、并发性、随机性。 2.进程互斥 1)由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源。进程的这种关系称为互斥 2)系统中某些资源一次只允许一个进程使用,这样的资源称为临界资源或互斥资源。 3)在进程中涉及到互斥资源的程序段叫临界区。 3.进程同步 进程同步指的是多个进程需要相互配合共同完成一项任务 4.进程间通信的目的 1)数据传输:一个进程需要将它的数据发送给另一个进程 2)资源共享:多个进程之间共享同样的资源 3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(比如子进程结束了要通知父进程) 4)进程控制:有些进程希望完全控制另一个进程的执行(比如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能及时知道它的状态改变。 5.进程间通信的发展 分为三个阶段: 1)管道 2)System V进程间通信 3)POSIX进程间通信 6.进程间通信分类 文件、文件锁、管道(pipe)和有名管道(FIFO)、信号(signal)、消息队列、共享内存、信号量、互斥量、条件变量、读写锁、套接字。 7.System V IPC & POSIX IPC 1)System V IPC:System V 消息队列、System V共享内存、System V信号量 2)POSIX IPC:消息队列、共享内存、信号量、互斥量、条件变量、读写锁 8.IPC对象的持续性 有三种情况 1)随进程持续:一直存在直到打开的最后一个进程结束(如pipe和FIFO) 2)随内核持续:一直存在直到内核自举或显示删除(如System V消息队列、共享内存、信号量) 3)随文件系统持续:一直存在直到显示删除。即使内核自举还存在。(POSIX消息队列、共享内存、信号量如果是使用映射文件来实现) 内核自举:就是重启系统,重新开机。

    01
    领券