银行家算法

四舍六入五成双银行家算法的 PHP和Javascript实现

≯℡__Kan透↙ 提交于 2020-03-04 01:33:38
四舍六入五成双 http://baike.baidu.com/view/1245064.htm?fr=aladdin   四舍六入五成双是一种比较精确比较科学的计数保留法,是一种数字修约规则。   对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是“四舍六入五成双”,也即“4舍6入5凑偶”这里“四”是指≤4 时舍去,"六"是指≥6时进上,"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:①5前为奇数,舍5入1;②5前为偶数,舍5不进。(0是最小的偶数)   具体规则如下:   1. 被修约的数字等于或小于4时,该数字舍去;   2. 被修约的数字等于或大于6时,则进位;   3. 被修约的数字等于5时,要看5前面的数字,若是奇数则进位,若是偶数则将5舍掉,即修约后末尾数字都成为偶数;若5的后面还有不为“0”的任何数,则此时无论5的前面是奇数还是偶数,均应进位。 举例,用上述规则对下列数据保留3位有效数字:   9.8249=9.82, 9.82671=9.83   9.8350=9.84, 9.8351 =9.84 PHP: function round2($num,$precision){ $pow = pow(10,$precision); if( (floor(

银行家算法-分析与编码

会有一股神秘感。 提交于 2020-02-03 01:02:59
银行家算法 Banker's Algorithm是一个避免Deadlock的算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计。 算法背景 在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要 声明完成该项目所需的最大资金量 ,在满足所有贷款要求时,客户应 及时归还 。 银行家在客户申请的贷款数量不超过之前声明的最大值时,都应 尽量满足更多客户 的需要。 可以看到关键字: 资金不能无限借需要声明最大资金量。 客户借满了以后,需要及时归还(通常这点不太容易做到...)。 算法的目的是尽量满足跟多客户的需求(没有侧重,没有VIP,通常来说这点也不太容易做到,毕竟商业追求利益最大化...)。 当然,我们不去考虑太多其他策略,单就算法而论。 类比操作系统: 银行的资金相当于OS中的资源(CPU,内存,线程etc.); 银行的用户相当于OS中的进程; 由于该算法在避免死锁的方法中,所施加的限制条件较弱, 有可能 (敲黑板!)获得令人满意的系统性能。 算法内容 基本思想:分配资源之前,先判断分配后系统是否是安全的;若是,才分配;否则,回滚分配; 由此可见,算法的核心应该是判断系统是否安全。 先看百科对系统安全的定义: 安全序列是指一个进程序列{P1,…,Pn}是安全的,即对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j

银行家算法

徘徊边缘 提交于 2020-01-30 07:30:44
操作系统实验报告(银行家算法) 1.实验目的 掌握银行家算法,加深对避免死锁的理解 2.实验内容及要求 实现下列要求,并写出实验报告:(题目、目的、内容和要求、实验原理、程序清单、运行情况(输入输出)、总结。) 系统中有进程P0、P1、P2、P3、P4,三种资源数量分别为A=10、B=5、C=7,T0时刻资源情况如下: (1)、分析T0时刻安全性,输出分析结果,若安全输出安全序列。 (1)、输入P1提出请求:Requestp1(1,0,2)用银行家算法分析这个请求是否可满足,输出分析结果。若可满足,输出系统安全序列。 实验源代码如下 package com . xiaole . os123 . chap01 ; import java . util . Scanner ; class Banker { private String processer [ ] = { "p0" , "p1" , "p2" , "p3" , "p4" } ; private int available [ ] = new int [ 3 ] ; private int allocation [ ] [ ] = new int [ 5 ] [ 3 ] ; private int need [ ] [ ] = new int [ 5 ] [ 3 ] ; private int work [ ] = new

哲学家就餐问题、银行家算法、读者写者问题、生产者消费者问题

好久不见. 提交于 2020-01-25 00:29:04
哲学家就餐问题、银行家算法、读者写者问题、生产者消费者问题 哲学家就餐问题 解题思路 问题解决 方法一 方法二 方法三 银行家算法 安全状态 银行家算法的数据结构 银行家算法 安全性算法 银行家算法实例 读者写者问题 方法1:利用记录型信号量解决读者--写者问题 方法2:利用信号量集解决读者--写者问题 生产者消费者问题 哲学家就餐问题 该问题描述的是五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替的进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐完毕,放下筷子继续思考。 解题思路 因为是五位哲学家,并且每位哲学家的各自做自己的事情(思考和吃饭),因此可以创建五个线程表示五位哲学家,五个线程相互独立(异步)。并对五位哲学家分别编号为0~4。 ​ 同时,有五根筷子,每根筷子只对其相邻的两位哲学家是共享的,因此这五根筷子可以看做是五种不同的临界资源(不是一种资源有5个,因为每根筷子只能被固定编号的哲学家使用)。并对五根筷子分别编号为0~4,其中第i号哲学家左边的筷子编号为i,则其右边的筷子编号就应该为(i + 1) % 5。 ​ 因为筷子是临界资源,因此当一个线程在使用某根筷子的时候,应该给这根筷子加锁,使其不能被其他进程使用。 ​ 根据以上分析,可以使用pthread

银行家算法

…衆ロ難τιáo~ 提交于 2020-01-22 10:06:12
在了解银行家算法之前,我们先了解一下 死锁 的概念和它的相关知识。 死锁 概念 :多个进程相互等待,互不相让,导致所有进程无限期等待。 死锁分为 资源死锁 和 通信死锁 。 资源死锁 :每个进程都在等待其他进程释放资源。资源死锁时最常见的死锁类型。 通信死锁 :由于信息丢失,导致通信双方互相等待对方发送消息。一般可以设置超时时间来解决。 资源死锁条件 1) 互斥条件 :一个进程不能被两个以上的进程同时占有。 2) 占有和等待 :已经得到某个资源的进程可以申请新的资源。 3) 不可抢占条件 :已经分配给一个进程的资源不能被强制性抢占,他只能被占有它的进程显式释放。 4) 环路等待 :死锁发生时,系统中一定有两个及两个以上的进程形成一条环路。 死锁处理 1)忽略问题。 2)检测死锁并恢复 3)避免死锁 4)防止死锁发生 今天我们要说的就是死锁避免的策略— 银行家算法 银行家算法是最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态的申请资源,但系统在进行资源分配之前,应该先计算此次分配资源的安全性,若果分配不会导致系统进入不安全状态,则分配,否则等待。 先说一下算法中需要的数据结构: 1.可利用资源向量 Available :他是一个一维数组。其中的每一个元素代表一类可利用的资源数目。它的数值会根据资源的分配和回收发生改变。比如Available[i]=k

操作系统-银行家算法

邮差的信 提交于 2020-01-15 04:03:19
假设系统中有三类互斥资源R1、R2和R3,可用资源数分别是9、8和5,开始时可用资源数为2、1、0。在T0时刻系统中有P1、P2、P3、P4和P5五个进程,这些进程对资源的最大需求量和已分配资源数如表1所示。进程按照P1→P2→P4→P5→P3序列执行,系统状态安全吗?如果按P2→P4→P5→P1→P3的序列呢? (1)首先执行P2,它还差1个R2资源,系统中还有1个未分配的R2,因此满足其要求,能够顺利结束进程,释放出2个R1、2个R2、1个R3。这时,未分配的资源就是:4个R1、2个R2、1个R3。 P2需要资源数=最大需求数-已分配资源数=(2,2,1)-(2,1,1)=(0,1,0) P2剩余资源数=可用资源数-需要资源数=(2,1,0)-(0,1,0)=(2,0,0) P2满足后正常运行,运行结束时释放所占用的资源,此时,系统剩余资源数为=(2,0,0)+(2,2,1)=(4,2,1) (2)然后执行P4,它还差一个R3,而系统中刚好有一个未分配的R3,因此满足其要求,也能够顺利结束,并释放出其资源。此时未分配的资源数为(4,2,1) P4需要资源数=最大需求数-已分配资源数=(1,2,1)-(1,2,0)=(0,0,1) P4剩余资源数=可用资源数-需要资源数=(4,2,1)-(0,0,1)=(4,2,0) P4满足后正常运行,运行结束时释放所占用的资源,此时

银行家算法

℡╲_俬逩灬. 提交于 2020-01-11 06:55:17
这是一个简陋的银行家算法 试分配资源时,我们要考虑几种情况: 1、请求资源数量大于need数量时,系统不分配资源 2、请求资源数量大于available时,系统不分配资源 3、考虑安全分配资源后need==0的情况,这个时候这个进程已经不再需要占用资源,要把已分配的资源还给available 4、试分配后,可利用资源已经不能满足任意一个进程,虽然试分配资源成功,但是这时候系统就会陷入不安全状态,系统就不再分配资源,要把之前分配的资源再还回去。 #include<iostream> #include<stdio.h> #include<stdlib.h> #include<vector> #include<string> #include<iomanip> using namespace std; class Banker { public: vector<string> _pro_name;//j进程名 vector<vector<size_t>> _max;//最大需求矩阵 size_t pid = 0;//进程数 size_t type = 0;//资源种类 vector<vector<size_t>> _allocation; vector<vector<size_t>> _need; vector<size_t> _available; vector<size_t>

计算机操作系统-银行家算法-C语言

 ̄綄美尐妖づ 提交于 2020-01-11 03:28:31
银行家算法 给进程分配资源,是系统处于安全状态;当进程向系统申请资源时,系统要预判分配资源后是否还存在安全状态,如果存在则分配,否则不分配。 先看效果再附源码 运行结果 源代码 # include <stdio.h> # include <stdlib.h> # include <string.h> # define N 10 struct POC { char JobName ; //进程名 int Allocation [ 3 ] ; //已拥有资源数 int Need [ 3 ] ; //还需求资源数 int Pass ; //是否已经过 1是 0否 } job [ N ] = { { 'A' , 0 , 1 , 0 , 7 , 4 , 3 , 0 } , //3:7 5 3 { 'B' , 2 , 0 , 0 , 1 , 2 , 2 , 0 } , //1:5 3 2 { 'C' , 3 , 0 , 2 , 6 , 0 , 0 , 0 } , //4:10 5 5 { 'D' , 2 , 1 , 1 , 0 , 1 , 1 , 0 } , //2:7 4 3 { 'E' , 0 , 0 , 1 , 4 , 3 , 1 , 0 } //5:10 5 6 } ; //3 3 2 int Number = 5 , SafetySequenceNumber ; int

避免死锁之银行家算法

 ̄綄美尐妖づ 提交于 2020-01-07 11:13:32
银行家算法(Banker’s Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。 一、操作系统安全状态和不安全状态 要解释银行家算法,必须先解释操作系统安全状态和不安全状态。 安全状态 指一个进程序列{P1,…,Pn}是安全的,即对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量(后边会谈到安全性算法来判断是否为安全状态) 不安全状态 指不存在这样的一个安全序列。 安全状态一定不产生死锁,不安全状态不一定会产生死锁。 下面以一个小例子解释安全状态: 答案是按照 <P2,P1,P3>的推进序列使用磁带机就是安全的。 安全序列判断过程: 1、现在的可用(可以分配)的资源数是 3 ,而 P2 需要的资源数是 2,所以可以分配 2、待 P2 执行完毕后,释放资源数为 4,变成可用资源,加上之前剩余的可用资源数,一共是 5 个 3、观察到 P1 需要 5 个,所以分配给 P1 4、P1 执行完后释放资源数为 10,变成可用资源 5、而 P3 只需要 7 个,所以分配 7 个可用资源个 P3 6、P3 运行完毕 二、银行家算法 1、数据结构 1)可利用资源向量Available 是个含有m个元素的数组

银行家算法(Java实现)

99封情书 提交于 2020-01-06 19:04:44
  银行家算法是避免死锁的一种重要方法,采取的思路是预分配,尝试将资源分配给对应进程,然后判断新状态下是否状态安全,如果安全状态,则判断一下该对应进程是否满足执行的全部资源,如果满足,就回收掉该进程的资源,如果不满足则不作处理。如果是不安全状态,则进行状态的回退。 程序模块图 程序代码 Bank类: import java . util . * ; /** * */ public class Bank { /** * 资源可用数目 */ private int [ ] Available ; /** * 最大需求矩阵 */ private int [ ] [ ] Max ; /** * 已分配矩阵 */ private int [ ] [ ] Alloction ; /** * 需求矩阵 */ private int [ ] [ ] Need ; /** * 进程是否完成矩阵 */ private boolean [ ] Finish ; /** * 进程数组 */ private Process [ ] Processes ; /** * 安全状态进程 */ private List < Process > securityProcesses ; /** * 进程请求资源数组 */ private int [ ] request ; private boolean [ ] tmp