操作系统实验三报告-预防进程死锁的银行家算法
3实验三银行家算法避免进程死锁

实验三预防进程死锁的银行家算法一:需求分析程序设计的任务和目的:设计程序模拟预防进程死锁的银行家算法的工作过程。
假设系统中有n个进程P1, … ,Pn,有m类可分配的资源R1, … ,Rm,在T0时刻,进程Pi分配到的j 类资源为Allocationij个,它还需要j类资源Need ij个,系统目前剩余j类资源Workj个,现采用银行家算法进行进程资源分配预防死锁的发生。
通过这次实验,加深对进程死锁的理解,进一步掌握进程资源的分配、死锁的检测和安全序列的生成方法。
(1)输入的形式和输入值的范围;为免去测试时候需要逐步输入数据的麻烦,输入时采用输入文件流方式将数据放在.txt文件中,第一行为进程个数和资源个数,二者之间用空格隔开。
第二行为进程已分配的各资源个数(之间用空格隔开),第三行为进程仍需要的进程个数(之间用空格隔开),第四行为各个资源的可用数。
运行程序后按照提示输入请求资源的进程号和请求的各资源数。
(2)输出的形式;先输出初始状态下的安全序列,后用户输入申请的进程号和资源数后判断,若为安全状态则输出安全序列,若不安全,则输出不安全。
(3)程序所能达到的功能;可以判断给出的数据是否为安全状态,若安全则输出安全序列,不安全则提示信息。
申请资源后可先判断资源是否合理,若合理则预分配,然后判断是否安全,若安全则输出安全序列,不安全则恢复各数据并提示信息。
(4)测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。
详见运行结果截图。
二:概要设计主程序模块void main()调用银行家算法bool bank()和安全比较算法boolcompare();以及打印输出函数bool bank();银行家算法bool bank()调用输出函数bool bank(int* availabled,int n,int m)主要思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。
操作系统实验报告-利用银行家算法避免死锁

创作时间:二零二一年六月三十日计算机把持系统实验陈说之马矢奏春创作题目利用银行家算法防止死锁一、实验目的:1、加深了解有关资源申请、防止死锁等概念, 并体会和了解死锁和防止死锁的具体实施方法.2、要求编写和调试一个系统静态分配资源的简单模拟法式, 观察死锁发生的条件, 并采纳银行家算法, 有效的防止和防止死锁的发生.二、实验内容:用银行家算法实现资源分配:设计五个进程{p0,p1,p2,p3,p4}共享三类资源{A,B,C}的系统, 例如, {A,B,C}的资源数量分别为10, 5, 7.进程可静态地申请资源和释放资源, 系统按进程的申请静态地分配资源, 要求法式具有显示和打印各进程的某一个时刻的资源分配表和平安序列;显示和打印各进程依主要求申请的资源号以及为某进程分配资源后的有关资源数据.三、问题分析与设计:1、算法思路:先对用户提出的请求进行合法性检查, 即检查请求是否年夜于需要的, 是否年夜于可利用的.若请求合法, 则进行预分配, 对分配后的状态调用平安性算法进行检查.若平安, 则分配;若不服安, 则拒绝申请, 恢复到原来的状态, 拒绝申请.2、银行家算法步伐:(1)如果Requesti<or =Need,则转向步伐(2);否则, 认为犯错, 因为它所需要的资源数已超越它所宣布的最年夜值.(2)如果Request<or=Available,则转向步伐(3);否则, 暗示系统中尚无足够的资源, 进程必需等候.(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:Available=Available-Request[i];Allocation=Allocation+Request;Need=Need-Request;(4)系统执行平安性算法, 检查此次资源分配后, 系统是否处于平安状态.3、平安性算法步伐:(1)设置两个向量①工作向量Work.它暗示系统可提供进程继续运行所需要的各类资源数目, 执行平安算法开始时, Work=Allocation;②布尔向量Finish.它暗示系统是否有足够的资源分配给进程, 使之运行完成, 开始时先做Finish[i]=false, 当有足够资源分配给进程时, 令Finish[i]=true.(2)从进程集合中找到一个能满足下述条件的进程:①Finish[i]=false②Need<or=Work如找到, 执行步伐(3);否则, 执行步伐(4).(3)当进程P获得资源后, 可顺利执行, 直至完成, 并释放出分配给它的资源, 故应执行:Work=Work+Allocation;Finish[i]=true;转向步伐(2).(4)如果所有进程的Finish[i]=true,则暗示系统处于平安状态;否则, 系统处于不服安状态.4、流程图:系统主要过程流程图银行家算法流程图平安性算法流程图5、主要数据结构假设有M个进程N类资源, 则有如下数据结构:int max[M*N] M个进程对N类资源的最年夜需求量int available[N] 系统可用资源数int allocated[M*N] M个进程已经获得N类资源的资源量int need[M*N] M个进程还需要N类资源的资源量int worked[] 系统提供给进程继续运行所需的各类资源数目四、源代码import java.awt.*;import javax.swing.*;import java.util.*;import java.awt.event.*;import javax.swing.border.*;public class OsBanker extends JFrame { // 界面设计JLabel labelInfo;JLabel labelInfo1;int resourceNum, processNum;int count = 0;JButton buttonRequest, buttonSetInit, button, button1, buttonsearch,button2;JTextField tf1, tf2;JTextField[] textAvailable;JTextField[][] textAllocation;JTextField[][] textNeed;JTextField textProcessName;JTextField[] textRequest;int available[];int max[][];int need[][];int allocated[][];int SafeSequence[];int request[];boolean Finish[];int worked[];boolean flag = false;JFrame f1;JFrame f2;JFrame f3;JTextArea jt;void display() {Border border = BorderFactory.createLoweredBevelBorder(); Border borderTitled = BorderFactory.createTitledBorder(border, "按钮区"); textAvailable = new JTextField[5];textAllocation = new JTextField[6][5];textNeed = new JTextField[6][5];textProcessName = new JTextField("");textProcessName.setEnabled(false);textRequest = new JTextField[5];tf1 = new JTextField(20);tf2 = new JTextField(20);labelInfo = new JLabel("请先输入资源个数和进程个数(1~6), 后单击确定");JPanel contentPane;contentPane = (JPanel) this.getContentPane(); contentPane.setLayout(null);contentPane.setBackground(Color.pink);labelInfo.setBounds(50, 10, 300, 40);labelInfo.setOpaque(true);labelInfo.setForeground(Color.red);labelInfo.setBackground(Color.pink);contentPane.add(labelInfo, null);JLabel b1 = new JLabel("资源个数:");b1.setForeground(Color.blue);JLabel b2 = new JLabel("进程个数:");b2.setForeground(Color.blue);b1.setBounds(50, 80, 80, 30);contentPane.add(b1, null);tf1.setBounds(180, 80, 170, 30);contentPane.add(tf1, null);b2.setBounds(50, 150, 80, 30);contentPane.add(b2, null);tf2.setBounds(180, 150, 170, 30);contentPane.add(tf2, null);button1 = new JButton("确定");button = new JButton("重置");button1.setBounds(80, 200, 80, 30);contentPane.add(button1, null);button.setBounds(220, 200, 80, 30);contentPane.add(button, null);this.setSize(400, 300);this.setResizable(false);this.setTitle("银行家算法(SXJ)");this.setLocationRelativeTo(null);this.setDefaultClo搜索引擎优化peration(EXIT_ON_CLOSE); this.setVisible(true);f1 = new JFrame();labelInfo1 = new JLabel("请先输入最年夜需求和分配矩阵, 然后单击初始化");JPanel contentPane1;contentPane1 = (JPanel) f1.getContentPane();contentPane1.setLayout(null);contentPane1.setBackground(Color.pink);labelInfo1.setOpaque(true);labelInfo1.setBounds(75, 10, 400, 40);labelInfo1.setBackground(Color.pink);labelInfo1.setForeground(Color.blue);contentPane1.add(labelInfo1, null);JLabel labelAvailableLabel = new JLabel("AllResource:"); JLabel labelNeedLabel = new JLabel("MaxNeed:");JLabel labelAllocationLabel = new JLabel("allocated:"); JLabel labelRequestLabel = new JLabel("request process:"); labelNeedLabel.setBounds(75, 90, 100, 20);// x,y,width,heightcontentPane1.add(labelNeedLabel, null); labelAllocationLabel.setBounds(75, 240, 100, 20); contentPane1.add(labelAllocationLabel, null); labelAvailableLabel.setBounds(75, 70, 100, 20); contentPane1.add(labelAvailableLabel, null); labelRequestLabel.setBounds(75, 400, 100, 20); contentPane1.add(labelRequestLabel, null);JLabel[] labelProcessLabel1 = { new JLabel("进程1"), new JLabel("进程2"),new JLabel("进程3"), new JLabel("进程4"), new JLabel("进程5"),new JLabel("进程6") };JLabel[] labelProcessLabel2 = { new JLabel("进程1"), newJLabel("进程2"),new JLabel("进程3"), new JLabel("进程4"), new JLabel("进程5"),new JLabel("进程6") };JPanel pPanel1 = new JPanel(), pPanel2 = new JPanel(), pPanel3 = new JPanel(), pPanel4 = new JPanel();pPanel1.setLayout(null);pPanel2.setLayout(null);/** pPanel4.setLayout(null); pPanel4.setBounds(440,120,90,270);* pPanel4.setBorder(borderTitled);*/buttonSetInit = new JButton("初始化");buttonsearch = new JButton("检测平安性");button2 = new JButton("重置");buttonRequest = new JButton("请求资源");buttonSetInit.setBounds(420, 140, 100, 30);contentPane1.add(buttonSetInit, null);buttonsearch.setBounds(420, 240, 100, 30);contentPane1.add(buttonsearch, null);button2.setBounds(420, 340, 100, 30);contentPane1.add(button2, null);buttonRequest.setBounds(420, 425, 100, 30);contentPane1.add(buttonRequest, null);for (int pi = 0; pi < 6; pi++) {labelProcessLabel1[pi].setBounds(0, 0 + pi * 20, 60, 20); labelProcessLabel2[pi].setBounds(0, 0 + pi * 20, 60, 20); }pPanel1.setBounds(75, 120, 60, 120);pPanel2.setBounds(75, 270, 60, 120);for (int pi = 0; pi < 6; pi++) {pPanel1.add(labelProcessLabel1[pi], null);pPanel2.add(labelProcessLabel2[pi], null);}contentPane1.add(pPanel1);contentPane1.add(pPanel2);contentPane1.add(pPanel4);for (int si = 0; si < 5; si++)for (int pi = 0; pi < 6; pi++) {textNeed[pi][si] = new JTextField();textNeed[pi][si].setBounds(150 + si * 50, 120 + pi * 20, 50, 20); textNeed[pi][si].setEditable(false);textAllocation[pi][si] = new JTextField();textAllocation[pi][si].setBounds(150 + si * 50, 270 + pi * 20,50, 20);textAllocation[pi][si].setEditable(false);}for (int si = 0; si < 5; si++) {textAvailable[si] = new JTextField();textAvailable[si].setEditable(false);textAvailable[si].setBounds(150 + si * 50, 70, 50, 20); textRequest[si] = new JTextField();textRequest[si].setEditable(false);textRequest[si].setBounds(150 + si * 50, 430, 50, 20); contentPane1.add(textAvailable[si], null);contentPane1.add(textRequest[si], null);}for (int pi = 0; pi < 6; pi++)for (int si = 0; si < 5; si++) {contentPane1.add(textNeed[pi][si], null);contentPane1.add(textAllocation[pi][si], null);}textProcessName.setBounds(80, 430, 50, 20);contentPane1.add(textProcessName, null);f1.setSize(550, 500);f1.setResizable(false);f1.setTitle("银行家算法(SXJ)");f1.setLocationRelativeTo(null);f1.setDefaultClo搜索引擎优化peration(EXIT_ON_CLOSE);// f1.setVisible(true);f1.setVisible(false);f2 = new JFrame("平安序列显示框");jt = new JTextArea(75, 40);jt.setBackground(Color.pink);jt.setForeground(Color.blue);JScrollPane scrollPane = new JScrollPane(jt); // 加滚动条scrollPane.setBorder(BorderFactory.createLoweredBevelBord er());// 鸿沟(f2.getContentPane()).add(scrollPane);f2.setSize(450, 400);f2.setResizable(false);f2.setDefaultClo搜索引擎优化peration(EXIT_ON_CLOSE);f2.setVisible(false);buttonSetInit.setEnabled(false);buttonRequest.setEnabled(false);buttonsearch.setEnabled(false);button1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {// labelInfo.setText("请先初始化allocated和Maxneed, 后单击初始化按钮");f1.setVisible(true);buttonSetInit.setEnabled(true);resourceNum = Integer.parseInt(tf1.getText()); processNum = Integer.parseInt(tf2.getText());for (int i = 0; i < processNum; i++) {for (int j = 0; j < resourceNum; j++) {textNeed[i][j].setEditable(true);textAllocation[i][j].setEditable(true);textAvailable[j].setEditable(true);}}}});buttonSetInit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {Init();buttonsearch.setEnabled(true);}});buttonsearch.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {count = 0;SafeSequence = new int[processNum];worked = new int[resourceNum];Finish = new boolean[processNum];copyVector(worked, available);Safety(0);jt.append("平安序列数量:" + count);if (flag) {labelInfo1.setText("以后系统状态:平安");f2.setVisible(true);buttonRequest.setEnabled(true);textProcessName.setEnabled(true);for (int i = 0; i < resourceNum; i++) {textRequest[i].setEditable(true);}} else {labelInfo1.setText("以后系统状态:不服安");}buttonSetInit.setEnabled(false);}});buttonRequest.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {count = 0;for (int i = 0; i < processNum; i++) {Finish[i] = false;}jt.setText("");flag = false;RequestResource();}});button2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {/** tf1.setText(""); tf2.setText("");*/f2.setVisible(false);jt.setText("");for (int i = 0; i < processNum; i++) {for (int j = 0; j < resourceNum; j++) {textNeed[i][j].setText("");textAllocation[i][j].setText("");textAvailable[j].setText("");textRequest[j].setText("");// textNeed[i][j].setEditable(false);// textAllocation[i][j].setEditable(false);// textAvailable[j].setEditable(false);textRequest[j].setEditable(false);textProcessName.setText("");Finish[i] = false;}}flag = false;buttonsearch.setEnabled(false);// labelInfo.setText("请先输入资源个数和进程个数, 后单击确定");}});button.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {tf1.setText("");tf2.setText("");f2.setVisible(false);jt.setText("");flag = false;}});}void copyVector(int[] v1, int[] v2) { for (int i = 0; i < v1.length; i++) v1[i] = v2[i];}void Add(int[] v1, int[] v2) {for (int i = 0; i < v1.length; i++) v1[i] += v2[i];}void Sub(int[] v1, int[] v2) {for (int i = 0; i < v1.length; i++) v1[i] -= v2[i];}boolean Smaller(int[] v1, int[] v2) { boolean value = true;for (int i = 0; i < v1.length; i++)if (v1[i] > v2[i]) {value = false;break;}return value;}public static void main(String[] args) {OsBanker ob = new OsBanker();ob.display();// System.out.println(" "+count);}void Init() // 初始化把持矩阵{available = new int[resourceNum];for (int i = 0; i < resourceNum; i++) {available[i] = Integer.parseInt(textAvailable[i].getText());}max = new int[processNum][resourceNum];allocated = new int[processNum][resourceNum];need = new int[processNum][resourceNum];for (int i = 0; i < processNum; i++) {for (int j = 0; j < resourceNum; j++) {max[i][j] = Integer.parseInt(textNeed[i][j].getText()); allocated[i][j] = Integer.parseInt(textAllocation[i][j] .getText());}}for (int i = 0; i < resourceNum; i++)for (int j = 0; j < processNum; j++)need[j][i] = max[j][i] - allocated[j][i];for (int i = 0; i < resourceNum; i++)for (int j = 0; j < processNum; j++) {available[i] -= allocated[j][i];if (available[i] < 0) {labelInfo.setText("您输入的数据有误,请重新输入");}}}void Safety(int n) // 查找所有平安序列{if (n == processNum) {count++;for (int i = 0; i < processNum; i++) {jt.append("进程" + (SafeSequence[i] + 1) + " "); }jt.append("\n");flag = true;return;}for (int i = 0; i < processNum; i++) {if (Finish[i] == false) {boolean OK = true;for (int j = 0; j < resourceNum; j++) {if (need[i][j] > worked[j]) {OK = false;break;}}if (OK) {for (int j = 0; j < resourceNum; j++) {worked[j] += allocated[i][j];}Finish[i] = true;SafeSequence[n] = i;Safety(n + 1);Finish[i] = false;SafeSequence[n] = -1;// num++;for (int j = 0; j < resourceNum; j++) {worked[j] -= allocated[i][j];}}}}}void RequestResource() { // 请求资源jt.setText("");int processname = (Integer.parseInt(textProcessName.getText()) - 1);request = new int[resourceNum];for (int i = 0; i < resourceNum; i++) {request[i] = Integer.parseInt(textRequest[i].getText());}if (!Smaller(request, need[processname])) {labelInfo.setText("资源请求不符该进程的需求量.");} else if (!Smaller(request, available)) {labelInfo1.setText("可用资源缺乏以满足请求,进程需要等} else {Sub(available, request);Add(allocated[processname], request);Sub(need[processname], request);copyVector(worked, available);Safety(0);if (flag) {labelInfo1.setText("可立即分配给该进程!");} else {labelInfo1.setText("分配后招致系统处于不服安状态!,不成立即分配");Add(available, request);Sub(allocated[processname], request);Add(need[processname], request);}}// }}}五、实验结果:初始界面:检测平安性:请求资源:(1)进程2(1, 0, 2)(2)进程5(3, 3, 0)(3)进程1(0, 2, 0)六、遇到的问题及缺乏之处:1、法式编写的时候规定最年夜资源数和最年夜进程数均<=6.2、法式直接初始化了6个进程框, 既浪费了内存空间, 又对可视化界面的美观造成影响.3、未对输入异常进行处置:比如在请求资源的第一个方框中只能填入进程的数字编号, 当填入的为非整数时, 法式会抛出异常.4、未解决进程名中对字符串的处置, 直接固定进程名为数字, 用户不能直接输入原有的进程名, 造成欠好的用户体验.。
操作系统银行家算法(避免死锁)实验报告

操作系统实验:银行家算法姓名:李天玮班级:软工1101 学号:201126630117 实验内容:在windows系统中实现银行家算法程序。
实现银行家算法所用的数据结构:假设有5个进程3类资源,则有如下数据结构:1.MAX[5,3] 5个进程对3类资源的最大需求量。
2.A V AILABLE[3]系统可用资源数。
3.ALLOCATION[5,3]5个进程已经得到3类资源的资源量。
4.NEED[5,3]5个进程还需要3类资源的资源量。
银行家算法:设进程1提出请求Request[N],则银行家算法按如下规则进行判断。
(1)如果Request[N]<=NEED[1,N],则转(2);否则,出错。
(2)如果Request[N]<=A V ALIABLE,则转(3);否则,出错。
(3)系统试探非配资源,修改相关数据。
A V ALIABLE=A V ALIABLE-REQUESTALLOCATION=ALLOCA TION+REQUESTNEED=NEED-REQUEST(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
安全性检查:(1)设置两个工作向量WORK=A V AILABLE;FINISH[M]=FALSE.(2)从晋城集合中找到一个满足下述条件的进程,FINISH[i]=FALSENEED<=WORK如找到,执行(3);否则,执行(4)。
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
WORK=WORK+ALLOCATIONFINISH[i]=TRUEGOTO(2)(4)如所有进程FINISH[M]=TRUE,则表示安全;否则系统不安全。
1.用init()函数对于数据的初始化关键代码:#define M 5#define N 3void init(){cout<<"请输入5个进程对3类资源最大资源需求量:"<<endl;for(int i=0;i<M;i++){for(int j=0;j<N;j++){cin>>MAX[i][j];}//cout<<endl;}cout<<"请输入系统可用的资哩源数:"<<endl;for(int j=0;j<N;j++){cin>>AVAILABLE[j];}cout<<"请输入5个进程已经-的到的3类资源的资源量:"<<endl;for(int i=0;i<M;i++){for(int j=0;j<N;j++){cin>>ALLOCATION[i][j];}//cout<<endl;}cout<<"请?输?入?5个?进?程ì还1需è要癮3类え?资哩?源′的?资哩?源′量?:"<<endl;for(int i=0;i<M;i++){for(int j=0;j<N;j++){cin>>NEED[i][j];}//cout<<endl;}}// Stack around the variable 'AVAILABLE' was corrupted.显示数据详细信息进行测试输入一号进程号,并给需要申请资源设定为{1,0,2}检验错误输入时候的报错信息检验当再次申请0号资源并申请资源数目为{0,2,0}时,系统提示系统不安全申请不成功。
实验三 死锁的避免--银行家算法

实验三死锁的避免――银行家算法一、实验目的1.掌握死锁产生的原因。
2.掌握银行家算法。
3.能使用高级语言模拟实现银行家算法。
二、相关数据结构1.可利用资源向量Available ,它是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源的数目,其初始值是系统中所配置的该类全部可用资源数目。
其数值随该类资源的分配和回收而动态地改变。
如果Available[j]=k,标是系统中现有j类资源k个。
2.最大需求矩阵Max,这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。
如果Max[i][j]=k,表示进程i需要j类资源的最大数目为k。
3.分配矩阵Allocation,这是一个n×m的矩阵,它定义了系统中的每类资源当前分配到每一个进程的资源数。
如果Allocation[i][j]=k,表示进程i当前已经分到j类资源的数目为k个。
Allocation[i]表示进程i的分配向量。
4.需求矩阵Need,这是一个n×m的矩阵,用以表示每个进程还需要的各类资源的数目。
如果Need[i][j]=k,表示进程i还需要j类资源k个,才能完成其任务。
Need[i]表示进程i的需求向量。
上述三个矩阵间存在关系:Need[i][j]=Max[i][j]-Allocation[i][j];三、银行家算法Request是进程i的请求向量。
Request[j]=k表示进程i请求分配j类资源k个。
当进程i发出资源请求后,系统按下述步骤进行检查:1.如果Request ≤Need[i],则转向步骤2;否则,认为出错,因为它所请求的资源数已超过它当前的最大需求量。
2.如果Request ≤Available,则转向步骤3;否则,表示系统中尚无足够的资源满足进程i 的申请,进程i必须等待。
3.系统试探性地把资源分配给进程i,并修改下面数据结构中的数值:Available = Available - RequestAllocation[i]= Allocation[i]+ RequestNeed[i]= Need[i]- Request4.系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
操作系统实验报告--银行家算法

操作系统实验报告二一:实验标题:实现死锁避免算法:银行家算法。
二:实验环境:操作系统:windows7编译器:Visual Studio 2010三:设计方案:1.实验目的通过程序模拟银行家算法,理解如何应用银行家算法避免死锁。
2.实验手段直接在C源程序定义整形进程数量、资源种类;用2维数组表示最大需求、已分配的资源。
从文件获取相关数量。
3.验证方式检验当前资源是否有安全序列,是的话输出安全序列。
四:实验代码:#include<stdio.h>#include<stdlib.h>#define P_num 5#define R_num 3int Allocation[P_num][R_num],Avaliable[R_num],Max[P_num][R_num]; int Need[P_num][R_num];int compare(int *a,int *b,int n){ int i;for(i = 0;i < n;i ++)if(a[i] < b[i])return 0;return 1;}void add(int *a,int *b,int n){ int i;for(i = 0;i < n;i++)a[i] += b[i];}void substract(int *a,int *b,int n){ int i;for(i = 0;i < n;i++)a[i] -= b[i];}void assign(int *a,int *b,int n){ int i;for(i = 0;i < n;i ++)a[i] = b[i];}void input(){FILE *fp;int i,j;if((fp = fopen("banker.txt","r")) == 0){ printf("cannot open the file");exit(0);}for(i = 0;i < P_num; ++i)for(j = 0;j < R_num; ++j){fscanf(fp,"%d",&Allocation[i][j]);}for(i = 0;i < P_num; ++i)for(j = 0;j < R_num; ++j){fscanf(fp,"%d",&Max[i][j]);}for(j = 0;j < R_num; ++j){fscanf(fp,"%d",&Avaliable[j]);}fclose(fp);for(i = 0;i < P_num; ++i)for(j = 0;j < R_num; ++j){Need[i][j] = Max[i][j] - Allocation[i][j];}}int issafe(int *sp){int i;int count = 0;int n = 0;int work[R_num],finish[P_num];assign(work,Avaliable,R_num);for(i = 0;i < P_num;i ++)finish[i] = 0;n = P_num;while(n --){for(i = 0;i < P_num;i ++)if((finish[i] == 0) && compare(work,Need[i],R_num)){ add(work,Allocation[i],R_num);finish[i] = 1;sp[count] = i;count ++;}if(count >= P_num)return 1;}return 0;}int request(int pid,int *r,int n){int i;int sp[P_num];if(compare(Need[pid],r,n) == 1 && compare(Avaliable,r,n) == 1){ substract(Avaliable,r,n);add(Allocation[pid],r,n);substract(Need[pid],r,n);if(issafe(sp)){printf("Security Path:\n\t");for(i = 0;i < P_num;i ++)printf("p[%d] ",sp[i]);printf("\n");return 1;}else{add(Avaliable,r,n);substract(Allocation[pid],r,n);add(Need[pid],r,n);printf("no Security Parh on this request\n");return 0;}}else{printf("no Security Parh on this request\n");return 0;}}void main(){int id,i;int r[R_num],sp[P_num];input();if(issafe(sp)){printf("Security Path:\n\t");for(i = 0;i < P_num;i ++)printf("p[%d] ",sp[i]);printf("\n");}elseprintf("failed\n");printf("input the new request's id:");scanf("%d",&id);printf("input the new request:");for(i = 0;i < R_num;++ i)scanf("%d",&r[i]);request(id,r,R_num);}banker.txt文件内容:0 1 02 0 03 0 22 1 10 0 27 5 33 2 29 0 22 2 24 3 33 3 2所得结果:Security Path:P[1] p[3] p[4] p[0] p[2] Intput the new request's id:0Input the new request:0 2 0Security Path:p[3] p[1] p[2] p[0] p[4] 问题和想法:。
操作系统实验三报告-预防进程死锁的银行家算法

操作系统实验报告实验三预防进程死锁的银行家算法学号:班级:姓名:【实验目的】通过这次实验,加深对进程死锁的理解,进一步掌握进程资源的分配、死锁的检测和安全序列的生成方法。
【实验内容】问题描述:设计程序模拟预防进程死锁的银行家算法的工作过程。
假设有系统中有n个进程P1, … ,P n,有m类可分配的资源R1, … ,R m,在T0时刻,进程P i分配到的j类资源为Allocation ij个,它还需要j类资源Need ij个,系统目前剩余j类资源Work j个,现采用银行家算法进行进程资源分配预防死锁的发生。
程序要求如下:1)判断当前状态是否安全,如果安全,给出安全序列;如果不安全给出理由。
2)对于下一个时刻T1,某个进程P k会提出请求Request(R1, … ,R m),判断分配给P k进程请求的资源之后。
3)输入:进程个数n,资源种类m,T0时刻各个进程的资源分配情况(可以运行输入,也可以在程序中设置);4)输出:如果安全输出安全的进程序列,不安全提示信息。
实现提示:用C++语言实现提示:1)程序中进程调度时间变量描述如下:int Available[MaxNumber];int Max[MaxNumber][MaxNumber];int Allocation[MaxNumber][MaxNumber];int Need[MaxNumber][MaxNumber];int Request[MaxNumber];int SafeOrder[MaxNumber];2)进程调度的实现过程如下:➢变量初始化;➢接收用户输入n,m,(输入或者默认的)Allocation ij,Need ij;➢按照银行家算法判断当前状态安全与否,安全给出安全序列,不安全给出提示;➢如果安全,提示用户输入下一时刻进程P k的资源请求Request(R1, … ,R m);➢如果不安全或者无新请求则退出。
实验要求:1)上机前认真复习银行家算法,熟悉资源分配和安全检查过程;2)上机时独立编程、调试程序;3)根据具体实验要求,完成好实验报告(包括实验的目的、内容、要求、源程序、实例运行结果截图)。
银行家算法操作系统实验报告

竭诚为您提供优质文档/双击可除银行家算法操作系统实验报告篇一:计算机操作系统银行家算法实验报告计算机操作系统实验报告一、实验名称:银行家算法二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
三、问题分析与设计:1、算法思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。
若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。
若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。
2、银行家算法步骤:(1)如果Requesti<or=need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。
(3)系统试探把要求的资源分配给进程pi,并修改下面数据结构中的数值:Available=Available-Request[i];Allocation=Allocation+Request;need=need-Request;(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
3、安全性算法步骤:(1)设置两个向量①工作向量work。
它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,work=Allocation;②布尔向量Finish。
它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时,令Finish[i]=true。
(2)从进程集合中找到一个能满足下述条件的进程:①Finish[i]=false②need 如找到,执行步骤(3);否则,执行步骤(4)。
(3)当进程p获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:work=work+Allocation;Finish[i]=true;转向步骤(2)。
操作系统实验三银行家算法

实验三银行家算法一、实验内容运用某种高级语言(如C或C++)模拟银行家算法的处理过程。
二、实验目的银行家算法是避免死锁的代表性算法。
本实验旨在加深了解有关资源申请、避免死锁、状态安全性等概念,并体会和运用避免死锁的具体实施方法。
然后依照本实验,自行设计模拟程序。
三、实验题目银行家算法的模拟。
[提示]:(1) 我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
(2) 安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。
安全状态一定是没有死锁发生。
不安全状态:不存在一个安全序列。
不安全状态一定导致死锁。
安全序列:一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j <i )当前占有资源量之和。
(3) 设requesti为进程p[i]的请求向量,如果requesti[j]=K,表示进程p[i]需要K个Rj 资源。
当系统发出请求后,系统按下述步骤开始检查:1)如果requesti[j]<=need[i][j],转向步骤2;否则报告出错,申请的资源已经大于它需要的最大值。
2)如果requesti[j]<=available[j],转向步骤3;否则报告出错,尚无足够的资源。
操作系统银行家算法实验报告

操作系统银行家算法实验报告操作系统银行家算法实验报告引言:操作系统是计算机科学中的一个重要领域,它负责管理计算机的硬件和软件资源,以提供良好的用户体验。
在操作系统中,银行家算法是一种重要的资源分配和调度算法,它可以确保系统中的进程安全地访问资源,避免死锁的发生。
本实验旨在通过实践运用银行家算法,深入理解其原理和应用。
实验目的:1. 理解银行家算法的基本原理;2. 掌握银行家算法的实现方法;3. 分析银行家算法在资源管理中的应用。
实验过程:1. 实验环境的搭建在本次实验中,我们使用了一台运行Windows操作系统的计算机,并安装了Java开发环境。
同时,我们使用了一个模拟的资源管理系统,以便更好地理解和实践银行家算法。
2. 银行家算法的原理银行家算法是通过对系统中的资源进行合理分配,以避免死锁的发生。
它基于以下几个假设:- 每个进程对资源的最大需求量是已知的;- 系统中的资源数量是有限的;- 进程在请求资源时必须先声明其最大需求量;- 进程在释放资源后,不能再重新请求。
3. 银行家算法的实现银行家算法的实现主要包括以下几个步骤:- 初始化:获取系统中的资源总量和每个进程的最大需求量;- 安全性检查:通过模拟分配资源并检查系统是否处于安全状态,以确定是否可以满足进程的资源请求;- 资源分配:根据安全性检查的结果,决定是否分配资源给进程。
4. 银行家算法的应用银行家算法在实际应用中具有广泛的用途,尤其是在多任务操作系统中。
它可以用于资源的分配和调度,以确保系统中的进程能够安全地访问资源,避免死锁的发生。
结论:通过本次实验,我们深入了解了银行家算法的原理和应用。
银行家算法作为一种重要的资源管理和调度算法,可以有效地避免死锁的发生,提高系统的可靠性和稳定性。
在今后的学习和工作中,我们将继续深入研究操作系统相关的算法和原理,以提升自己在该领域的专业能力。
死锁-银行家算法实验报告

死锁-银行家算法实验报告案场各岗位服务流程销售大厅服务岗:1、销售大厅服务岗岗位职责:1)为来访客户提供全程的休息区域及饮品;2)保持销售区域台面整洁;3)及时补足销售大厅物资,如糖果或杂志等;4)收集客户意见、建议及现场问题点;2、销售大厅服务岗工作及服务流程阶段工作及服务流程班前阶段1)自检仪容仪表以饱满的精神面貌进入工作区域2)检查使用工具及销售大厅物资情况,异常情况及时登记并报告上级。
班中工作程序服务流程行为规范迎接指引递阅资料上饮品(糕点)添加茶水工作要求1)眼神关注客人,当客人距3米距离时,应主动跨出自己的位置迎宾,然后侯客迎询问客户送客户注意事项15度鞠躬微笑问候:“您好!欢迎光临!”2)在客人前方1-2米距离领位,指引请客人向休息区,在客人入座后问客人对座位是否满意:“您好!请问坐这儿可以吗?”得到同意后为客人拉椅入座“好的,请入座!”3)若客人无置业顾问陪同,可询问:请问您有专属的置业顾问吗?,为客人取阅项目资料,并礼貌的告知请客人稍等,置业顾问会很快过来介绍,同时请置业顾问关注该客人;4)问候的起始语应为“先生-小姐-女士早上好,这里是XX销售中心,这边请”5)问候时间段为8:30-11:30 早上好11:30-14:30 中午好 14:30-18:00下午好6)关注客人物品,如物品较多,则主动询问是否需要帮助(如拾到物品须两名人员在场方能打开,提示客人注意贵重物品);7)在满座位的情况下,须先向客人致歉,在请其到沙盘区进行观摩稍作等待;阶段工作及服务流程班中工作程序工作要求注意事项饮料(糕点服务)1)在所有饮料(糕点)服务中必须使用托盘;2)所有饮料服务均已“对不起,打扰一下,请问您需要什么饮品”为起始;3)服务方向:从客人的右面服务;4)当客人的饮料杯中只剩三分之一时,必须询问客人是否需要再添一杯,在二次服务中特别注意瓶口绝对不可以与客人使用的杯子接触;5)在客人再次需要饮料时必须更换杯子;下班程序1)检查使用的工具及销售案场物资情况,异常情况及时记录并报告上级领导;2)填写物资领用申请表并整理客户意见;3)参加班后总结会;4)积极配合销售人员的接待工作,如果下班时间已经到,必须待客人离开后下班;1.3.3.3吧台服务岗1.3.3.3.1吧台服务岗岗位职责1)为来访的客人提供全程的休息及饮品服务;2)保持吧台区域的整洁;3)饮品使用的器皿必须消毒;4)及时补充吧台物资;5)收集客户意见、建议及问题点;1.3.3.3.2吧台服务岗工作及流程阶段工作及服务流程班前阶段1)自检仪容仪表以饱满的精神面貌进入工作区域2)检查使用工具及销售大厅物资情况,异常情况及时登记并报告上级。
操作系统实验报告-利用银行家算法避免死锁

估计机支配系统真验报告之阳早格格创做题目利用银止家算法预防死锁一、真验手段:1、加深相识有闭资材申请、预防死锁等观念,并感受战相识死锁战预防死锁的简曲真施要领.2、央供编写战调试一个系统动背调配资材的简朴模拟步调,瞅察死锁爆收的条件,并采与银止家算法,灵验的预防战预防死锁的爆收.二、真验真质:用银止家算法真止资材调配:安排五个进程{p0,p1,p2,p3,p4}同享三类资材{A,B,C}的系统,比圆,{A,B,C}的资材数量分别为10,5,7.进程可动背天申请资材战释搁资材,系统按进程的申请动背天调配资材,央供步调具备隐现战挨印各进程的某一个时刻的资材调配表战仄安序列;隐现战挨印各进程依次央供申请的资材号以及为某进程调配资材后的有闭资材数据.三、问题分解与安排:1、算法思路:先对于用户提出的哀供举止合法性查看,即查看哀供是可大于需要的,是可大于可利用的.若哀供合法,则举止预调配,对于调配后的状态调用仄安性算法举止查看.若仄安,则调配;若没有服安,则中断申请,回复到本去的状态,中断申请.2、银止家算法步调:(1)如果Requesti<or =Need,则转背步调(2);可则,认为堕落,果为它所需要的资材数已超出它所宣布的最大值.(2)如果Request<or=Available,则转背步调(3);可则,表示系统中尚无脚够的资材,进程必须等待.(3)系统探索把央供的资材调配给进程Pi,并建改底下数据结构中的数值:Available=Available-Request[i];Allocation=Allocation+Request;Need=Need-Request;(4)系统真止仄安性算法,查看此次资材调配后,系统是可处于仄安状态.3、仄安性算法步调:(1)树坐二个背量①处事背量Work.它表示系统可提供进程继承运止所需要的百般资材数目,真止仄安算法启初时,Work=Allocation;②布我背量Finish.它表示系统是可有脚够的资材调配给进程,使之运止完毕,启初时先干Finish[i]=false,当有脚够资材调配给进程时,令Finish[i]=true.(2)从进程集中中找到一个能谦脚下述条件的进程:①Finish[i]=false②Need<or=Work如找到,真止步调(3);可则,真止步调(4).(3)当进程P赢得资材后,可成功真止,曲至完毕,并释搁出调配给它的资材,故应真止:Work=Work+Allocation;Finish[i]=true;转背步调(2).(4)如果所有进程的Finish[i]=true,则表示系统处于仄安状态;可则,系统处于没有服安状态.4、过程图:系统主要历程过程图银止家算法过程图仄安性算法过程图5、主要数据结构假设有M个进程N类资材,则犹如下数据结构:int max[M*N] M个进程对于N类资材的最大需要量int available[N] 系统可用资材数int allocated[M*N] M个进程已经得到N类资材的资材量int need[M*N] M个进程还需要N类资材的资材量int worked[] 系统提供给进程继承运止所需的百般资材数目四、源代码import java.awt.*;import javax.swing.*;import java.util.*;import java.awt.event.*;import javax.swing.border.*;public class OsBanker extends JFrame { // 界里安排JLabel labelInfo;JLabel labelInfo1;int resourceNum, processNum;int count = 0;JButton buttonRequest, buttonSetInit, button, button1, buttonsearch,button2;JTextField tf1, tf2;JTextField[] textAvailable;JTextField[][] textAllocation;JTextField[][] textNeed;JTextField textProcessName;JTextField[] textRequest;int available[];int max[][];int need[][];int allocated[][];int SafeSequence[];int request[];boolean Finish[];int worked[];boolean flag = false;JFrame f1;JFrame f2;JFrame f3;JTextArea jt;void display() {Border border = BorderFactory.createLoweredBevelBorder(); Border borderTitled = BorderFactory.createTitledBorder(border, "按钮区");textAvailable = new JTextField[5];textAllocation = new JTextField[6][5];textNeed = new JTextField[6][5];textProcessName = new JTextField(""); textProcessName.setEnabled(false);textRequest = new JTextField[5];tf1 = new JTextField(20);tf2 = new JTextField(20);labelInfo = new JLabel("请先输进资材个数战进程个数(1~6),后单打决定");JPanel contentPane;contentPane = (JPanel) this.getContentPane(); contentPane.setLayout(null);contentPane.setBackground(Color.pink);labelInfo.setBounds(50, 10, 300, 40);labelInfo.setOpaque(true);labelInfo.setForeground(Color.red);labelInfo.setBackground(Color.pink);contentPane.add(labelInfo, null);JLabel b1 = new JLabel("资材个数:");b1.setForeground(Color.blue);JLabel b2 = new JLabel("进程个数:");b2.setForeground(Color.blue);b1.setBounds(50, 80, 80, 30);contentPane.add(b1, null);tf1.setBounds(180, 80, 170, 30);contentPane.add(tf1, null);b2.setBounds(50, 150, 80, 30);contentPane.add(b2, null);tf2.setBounds(180, 150, 170, 30);contentPane.add(tf2, null);button1 = new JButton("决定");button = new JButton("沉置");button1.setBounds(80, 200, 80, 30);contentPane.add(button1, null);button.setBounds(220, 200, 80, 30);contentPane.add(button, null);this.setSize(400, 300);this.setResizable(false);this.setTitle("银止家算法(SXJ)");this.setLocationRelativeTo(null);this.setDefaultClo搜索引擎劣化peration(EXIT_ON_CLOSE); this.setVisible(true);f1 = new JFrame();labelInfo1 = new JLabel("请先输进最大需要战调配矩阵,而后单打初初化");JPanel contentPane1;contentPane1 = (JPanel) f1.getContentPane();contentPane1.setLayout(null);contentPane1.setBackground(Color.pink);labelInfo1.setOpaque(true);labelInfo1.setBounds(75, 10, 400, 40);labelInfo1.setBackground(Color.pink);labelInfo1.setForeground(Color.blue);contentPane1.add(labelInfo1, null);JLabel labelAvailableLabel = new JLabel("AllResource:"); JLabel labelNeedLabel = new JLabel("MaxNeed:");JLabel labelAllocationLabel = new JLabel("allocated:"); JLabel labelRequestLabel = new JLabel("request process:"); labelNeedLabel.setBounds(75, 90, 100, 20);// x,y,width,heightcontentPane1.add(labelNeedLabel, null); labelAllocationLabel.setBounds(75, 240, 100, 20); contentPane1.add(labelAllocationLabel, null); labelAvailableLabel.setBounds(75, 70, 100, 20); contentPane1.add(labelAvailableLabel, null); labelRequestLabel.setBounds(75, 400, 100, 20);contentPane1.add(labelRequestLabel, null);JLabel[] labelProcessLabel1 = { new JLabel("进程1"), new JLabel("进程2"),new JLabel("进程3"), new JLabel("进程4"), new JLabel("进程5"),new JLabel("进程6") };JLabel[] labelProcessLabel2 = { new JLabel("进程1"), new JLabel("进程2"),new JLabel("进程3"), new JLabel("进程4"), new JLabel("进程5"),new JLabel("进程6") };JPanel pPanel1 = new JPanel(), pPanel2 = new JPanel(), pPanel3 = new JPanel(), pPanel4 = new JPanel();pPanel1.setLayout(null);pPanel2.setLayout(null);/** pPanel4.setLayout(null); pPanel4.setBounds(440,120,90,270); * pPanel4.setBorder(borderTitled);*/buttonSetInit = new JButton("初初化");buttonsearch = new JButton("检测仄安性");button2 = new JButton("沉置");buttonRequest = new JButton("哀供资材");buttonSetInit.setBounds(420, 140, 100, 30);contentPane1.add(buttonSetInit, null);buttonsearch.setBounds(420, 240, 100, 30);contentPane1.add(buttonsearch, null);button2.setBounds(420, 340, 100, 30);contentPane1.add(button2, null);buttonRequest.setBounds(420, 425, 100, 30); contentPane1.add(buttonRequest, null);for (int pi = 0; pi < 6; pi++) {labelProcessLabel1[pi].setBounds(0, 0 + pi * 20, 60, 20); labelProcessLabel2[pi].setBounds(0, 0 + pi * 20, 60, 20); }pPanel1.setBounds(75, 120, 60, 120);pPanel2.setBounds(75, 270, 60, 120);for (int pi = 0; pi < 6; pi++) {pPanel1.add(labelProcessLabel1[pi], null);pPanel2.add(labelProcessLabel2[pi], null);}contentPane1.add(pPanel1);contentPane1.add(pPanel2);contentPane1.add(pPanel4);for (int si = 0; si < 5; si++)for (int pi = 0; pi < 6; pi++) {textNeed[pi][si] = new JTextField();textNeed[pi][si].setBounds(150 + si * 50, 120 + pi * 20, 50, 20); textNeed[pi][si].setEditable(false);textAllocation[pi][si] = new JTextField();textAllocation[pi][si].setBounds(150 + si * 50, 270 + pi * 20, 50, 20);textAllocation[pi][si].setEditable(false);}for (int si = 0; si < 5; si++) {textAvailable[si] = new JTextField();textAvailable[si].setEditable(false);textAvailable[si].setBounds(150 + si * 50, 70, 50, 20); textRequest[si] = new JTextField();textRequest[si].setEditable(false);textRequest[si].setBounds(150 + si * 50, 430, 50, 20); contentPane1.add(textAvailable[si], null);contentPane1.add(textRequest[si], null);}for (int pi = 0; pi < 6; pi++)for (int si = 0; si < 5; si++) {contentPane1.add(textNeed[pi][si], null);contentPane1.add(textAllocation[pi][si], null);}textProcessName.setBounds(80, 430, 50, 20); contentPane1.add(textProcessName, null);f1.setSize(550, 500);f1.setResizable(false);f1.setTitle("银止家算法(SXJ)");f1.setLocationRelativeTo(null);f1.setDefaultClo搜索引擎劣化peration(EXIT_ON_CLOSE); // f1.setVisible(true);f1.setVisible(false);f2 = new JFrame("仄安序列隐现框");jt = new JTextArea(75, 40);jt.setBackground(Color.pink);jt.setForeground(Color.blue);JScrollPane scrollPane = new JScrollPane(jt); // 加滑动条scrollPane.setBorder(BorderFactory.createLoweredBevelBorder ());// 鸿沟(f2.getContentPane()).add(scrollPane);f2.setSize(450, 400);f2.setResizable(false);f2.setDefaultClo搜索引擎劣化peration(EXIT_ON_CLOSE); f2.setVisible(false);buttonSetInit.setEnabled(false);buttonRequest.setEnabled(false);buttonsearch.setEnabled(false);button1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {// labelInfo.setText("请先初初化allocated战Maxneed,后单打初初化按钮");f1.setVisible(true);buttonSetInit.setEnabled(true);resourceNum = Integer.parseInt(tf1.getText());processNum = Integer.parseInt(tf2.getText());for (int i = 0; i < processNum; i++) {for (int j = 0; j < resourceNum; j++) {textNeed[i][j].setEditable(true);textAllocation[i][j].setEditable(true);textAvailable[j].setEditable(true);}}}});buttonSetInit.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {Init();buttonsearch.setEnabled(true);}buttonsearch.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {count = 0;SafeSequence = new int[processNum];worked = new int[resourceNum];Finish = new boolean[processNum];copyVector(worked, available);Safety(0);jt.append("仄安序列数量:" + count);if (flag) {labelInfo1.setText("目前系统状态:仄安");f2.setVisible(true);buttonRequest.setEnabled(true); textProcessName.setEnabled(true);for (int i = 0; i < resourceNum; i++) {textRequest[i].setEditable(true);}} else {labelInfo1.setText("目前系统状态:没有服安");}buttonSetInit.setEnabled(false);});buttonRequest.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {count = 0;for (int i = 0; i < processNum; i++) {Finish[i] = false;}jt.setText("");flag = false;RequestResource();}});button2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {/** tf1.setText(""); tf2.setText("");*/f2.setVisible(false);jt.setText("");for (int i = 0; i < processNum; i++) {for (int j = 0; j < resourceNum; j++) {textNeed[i][j].setText("");textAllocation[i][j].setText("");textAvailable[j].setText("");textRequest[j].setText("");// textNeed[i][j].setEditable(false);// textAllocation[i][j].setEditable(false);// textAvailable[j].setEditable(false);textRequest[j].setEditable(false);textProcessName.setText("");Finish[i] = false;}}flag = false;buttonsearch.setEnabled(false);// labelInfo.setText("请先输进资材个数战进程个数,后单打决定");}});button.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {tf1.setText("");tf2.setText("");f2.setVisible(false);jt.setText("");flag = false;}});}void copyVector(int[] v1, int[] v2) { for (int i = 0; i < v1.length; i++)v1[i] = v2[i];}void Add(int[] v1, int[] v2) {for (int i = 0; i < v1.length; i++)v1[i] += v2[i];}void Sub(int[] v1, int[] v2) {for (int i = 0; i < v1.length; i++)v1[i] -= v2[i];}boolean Smaller(int[] v1, int[] v2) { boolean value = true;for (int i = 0; i < v1.length; i++)if (v1[i] > v2[i]) {value = false;break;}return value;}public static void main(String[] args) {OsBanker ob = new OsBanker();ob.display();// System.out.println(" "+count);}void Init() // 初初化支配矩阵{available = new int[resourceNum];for (int i = 0; i < resourceNum; i++) {available[i] = Integer.parseInt(textAvailable[i].getText()); }max = new int[processNum][resourceNum];allocated = new int[processNum][resourceNum];need = new int[processNum][resourceNum];for (int i = 0; i < processNum; i++) {for (int j = 0; j < resourceNum; j++) {max[i][j] = Integer.parseInt(textNeed[i][j].getText());allocated[i][j] = Integer.parseInt(textAllocation[i][j] .getText());}}for (int i = 0; i < resourceNum; i++)for (int j = 0; j < processNum; j++)need[j][i] = max[j][i] - allocated[j][i];for (int i = 0; i < resourceNum; i++)for (int j = 0; j < processNum; j++) {available[i] -= allocated[j][i];if (available[i] < 0) {labelInfo.setText("您输进的数据有误,请沉新输进"); }}}void Safety(int n) // 查找所有仄安序列{if (n == processNum) {count++;for (int i = 0; i < processNum; i++) {jt.append("进程" + (SafeSequence[i] + 1) + " ");}jt.append("\n");flag = true;return;}for (int i = 0; i < processNum; i++) { if (Finish[i] == false) {boolean OK = true;for (int j = 0; j < resourceNum; j++) { if (need[i][j] > worked[j]) {OK = false;break;}}if (OK) {for (int j = 0; j < resourceNum; j++) { worked[j] += allocated[i][j];}Finish[i] = true;SafeSequence[n] = i;Safety(n + 1);Finish[i] = false;SafeSequence[n] = -1;// num++;for (int j = 0; j < resourceNum; j++) {worked[j] -= allocated[i][j];}}}}}void RequestResource() { // 哀供资材jt.setText("");int processname = (Integer.parseInt(textProcessName.getText()) - 1);request = new int[resourceNum];for (int i = 0; i < resourceNum; i++) {request[i] = Integer.parseInt(textRequest[i].getText());}if (!Smaller(request, need[processname])) {labelInfo.setText("资材哀供没有符该进程的需要量.");} else if (!Smaller(request, available)) {labelInfo1.setText("可用资材缺累以谦脚哀供,进程需要等待.");} else {Sub(available, request);Add(allocated[processname], request);Sub(need[processname], request);copyVector(worked, available);Safety(0);if (flag) {labelInfo1.setText("可坐时调配给该进程!");} else {labelInfo1.setText("调配后引导系统处于没有服安状态!,没有创制时调配");Add(available, request);Sub(allocated[processname], request);Add(need[processname], request);}}// }}}五、真验截止:初初界里:初初化:检测仄安性:哀供资材:(1)进程2(1,0,2)(2)进程5(3,3,0)(3)进程1(0,2,0)六、逢到的问题及缺累之处:1、步调编写的时间确定最大资材数战最大进程数均<=6.2、步调曲交初初化了6个进程框,既浪费了内存空间,又对于可视化界里的好瞅制成做用.3、已对于输进非常十分举止处理:比圆正在哀供资材的第一个圆框中只可挖进进程的数字编号,当挖进的为非整数时,步调会扔出非常十分.4、已办理进程名中对于字符串的处理,曲交牢固进程名为数字,用户没有克没有及曲交输进本有的进程名,制成短佳的用户感受.。
操作系统实验3_银行家算法

实验三死锁一、实验题目设计一个n 个并发进程共享m 个系统资源的系统。
进程可动态申请资源和释放资源,系统按各进程的申请动态的分配资源。
要求采用银行家算法防止死锁。
二、实验目的死锁会引起计算机工作僵死,造成整个系统瘫痪。
因此,死锁现象是操作系统特别是大型系统中必须设法防止的。
通过本次实验,使学生掌握死锁的概念和产生死锁的原因和必要条件,预防和避免死锁的方法,死锁的检测与解除。
通过本次实验,使学生加深了对死锁概念的理解和掌握,深刻领会银行家算法的实质及实现过程。
三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)1.程序流程图安全(safe)函数框图如下:2.逻辑设计用结构体数组表示3 个进程,其中包括使用数组形式的线性表表示某个进程申请资源的列表(队列),以及进程需要的总资源数、进程当前已经运行到的位置等信息。
模拟分配的程序部分,采用循环队列对各进程进行调度。
3、物理设计全局变量的结构定义如下:bool avoid;struct info//进程信息{long tot,n;//最大占用资源,申请次数long list[16];//申请资源列表long pre[16];//已占用资源数long p;//已分配状况的指针}pro[4];long LeftRes;程序的结构定义如下:int main()//主函数{init();allot();}void init()//函数功能:输入和初始化void allot()//函数功能:模拟资源分配过程allot()使用以下函数模拟分配过程:bool require(long x)//函数功能:尝试分配资源给进程xbool safe(long x)//函数功能:检查分配是否安全可以处理3 种资源的程序全局变量结构如下://共有3 种资源,3 个进程bool avoid;struct info//进程信息{long tot[4];//最大占用资源数long p[4];//已经占有的资源数}pro[5];long LeftRes[4];//剩余资源数long qu[4];四、测试结果对于一组会导致死锁的数据,分别选择采用和不采用避免算法,结果如下:Avoid deadlock?(Y/N)YPlease input the resourse-require lists of these 3 processes, one lists in a line:2 3 42 3 33 1=================================================================Process1 : 2 3 4 (Sum=9)Process2 : 2 3 3 (Sum=8)Process3 : 3 1 (Sum=4)=================================================================Process1 require 2 unit(s) resourse......Success! LeftResourse=8Process2 require 2 unit(s) resourse......Success! LeftResourse=6Process3 require 3 unit(s) resourse......Success! LeftResourse=3Process1 require 3 unit(s) resourse......Denied! Not safeProcess2 require 3 unit(s) resourse......Denied! Not safeProcess3 require 1 unit(s) resourse......Success! LeftResourse=2Process3 finish. LeftResourse=6Process1 require 3 unit(s) resourse......Denied! Not safeProcess2 require 3 unit(s) resourse......Success! LeftResourse=3Process1 require 3 unit(s) resourse......Denied! Not safeProcess2 require 3 unit(s) resourse......Success! LeftResourse=0Process2 finish. LeftResourse=8Process1 require 3 unit(s) resourse......Success! LeftResourse=5Process1 require 4 unit(s) resourse......Success! LeftResourse=1Process1 finish. LeftResourse=10Finish如果不避免死锁:Avoid deadlock?(Y/N)NPlease input the resourse-require lists of these 3 processes, one lists in a line:2 3 42 3 33 1================================================================= Process1 : 2 3 4 (Sum=9)Process2 : 2 3 3 (Sum=8)Process3 : 3 1 (Sum=4)================================================================= Process1 require 2 unit(s) resourse......Success! LeftResourse=8Process2 require 2 unit(s) resourse......Success! LeftResourse=6Process3 require 3 unit(s) resourse......Success! LeftResourse=3Process1 require 3 unit(s) resourse......Success! LeftResourse=0Process2 require 3 unit(s) resourse......Denied! No enough resourseProcess3 require 1 unit(s) resourse......Denied! No enough resourseProcess1 require 4 unit(s) resourse......Denied! No enough resourseAlready DeadlockFinish改进版本(可以使用3 种资源的程序)测试结果如下:五、系统不足与经验体会系统不能处理多种不同资源的情况,也缺乏处理大规模数据的能力。
《死锁避免》实验报告

一、实验目的本次实验旨在通过模拟操作系统的资源分配和请求过程,深入理解死锁的概念、产生死锁的必要条件以及如何通过银行家算法来避免死锁的发生。
通过实验,学生能够掌握以下知识点:1. 死锁的概念及产生条件;2. 银行家算法的基本原理和实现方法;3. 资源分配和请求过程中的安全性检查;4. 通过银行家算法避免死锁的发生。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 20194. 实验环境:一台配置较高的计算机三、实验原理1. 死锁的概念死锁是指多个进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,这些进程都将无法继续执行。
2. 产生死锁的必要条件产生死锁的必要条件有四个,分别为:(1)互斥条件:资源不能被多个进程同时使用;(2)持有和等待条件:进程已获得至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时该进程会等待;(3)非抢占条件:已分配给进程的资源,在进程完成之前,不能被抢占;(4)循环等待条件:存在一种进程资源的循环等待链,即进程P1等待P2占有的资源,P2等待P3占有的资源,以此类推,最后Pn等待P1占有的资源。
3. 银行家算法银行家算法是一种避免死锁的算法,通过以下步骤实现:(1)初始化系统资源、进程最大需求、已分配资源等数据结构;(2)当进程请求资源时,判断是否满足以下条件:a. 当前可用资源数量大于等于进程请求的资源数量;b. 根据当前资源分配情况,系统处于安全状态;若满足以上条件,则分配资源;否则,进程等待。
(3)当进程释放资源时,更新可用资源数量和分配资源情况。
四、实验内容1. 设计系统资源、进程最大需求、已分配资源等数据结构;2. 实现银行家算法,包括资源分配、安全性检查等功能;3. 模拟进程请求资源和释放资源的过程,观察系统状态变化;4. 分析实验结果,验证银行家算法是否能够避免死锁的发生。
实验三 银行家算法

浙江工业大学计算机科 学与技术学院 何玲娜
实验三 进程的死锁避免算法 (银行家算法实现)
实验目的:
根据银行家算法的思想,编写程序,解 决并发进程的死锁问题。
背景知识
本实验要求设计并实现银行家算法。银行家算法
是死锁避免的经典算法,其核心思想是:进程动
态地申请资源,每次申请资源时系统都执行安全
利用VC++6.0实现上述程序设计和调试操作,
根据提示输入相应的资源请求,对于算法操
作的成功与否提供一定的提示框。
通过阅读和分析实验程序,熟悉进程的死锁 问题。
工具/准备工作
在开始本实验之前,请回顾教科书的相关内容
需要做以下准备:
– 一台运行Windows 2000 /XP 操作系统的计算机
– 计算机中需安装Visual C++ 6.0专业版或企业版
死锁避免算法
实验报告
每人独立一组,需要上交实验报告 实验报告包括实验目的、实验内容、主要程序 结构(附注释)、实验步骤、实验中遇到的问 题及解决方法等。 上交程序源代码。 源代码和实验报告一并打包后上交,其命名方 式为:班级_学号_姓名.rar (注:只需上交源代码,不需要上交生成的目标 文件及可执行文件。) 通过EMAIL地址上交:coignhln@
状态检查算法判断本次申请是否会造成系统处于 不安全状态,如果不安全则阻塞进程;如果安全 状态,则完成资源分配。
安全状态检查算法的思想是找到一个安为不安全状态。
实验内容与步骤
进程的死锁避免算法。编写一段程序,模拟
银行家算法,解决进程的死锁问题。
操作系统实验报告-利用银行家算法避免死锁

计算机操纵系统实验陈述之袁州冬雪创作题目操纵银行家算法防止死锁一、实验目标:1、加深懂得有关资源申请、防止死锁等概念,并体会和懂得死锁和防止死锁的详细实施方法.2、要求编写和调试一个系统动态分配资源的简单摹拟程序,观察死锁发生的条件,并采取银行家算法,有效的防止和防止死锁的发生.二、实验内容:用银行家算法实现资源分配:设计五个过程{p0,p1,p2,p3,p4}共享三类资源{A,B,C}的系统,例如,{A,B,C}的资源数量分别为10,5,7.过程可动态地申请资源和释放资源,系统按过程的申请动态地分配资源,要求程序具有显示和打印各过程的某一个时刻的资源分配表和平安序列;显示和打印各过程依次要求申请的资源号以及为某过程分配资源后的有关资源数据.三、问题分析与设计:1、算法思路:先对用户提出的请求停止合法性检查,即检查请求是否大于需要的,是否大于可操纵的.若请求合法,则停止预分配,对分配后的状态调用平安性算法停止检查.若平安,则分配;若不服安,则回绝申请,恢复到原来的状态,回绝申请.2、银行家算法步调:(1)如果Requesti<or =Need,则转向步调(2);否则,认为出错,因为它所需要的资源数已超出它所宣布的最大值.(2)如果Request<or=Available,则转向步调(3);否则,暗示系统中尚无足够的资源,过程必须等待.(3)系统试探把要求的资源分配给过程Pi,并修改下面数据布局中的数值:Available=Available-Request[i];Allocation=Allocation+Request;Need=Need-Request;(4)系统执行平安性算法,检查此次资源分配后,系统是否处于平安状态.3、平安性算法步调:(1)设置两个向量①工作向量Work.它暗示系统可提供过程继续运行所需要的各类资源数目,执行平安算法开端时,Work=Allocation;②布尔向量Finish.它暗示系统是否有足够的资源分配给过程,使之运行完成,开端时先做Finish[i]=false,当有足够资源分配给过程时,令Finish[i]=true.(2)从过程集合中找到一个能知足下述条件的过程:①Finish[i]=false②Need<or=Work如找到,执行步调(3);否则,执行步调(4).(3)当过程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work=Work+Allocation;Finish[i]=true;转向步调(2).(4)如果所有过程的Finish[i]=true,则暗示系统处于平安状态;否则,系统处于不服安状态.4、流程图:系统主要过程流程图银行家算法流程图平安性算法流程图5、主要数据布局假设有M个过程N类资源,则有如下数据布局:int max[M*N] M个过程对N类资源的最大需求量int available[N] 系统可用资源数int allocated[M*N] M个过程已经得到N类资源的资源量int need[M*N] M个过程还需要N类资源的资源量int worked[] 系统提供给过程继续运行所需的各类资源数目四、源代码import java.awt.*;import javax.swing.*;import java.util.*;import java.awt.event.*;import javax.swing.border.*;public class OsBanker extends JFrame { // 界面设计JLabel labelInfo;JLabel labelInfo1;int resourceNum, processNum;int count = 0;JButton buttonRequest, buttonSetInit, button, button1, buttonsearch,button2;JTextField tf1, tf2;JTextField[] textAvailable;JTextField[][] textAllocation;JTextField[][] textNeed;JTextField textProcessName;JTextField[] textRequest;int available[];int max[][];int need[][];int allocated[][];int SafeSequence[];int request[];boolean Finish[];int worked[];boolean flag = false;JFrame f1;JFrame f2;JFrame f3;JTextArea jt;void display() {Border border = BorderFactory.createLoweredBevelBorder();Border borderTitled = BorderFactory.createTitledBorder(border, "按钮区"); textAvailable = new JTextField[5];textAllocation = new JTextField[6][5];textNeed = new JTextField[6][5];textProcessName = new JTextField(""); textProcessName.setEnabled(false);textRequest = new JTextField[5];tf1 = new JTextField(20);tf2 = new JTextField(20);labelInfo = new JLabel("请先输入资源个数和过程个数(1~6),后单击确定");JPanel contentPane;contentPane = (JPanel) this.getContentPane(); contentPane.setLayout(null);contentPane.setBackground(Color.pink);labelInfo.setBounds(50, 10, 300, 40);labelInfo.setOpaque(true);labelInfo.setForeground(Color.red);labelInfo.setBackground(Color.pink);contentPane.add(labelInfo, null);JLabel b1 = new JLabel("资源个数:");b1.setForeground(Color.blue);JLabel b2 = new JLabel("过程个数:");b2.setForeground(Color.blue);b1.setBounds(50, 80, 80, 30);contentPane.add(b1, null);tf1.setBounds(180, 80, 170, 30);contentPane.add(tf1, null);b2.setBounds(50, 150, 80, 30);contentPane.add(b2, null);tf2.setBounds(180, 150, 170, 30);contentPane.add(tf2, null);button1 = new JButton("确定");button = new JButton("重置");button1.setBounds(80, 200, 80, 30);contentPane.add(button1, null);button.setBounds(220, 200, 80, 30);contentPane.add(button, null);this.setSize(400, 300);this.setResizable(false);this.setTitle("银行家算法(SXJ)");this.setLocationRelativeTo(null);this.setDefaultClo搜索引擎优化peration(EXIT_ON_CLOSE);this.setVisible(true);f1 = new JFrame();labelInfo1 = new JLabel("请先输入最大需求和分配矩阵,然后单击初始化");JPanel contentPane1;contentPane1 = (JPanel) f1.getContentPane(); contentPane1.setLayout(null);contentPane1.setBackground(Color.pink);labelInfo1.setOpaque(true);labelInfo1.setBounds(75, 10, 400, 40);labelInfo1.setBackground(Color.pink);labelInfo1.setForeground(Color.blue);contentPane1.add(labelInfo1, null);JLabel labelAvailableLabel = new JLabel("AllResource:");JLabel labelNeedLabel = new JLabel("MaxNeed:"); JLabel labelAllocationLabel = new JLabel("allocated:");JLabel labelRequestLabel = new JLabel("request process:");labelNeedLabel.setBounds(75, 90, 100, 20);// x,y,width,heightcontentPane1.add(labelNeedLabel, null); labelAllocationLabel.setBounds(75, 240, 100, 20); contentPane1.add(labelAllocationLabel, null); labelAvailableLabel.setBounds(75, 70, 100, 20); contentPane1.add(labelAvailableLabel, null); labelRequestLabel.setBounds(75, 400, 100, 20); contentPane1.add(labelRequestLabel, null);JLabel[] labelProcessLabel1 = { new JLabel("过程1"), new JLabel("过程2"),new JLabel("过程3"), new JLabel("过程4"), new JLabel("过程5"),new JLabel("过程6") };JLabel[] labelProcessLabel2 = { new JLabel("过程1"), new JLabel("过程2"),new JLabel("过程3"), new JLabel("过程4"), new JLabel("过程5"),new JLabel("过程6") };JPanel pPanel1 = new JPanel(), pPanel2 = new JPanel(), pPanel3 = new JPanel(), pPanel4 = new JPanel();pPanel1.setLayout(null);pPanel2.setLayout(null);/** pPanel4.setLayout(null); pPanel4.setBounds(440,120,90,270);* pPanel4.setBorder(borderTitled);*/buttonSetInit = new JButton("初始化");buttonsearch = new JButton("检测平安性");button2 = new JButton("重置");buttonRequest = new JButton("请求资源"); buttonSetInit.setBounds(420, 140, 100, 30); contentPane1.add(buttonSetInit, null);buttonsearch.setBounds(420, 240, 100, 30); contentPane1.add(buttonsearch, null);button2.setBounds(420, 340, 100, 30);contentPane1.add(button2, null);buttonRequest.setBounds(420, 425, 100, 30); contentPane1.add(buttonRequest, null);for (int pi = 0; pi < 6; pi++) {labelProcessLabel1[pi].setBounds(0, 0 + pi * 20, 60, 20);labelProcessLabel2[pi].setBounds(0, 0 + pi * 20, 60, 20);}pPanel1.setBounds(75, 120, 60, 120);pPanel2.setBounds(75, 270, 60, 120);for (int pi = 0; pi < 6; pi++) {pPanel1.add(labelProcessLabel1[pi], null);pPanel2.add(labelProcessLabel2[pi], null);}contentPane1.add(pPanel1);contentPane1.add(pPanel2);contentPane1.add(pPanel4);for (int si = 0; si < 5; si++)for (int pi = 0; pi < 6; pi++) {textNeed[pi][si] = new JTextField();textNeed[pi][si].setBounds(150 + si * 50, 120 + pi * 20, 50, 20); textNeed[pi][si].setEditable(false);textAllocation[pi][si] = new JTextField(); textAllocation[pi][si].setBounds(150 + si * 50, 270 + pi * 20,50, 20);textAllocation[pi][si].setEditable(false);}for (int si = 0; si < 5; si++) {textAvailable[si] = new JTextField();textAvailable[si].setEditable(false);textAvailable[si].setBounds(150 + si * 50, 70, 50, 20);textRequest[si] = new JTextField();textRequest[si].setEditable(false);textRequest[si].setBounds(150 + si * 50, 430, 50, 20);contentPane1.add(textAvailable[si], null); contentPane1.add(textRequest[si], null);}for (int pi = 0; pi < 6; pi++)for (int si = 0; si < 5; si++) {contentPane1.add(textNeed[pi][si], null); contentPane1.add(textAllocation[pi][si], null);}textProcessName.setBounds(80, 430, 50, 20); contentPane1.add(textProcessName, null);f1.setSize(550, 500);f1.setResizable(false);f1.setTitle("银行家算法(SXJ)");f1.setLocationRelativeTo(null);f1.setDefaultClo搜索引擎优化peration(EXIT_ON_CLOSE);// f1.setVisible(true);f1.setVisible(false);f2 = new JFrame("平安序列显示框");jt = new JTextArea(75, 40);jt.setBackground(Color.pink);jt.setForeground(Color.blue);JScrollPane scrollPane = new JScrollPane(jt); // 加滚动条scrollPane.setBorder(BorderFactory.createLoweredBev elBorder());// 鸿沟(f2.getContentPane()).add(scrollPane);f2.setSize(450, 400);f2.setResizable(false);f2.setDefaultClo搜索引擎优化peration(EXIT_ON_CLOSE);f2.setVisible(false);buttonSetInit.setEnabled(false);buttonRequest.setEnabled(false);buttonsearch.setEnabled(false);button1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {// labelInfo.setText("请先初始化allocated和Maxneed,后单击初始化按钮");f1.setVisible(true);buttonSetInit.setEnabled(true);resourceNum = Integer.parseInt(tf1.getText());processNum = Integer.parseInt(tf2.getText());for (int i = 0; i < processNum; i++) {for (int j = 0; j < resourceNum; j++) {textNeed[i][j].setEditable(true);textAllocation[i][j].setEditable(true);textAvailable[j].setEditable(true);}}}});buttonSetInit.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {Init();buttonsearch.setEnabled(true);}});buttonsearch.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {count = 0;SafeSequence = new int[processNum];worked = new int[resourceNum];Finish = new boolean[processNum];copyVector(worked, available);Safety(0);jt.append("平安序列数量:" + count);if (flag) {labelInfo1.setText("当前系统状态:平安");f2.setVisible(true);buttonRequest.setEnabled(true);textProcessName.setEnabled(true);for (int i = 0; i < resourceNum; i++) {textRequest[i].setEditable(true);}} else {labelInfo1.setText("当前系统状态:不服安");}buttonSetInit.setEnabled(false);}});buttonRequest.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {count = 0;for (int i = 0; i < processNum; i++) {Finish[i] = false;}jt.setText("");flag = false;RequestResource();}});button2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {/** tf1.setText(""); tf2.setText("");*/f2.setVisible(false);jt.setText("");for (int i = 0; i < processNum; i++) {for (int j = 0; j < resourceNum; j++) { textNeed[i][j].setText("");textAllocation[i][j].setText("");textAvailable[j].setText("");textRequest[j].setText("");// textNeed[i][j].setEditable(false);// textAllocation[i][j].setEditable(false);// textAvailable[j].setEditable(false);textRequest[j].setEditable(false); textProcessName.setText("");Finish[i] = false;}}flag = false;buttonsearch.setEnabled(false);// labelInfo.setText("请先输入资源个数和过程个数,后单击确定");}});button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {tf1.setText("");tf2.setText("");f2.setVisible(false);jt.setText("");flag = false;}});}void copyVector(int[] v1, int[] v2) { for (int i = 0; i < v1.length; i++)v1[i] = v2[i];}void Add(int[] v1, int[] v2) {for (int i = 0; i < v1.length; i++)v1[i] += v2[i];}void Sub(int[] v1, int[] v2) {for (int i = 0; i < v1.length; i++) v1[i] -= v2[i];}boolean Smaller(int[] v1, int[] v2) { boolean value = true;for (int i = 0; i < v1.length; i++)if (v1[i] > v2[i]) {value = false;break;}return value;}public static void main(String[] args) {OsBanker ob = new OsBanker();ob.display();// System.out.println(" "+count);}void Init() // 初始化操纵矩阵{available = new int[resourceNum];for (int i = 0; i < resourceNum; i++) {available[i] = Integer.parseInt(textAvailable[i].getText());}max = new int[processNum][resourceNum];allocated = new int[processNum][resourceNum];need = new int[processNum][resourceNum];for (int i = 0; i < processNum; i++) {for (int j = 0; j < resourceNum; j++) {max[i][j] = Integer.parseInt(textNeed[i][j].getText());allocated[i][j] = Integer.parseInt(textAllocation[i][j].getText());}}for (int i = 0; i < resourceNum; i++)for (int j = 0; j < processNum; j++)need[j][i] = max[j][i] - allocated[j][i];for (int i = 0; i < resourceNum; i++)for (int j = 0; j < processNum; j++) {available[i] -= allocated[j][i];if (available[i] < 0) {labelInfo.setText("您输入的数占有误,请重新输入"); }}}void Safety(int n) // 查找所有平安序列{if (n == processNum) {count++;for (int i = 0; i < processNum; i++) {jt.append("过程" + (SafeSequence[i] + 1) + " "); }jt.append("\n");flag = true;return;}for (int i = 0; i < processNum; i++) { if (Finish[i] == false) {boolean OK = true;for (int j = 0; j < resourceNum; j++) { if (need[i][j] > worked[j]) {OK = false;break;}}if (OK) {for (int j = 0; j < resourceNum; j++) { worked[j] += allocated[i][j];}Finish[i] = true;SafeSequence[n] = i;Safety(n + 1);Finish[i] = false;SafeSequence[n] = -1;// num++;for (int j = 0; j < resourceNum; j++) {worked[j] -= allocated[i][j];}}}}}void RequestResource() { // 请求资源jt.setText("");int processname = (Integer.parseInt(textProcessName.getText()) - 1); request = new int[resourceNum];for (int i = 0; i < resourceNum; i++) {request[i] = Integer.parseInt(textRequest[i].getText());}if (!Smaller(request, need[processname])) { labelInfo.setText("资源请求不符该过程的需求量.");} else if (!Smaller(request, available)) {labelInfo1.setText("可用资源缺乏以知足请求,过程需要等待.");} else {Sub(available, request);Add(allocated[processname], request);Sub(need[processname], request);copyVector(worked, available);Safety(0);if (flag) {labelInfo1.setText("可当即分配给该过程!");} else {labelInfo1.setText("分配后导致系统处于不服安状态!,不成当即分配");Add(available, request);Sub(allocated[processname], request);Add(need[processname], request);}}// }}}五、实验成果:初始界面:初始化:检测平安性:请求资源:(1)过程2(1,0,2)(2)过程5(3,3,0)(3)过程1(0,2,0)六、遇到的问题及缺乏之处:1、程序编写的时候规定最大资源数和最大过程数均<=6.2、程序直接初始化了6个过程框,既华侈了内存空间,又对可视化界面的雅观造成影响.3、未对输入异常停止处理:比方在请求资源的第一个方框中只能填入过程的数字编号,当填入的为非整数时,程序会抛出异常.4、未处理过程名中对字符串的处理,直接固定过程名为数字,用户不克不及直接输入原有的过程名,造成欠好的用户体验.。
采用银行家算法避免死锁

采用银行家算法避免死锁一、实验目的:观察死锁发生的现象,了解死锁发生的原因。
掌握如何判断死锁发生的方法。
二、实验分析:死锁现象是操作系统各个进程竞争系统中有限的资源引起的。
如果随机给进程分配资源,就可能发生死锁,因此就应有办法检测死锁的发生。
本次实验中采用“银行家算法”判断死锁的发生。
三、实验设计:本实验设计一个3个并发进程共享3种系统资源且每种系统资源有10个的系统。
系统能显示各种进程的进展情况以及检察是否有错误和死锁现象产生。
四、算法说明:“银行家算法”。
按每个进程的申请数量给各个进程试探性分配资源,看能否找到一个序列使各个进程都能正常运行结束。
若能,则不会发生死锁;若不能,则会发生死锁。
五、程序使用说明:1、本程序用于检测错误和是否会发生死锁。
系统有3个进程竞争3种系统资源,每种资源有10个。
2、输入各个进程的最大需求资源数目数组max[3]和已经得到的资源数目数组alloc [3],系统计算出各个进程还应申请的资源数目数组need[3]。
3、若进程最大需求数大于系统资源数(10),则出错;若进程申请的资源数目大于其需要的最大资源数目,则出错。
银行家算法的具体实现程序:#include <stdio.h>#define R 10#define P 10int SafeCheck(int n,int m,int Max[P][R],int Allocation[P][R],int Available[R],int Need[P][R]){int p,i,j, safeque[P],Work[R],Finish[P]={0},t=0,flag;printf("当前的工作向量为:");for(j=0;j<m;j++){Work[j]=Available[j];printf("%d,",Work[j]);}//设置Work向量while(t<n){//开始寻找可分配的进程for(i=0;i<n;i++){if(Finish[i]==1) flag=0;//跳过已分配结束的进程else flag=1;if(flag){p=i;for(j=0;j<m;j++)if(Need[p][j]>Work[j]) { p=-1; break; }}if(p==i){ printf("找到一个可分配的进程P%d!\n",p); break;} }//顺序循环查找可分配资源的进程if(p!=-1){safeque[t++]=p;//入栈保护Finish[p]=1;//标志该进程结束printf("当前的工作向量为:");for(j=0;j<m;j++){Work[j]+=Allocation[p][j];printf("%d,",Work[j]);}p=-1;//清空当前进程号,以便下一次寻找出新的进程}//找到可分配资源的进程,并重设Work向量else { printf("找不到一个可分配的进程!终止检查!"); break; } }if(t==n){printf("系统存在一个安全序列:");for(t=0;t<n;t++)printf("P%d->",safeque[t]);printf("\n");return 1;}else {printf("系统不安全!会产生死锁!\n"); return 0;}}void main(){int Available[R],Max[P][R],Allocation[P][R],Need[P][R];int i,n,m,j,p,Request[R];int safe1,safe2;//设置第一次检查与第二次检查正确与否的观察变量printf("输入进程总数:");scanf("%d",&n);printf("输入资源类数:");scanf("%d",&m);printf("系统中R0--R%d类资源可利用数(空格隔开):",m-1);for(i=0;i<m;i++){scanf("%d",&Available[i]);}for(i=0;i<n;i++){printf("P%d进程的每类资源的分配情况如下:\n",i);printf("\tR0--R%d类资源最大数(空格隔开):",m-1);for(j=0;j<m;j++){scanf("%d",&Max[i][j]);}printf("\tR0--R%d类资源已分配(空格隔开):",m-1);for(j=0;j<m;j++){scanf("%d",&Allocation[i][j]);Need[i][j]=Max[i][j]-Allocation[i][j];}printf("\tR0--R%d类资源需求数(空格隔开):",m-1);for(j=0;j<m;j++){printf("%d ",Need[i][j]);}printf("\n");}//初始化进程的资源分配表printf("——————-第一次安全性检查——————\n");safe1=SafeCheck(n,m,Max,Allocation,Available,Need);if(safe1){printf("输入请求请求进程P的进程号:");scanf("%d",&p);printf("输入请求的R0--R%d各类资源数(空格隔开):",m-1);for(j=0;j<m;j++){scanf("%d",&Request[j]);if(Request[j]>Need[p][j]){printf("所请求的该资源数大于该进程所需求的最大值!终止请求!");safe1=0;break;}if(Request[j]>Available[j]){printf("所请求的该资源数大于系统中所拥有的最大值!终止请求!");safe1=0;break;}}}//第一次安全检查系统安全后判断请求向量的正确性if(safe1){printf("——————-第二次安全性检查——————\n");for(j=0;j<m;j++){Allocation[p][j]+=Request[j];Need[p][j]=Max[p][j]-Allocation[p][j];Available[j]-=Request[j];}//第二次安全检查前试探分配资源给请求资源safe2=SafeCheck(n,m,Max,Allocation,Available,Need);if(safe2==0)for(j=0;j<m;j++){Allocation[p][j]-=Request[j];Need[p][j]=Max[p][j]-Allocation[p][j];Available[j]+=Request[j];}//安全检查失败后重新收回分配给请求进程的资源}}书上的银行家算法例题实现如下:分析:该程序找到的安全序列:第一次检查{p1,p3,p0,p2,p4}第二次检查{p1,p3,p0,p2,p4}虽然与书上例题不一致,但经检验可以找出如上安全序列。
实验三银行家算法实验报告

实验三银行家算法实验报告一、实验目的银行家算法是一种用于避免死锁的算法,本次实验旨在通过编程实现银行家算法,并通过模拟银行家算法的运行过程来加深对该算法的理解。
二、实验过程及结果1. 系统设计为了模拟银行家算法的运行过程,需要设计一个包含多个进程和资源的系统。
每个进程都有一定的最大需求资源数和已分配资源数。
系统中还有一定数量的可用资源,进程可以请求资源和释放资源。
2. 算法实现在程序中实现银行家算法需要以下几个关键的函数:(1)银行家算法的主函数:实现进程的请求资源和释放资源操作,并在此过程中判断是否产生死锁;(2)安全检查函数:用于判断系统状态是否安全,即是否存在一个安全序列,如果存在则表示系统处于安全状态,否则表示系统处于不安全状态;(3)资源请求函数:用于进程请求资源的操作,根据银行家算法的要求进行判断;(4)资源释放函数:用于进程释放资源的操作。
3. 算法运行通过对编写的程序进行多次运行测试,模拟不同进程对资源的请求和释放,观察系统是否能够始终处于安全状态。
在每次运行中,记录并输出系统的安全序列和进程的状态等信息。
4. 实验结果分析通过实验运行结果的分析,可以得出以下结论:(1)银行家算法能够有效地避免死锁的发生;(2)系统中资源的分配和释放过程需要合理,否则可能导致系统陷入死锁;(3)资源的分配策略对系统的安全状态有重要影响。
三、实验总结通过本次实验,深入了解了银行家算法的原理和实现过程,并通过编程实践加深了对该算法的理解。
银行家算法是一种重要的死锁避免算法,能够保证系统处于安全状态下运行,并且能够合理地分配系统资源,避免系统陷入死锁。
四、参考文献[1] 《操作系统概念》,Abraham Silberschatz,Peter B. Galvin,Greg Gagne,电子工业出版社,2014年五、附录(示例代码省略)以上是本次实验的实验报告,通过实验我们深入了解了银行家算法,了解了它在操作系统中的应用和重要性。
操作系统实验报告三-银行家算法

操作系统实验三银行家算法姓名:杨益林学号:5报告日期:2017.06.07一、实验目的通过实验,加深对多实例资源分配系统中死锁避免方法——银行家算法的理解,掌握 Windows 环境下银行家算法的实现方法,同时巩固利用 Windows API进行共享数据互斥访问和多线程编程的方法。
二、实验内容1.在 Windows 操作系统上,利用 Win32API 编写多线程应用程序实现银行家算法。
2.创建 n 个线程来申请或释放资源,只有保证系统安全,才会批准资源申请。
3.通过 Win32 API 提供的信号量机制,实现共享数据的并发访问。
三、实验步骤(一)设计思路:银行家算法可分为个主要的功能模块,其描述如下:1.初始化由用户输入数据,分别对运行的进程数、总的资源种类数、总资源数、各进程所需要的最大资源数量(Max),已分配的资源数量赋值。
2.安全性检查算法(1)设置两个工作向量Work=AVAILABLE;FINISH=false;(2)从进程集合中找到一个满足下述条件的进程,FINISH==false;NEED<=Work;如找到,执行(3);否则,执行(4)(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work+=ALLOCATION;Finish=true;(4).如所有的进程Finish= true,则表示安全;否则系统不安全。
3. 银行家算法在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。
在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。
它是最具有代表性的避免死锁的算法。
设进程j提出请求REQUEST [i],则银行家算法按如下规则进行判断。
(1).如果REQUEST [j] [i]<= NEED[j][i],则转(2);否则,出错。
银行家算法实验报告

xx大学操作系统实验报告姓名:学号:班级:实验日期:实验名称:预防进程死锁的银行家算法实验三预防进程死锁的银行家算法1.实验目的:通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。
理解银行家算法的运行原理,进一步掌握预防进程死锁的策略及对系统性能的评价方法。
:2. 需求分析(1) 输入的形式和输入值的范围;输入:首先输入系统可供资源种类的数量n 范围:0<n<=100资源1的名称:资源的数量:资源2的名称:资源的数量:。
输入作业的数量m 范围:0<m<=100输入个进程的最大需求量<m*n矩阵>[Max]:输入个进程已经申请的资源量<m*n矩阵>[Allocation]:(2) 输出的形式系统目前可用的资源[Avaliable]:(显示系统是否安全)分配序列:(3)程序所能达到的功能通过手动输入资源种类数量和各进程的最大需求量、已经申请的资源量,运用银行家算法检测系统是否安全,若安全则给出安全序列,并且当用户继续输入某进程的资源请求时,能够继续判断系统的安全性。
(4) 测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。
正确输入输入参数(已申请资源数)错误3、概要设计所有抽象数据类型的定义:int Max[100][100]; //各进程所需各类资源的最大需求int Avaliable[100]; //系统可用资源char name[100] };//资源的名称int Allocation[100][100]; //系统已分配资源int Need[100][100] }; //还需要资源int Request[100]; //请求资源向量int temp[100]; //存放安全序列int Work[100];//存放系统可提供资源int M=100; //作业的最大数为100int N=100; //资源的最大数为100主程序的流程:* 变量初始化;* 接收用户输入n,m,Max ij,Allocation ij;* 按照银行家算法判断当前状态安全与否,安全给出安全序列,不安全给出提示;* 如果安全,提示用户输入下一时刻进程P k的资源请求Request(R1, … ,R m);* 如果不安全或者无新请求则退出。
操作系统实验银行家算法

实验三银行家算法一、实验内容简要描述1.实验目标:加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效的防止和避免死锁的发生。
2.实验要求:银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。
用银行家算法实现资源分配。
设计五个进程{p0,p1,p2,p3,p4}共享三类资源{A,B,C}的系统,例如,{A,B,C}的资源数量分别为10,5,7。
进程可动态地申请资源和释放资源,系统按进程的申请动态地分配资源,要求程序具有显示和打印各进程的某一个时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源号以及为某进程分配资源后的有关资源数据。
二、报告主要内容1.设计思路A、设计进程对各在资源最大申请表示及初值确定。
B、设定系统提供资源初始状态。
C、设定每次某个进程对各类资源的申请表示。
D、编制程序,依据银行家算法,决定其申请是否得到满足。
2.主要数据结构假设有M个进程N类资源,则有如下数据结构:MAX[M*N] M个进程对N类资源的最大需求量AVAILABLE[N] 系统可用资源数ALLOCATION[M*N] M个进程已经得到N类资源的资源量NEED[M*N] M个进程还需要N类资源的资源量银行家算法:设进程I提出请求Request[N],则银行家算法按如下规则进行判断。
(1)如果Request[N]<=NEED[I,N],则转(2);否则,出错。
(2)如果Request[N]<=AVAILABLE,则转(3);否则,出错。
(3)系统试探分配资源,修改相关数据:AVAILABLE=AVAILABLE-REQUESTALLOCATION=ALLOCATION+REQUESTNEED=NEED-REQUEST(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告实验三预防进程死锁的银行家算法学号:班级:姓名:【实验目的】通过这次实验,加深对进程死锁的理解,进一步掌握进程资源的分配、死锁的检测和安全序列的生成方法。
【实验内容】问题描述:设计程序模拟预防进程死锁的银行家算法的工作过程。
假设有系统中有n个进程P1, … ,P n,有m类可分配的资源R1, … ,R m,在T0时刻,进程P i分配到的j类资源为Allocation ij个,它还需要j类资源Need ij个,系统目前剩余j类资源Work j个,现采用银行家算法进行进程资源分配预防死锁的发生。
程序要求如下:1)判断当前状态是否安全,如果安全,给出安全序列;如果不安全给出理由。
2)对于下一个时刻T1,某个进程P k会提出请求Request(R1, … ,R m),判断分配给P k进程请求的资源之后。
3)输入:进程个数n,资源种类m,T0时刻各个进程的资源分配情况(可以运行输入,也可以在程序中设置);4)输出:如果安全输出安全的进程序列,不安全提示信息。
实现提示:用C++语言实现提示:1)程序中进程调度时间变量描述如下:int Available[MaxNumber];int Max[MaxNumber][MaxNumber];int Allocation[MaxNumber][MaxNumber];int Need[MaxNumber][MaxNumber];int Request[MaxNumber];int SafeOrder[MaxNumber];2)进程调度的实现过程如下:➢变量初始化;➢接收用户输入n,m,(输入或者默认的)Allocation ij,Need ij;➢按照银行家算法判断当前状态安全与否,安全给出安全序列,不安全给出提示;➢如果安全,提示用户输入下一时刻进程P k的资源请求Request(R1, … ,R m);➢如果不安全或者无新请求则退出。
实验要求:1)上机前认真复习银行家算法,熟悉资源分配和安全检查过程;2)上机时独立编程、调试程序;3)根据具体实验要求,完成好实验报告(包括实验的目的、内容、要求、源程序、实例运行结果截图)。
【源程序】头文件Safe.h#include<iostream.h>#include<string.h>#include<iomanip.h>#include<stdlib.h>#define MaxNumber 100//定义进程控制块struct Process_struct{int Available[MaxNumber]; //可利用资源数组int Max[MaxNumber][MaxNumber]; //最大需求矩陈int Allocation[MaxNumber][MaxNumber]; //分配矩陈int Need[MaxNumber][MaxNumber]; //需求矩陈int Request[MaxNumber][MaxNumber]; //M个进程还需要N类资源的资源量int Finish[MaxNumber];int p[MaxNumber];}Process;int M,N; //M个进程,N类资源int i,j,k,l=0;int Work[MaxNumber]; //可利用资源int Pinput();int Safe();int Peques();//进程输入int Pinput(){int i,j;cout<<"输入进程的数目:\n";cin>>M;cout<<"输入资源的种类:\n";cin>>N;cout<<"输入每个进程最多所需的各类资源数,按照"<<M<<"x"<<N<<"矩陈输入\n";for(i=0;i<M;i++)for(j=0;j<N;j++)cin>>Process.Max[i][j];cout<<"输入每个进程已经分配的各类资源数,按照"<<M<<"x"<<N<<"矩陈输入\n";for(i=0;i<M;i++){for(j=0;j<N;j++){cin>>Process.Allocation[i][j];Process.Need[i][j] = Process.Max[i][j] - Process.Allocation[i][j];if(Process.Need[i][j] < 0){cout<<"你输入的第"<<i+1<<"个进程所拥有的第"<<j+1<<"个资源错误,请重新输入:\n";j--;continue;}}}cout<<"请输入各个资源现有的数目:\n";for(i=0;i<N;i++)cin>>Process.Available[i];return 1;}//安全性算法int Safe(){for(i=0;i<N;i++)Work[i]=Process.Available[i];for(i=0;i<M;i++)Process.Finish[i]=0;for(i=0;i<M;i++){if(Process.Finish[i]==1)continue;else{for(j=0;j<N;j++){if(Process.Need[i][j]>Work[j])break;}if(j==N){Process.Finish[i]=1;for(int k=0;k<N;k++)Work[k]+=Process.Allocation[i][k];Process.p[l++]=i;i=-1;}elsecontinue;}if(l==M){cout<<"系统是安全的"<<"\n";cout<<"系统安全序列是:\n";for(i=0;i<l;i++){cout<<Process.p[i];if(i != l-1)cout<<"-->";}cout<<'\n';return 1;}}}//进程请求int Peques(){while(1){cout<<"输入要申请的资源的进程号:(第一个进程号为0,第二个进程号为1,以此类推)\n";cin>>k;cout<<"输入进程所请求的各个资源的数量\n";for(i=0;i<N;i++)cin>>Process.Request[k][i];for(i=0;i<N;i++){if(Process.Request[k][i] > Process.Need[k][i]){cout<<"所请求资源超过进程的需求量!\n";return 0;}if(Process.Request[k][i] > Process.Available[i]){cout<<"所请求资源数量超过系统所有的资源数!\n";return 0;}}for(i=0;i<N;i++){Process.Available[i] -= Process.Request[k][i];Process.Allocation[k][i] += Process.Request[k][i];Process.Need[k][i] -= Process.Request[k][i];}if(Safe())cout<<"同意分配请求~~~\n";else{cout<<"SORRY~~~~~你的请求被拒绝~~~\n";for(i=0;i<N;i++){Process.Available[i] += Process.Request[k][i];Process.Allocation[k][i] -= Process.Request[k][i];Process.Need[k][i] += Process.Request[k][i];}}for(i=0;i<M;i++)Process.Finish[i]=0;char Flag; //标志位cout<<"是否再次请求分配?是请按Y/y,否请按N/n";while(1){cin>>Flag;if(Flag=='Y' || Flag=='y' || Flag=='N' || Flag=='n') break;else{cout<<"请按要求重新输入:\n";continue;}}if(Flag=='Y' || Flag=='y')continue;elsebreak;}}主程序Main.cpp#include<iostream.h>#include<string.h>#include<iomanip.h>#include<stdlib.h>//银行家算法int main(){Pinput();Safe();Peques();return 1;}【实例运行结果截图】实例银行家算法(注:素材和资料部分来自网络,供参考。
请预览后才下载,期待你的好评与关注!)。