ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:215.28KB ,
资源ID:25842313      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25842313.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(银行家算法调度算法多线程源代码流程图实验报告.docx)为本站会员(b****9)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

银行家算法调度算法多线程源代码流程图实验报告.docx

1、银行家算法调度算法多线程源代码流程图实验报告课程设计报告( 2013- 2014年度第1学期)名 称: 操作系统原理课程设计 院 系: 班 级: 学 号: 学生姓名: 指导教师: 设计周数: 1 成 绩: 日期:2013年 11 月15日操作系统原理课程设计B课程设计任 务 书一、 目的与要求1. 理解和掌握操作系统的基本概念、基本组成与工作原理;2. 理解和掌握操作系统中主要功能模块的工作原理及其实现算法;3. 掌握软件模块设计技能;熟悉并能较好地利用软件开发环境独立编程、调试和分析程序运行情况,逐渐形成创新思维和从事系统软件的研究和开发能力。二、 主要内容采用某种程序设计语言,设计与开发一

2、个仿真操作系统,要求具备进程调度、存储器管理、文件及设备管理等基本功能,具体内容包括:1. 模拟单处理器系统的进程调度,加深对进程的概念及进程调度算法的理解;2. 编写一个多线程程序,加深对现代操作系统中线程的理解;3. 编写和调试一个银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法;4. 用可变分区算法模拟主存的分配和回收,加深对存储器管理的理解,熟悉各种主存分配方法;根据个人情况选做其中三个。三、 进度计划序号设计(实验)内容完成时间备注1熟悉开发环境及程序设计语言1天2系统的分析、设计2天3调试与集成1天4验收,提交实验报告1天四、 设计(实

3、验)成果要求至少完成主要内容中的3项,统一使用课程设计报告书,文字清楚、工整。学生姓名: 指导教师: 2013 年 11 月 15 日一、课程设计(综合实验)的目的与要求1. 理解和掌握操作系统的基本概念、基本组成与工作原理;2. 理解和掌握操作系统中主要功能模块的工作原理及其实现算法;3. 掌握软件模块设计技能;熟悉并能较好地利用软件开发环境独立编程、调试和分 析程序运行情况,逐渐形成创新思维和从事系统软件的研究和开发能力。二、实验环境Visual C+6.0和JCreator三、设计(实验)正文多线程:用Runnable接口和继承Thread类的方法实现多线程程序。设计龟兔赛跑,赛程100

4、0米,兔子跑5米,乌龟跑1米,兔子每20米休息500毫秒,乌龟每100米休息500毫秒。谁先到终点就结束程序,并显示获胜方。调度算法: 编程实现先来先服务和短作业优先调度算法。先来先服务算法是每次调度从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某件事而阻塞后才放弃处理机。短作业优先算法是从后备队列中选择一个或若干个估计时间最短的作业,将他们调入内存运行。程序要求进程个数n;每个进程的到达时间T1, ,Tn和服务时间S1, ,Sn;选择算法1-FCFS,2-SJF。要求采用先来先服务FCFS和短作业优先SJF分别调度进程运行,计算每个进程的周

5、转时间,带权周转时间,并且计算所有进程的平均周转时间,带权平均周转时间;要求输出计算出来的每个进程的周转时间,带权周转时间,所有进程的平均周转时间,带权平均周转时间。银行家:2.算法数据结构1)可利用资源向量Available ,它是一个最多含有100个元素的数组,其中的每一个元素代表一类可利用的资源的数目,其初始值是系统中所配置的该类全部可用资源数目。其数值随该类资源的分配和回收而动态地改变。如果Available(j)=k,标是系统中现有j类资源k个。2)最大需求矩阵Max,这是一个nm的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max(i,j)=k,表示进程i需

6、要j类资源的最大数目为k。3)分配矩阵Allocation,这也是一个nm的矩阵,它定义了系统中的每类资源当前一分配到每一个进程的资源数。如果Allocation(i,j)=k,表示进程i当前已经分到j类资源的数目为k。Allocationi表示进程i的分配向量,有矩阵Allocation的第i行构成。4)需求矩阵Need,这还是一个nm的矩阵,用以表示每个进程还需要的各类资源的数目。如果Need(i,j)=k,表示进程i还需要j类资源k个,才能完成其任务。Needi表示进程i的需求向量,由矩阵Need的第i行构成。5)上述三个矩阵间存在关系:Need(i,j)=Max(i,j)-Alloca

7、tion(i,j);3.银行家算法设Requesti 是进程i的请求向量,如果Requesti,j=K,表示进程i需要K个j类型的资源。当i发出资源请求后,系统按下述步骤进行检查:1)如果RequestiNeed,则转向步骤2;否则,认为出错,因为它所请求的资源数已超过它当前的最大需求量。2)如果RequestiAvailable,则转向步骤3;否则,表示系统中尚无足够的资源满足i的申请,i必须等待。3)系统试探性地把资源分配给进程i,并修改下面数据结构中的数值:Available=Available- RequestiAllocationi=Allocationi+ RequestiNeed

8、i= Needi- Requesti4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。如果安全才正式将资源分配给进程i,以完成本次分配;否则,将试探分配作废,恢复原来的资源分配状态,让进程i等待。四、课程设计(综合实验)总结或结论 通过本次实验,基本了解了线程的概念,作用,方法以及使用规则。也了解到run方法所包含的代码就是和其他线程同时运行的代码以达到同一时刻运行多段代码的目的。当终止了 run以后。这个线程也就结束了。调用线程的 start方法才会执行 run方法。对调度算法特别是FCFS和SJF有了更深的理解,而且锻炼了我的思维能力,使我能更全面地思考问题,以后还需要多做

9、些这方面的练习。 对于银行家算法也更深刻的知道银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程;第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,但它仍继续保持已得到的所有其他资源;第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。总体上

10、此次实验锻炼了自己的耐心。写程序重要的品质就应该是耐心了,如果没有了耐心是写不出程序的,出现了错误稍微长一点时间调试不出就放弃,你永远无法写出程序。写程序切记,戒骄戒躁。极大的调高了自己编程的能力。每一条程序自己都要读懂,每一处错误自己都要亲手调通,这个过程是看书得不到的。编程要的就是一种感觉,亲自动手去写才能培养这种感觉。五、参考文献 汤子赢 操作系统 西安电子科技大学出版社, 第三版. 出版日期张白一,崔尚森,面向对象程序设计Java(第二版),西安电子科技大学出版社附录(设计流程图、程序、表格、数据等)多线程:java源代码:import java.util.Date;public cl

11、ass Test extends Thread private int tortoise_walk = 0; / 乌龟已跑长度存放变量 private int rabbit_walk = 0; / 兔子已跑长度存放变量 private int finish = 200; / 终点 private volatile boolean hasWinner = false;/ 胜利者诞生 class Tortoise_Run implements Runnable Override public void run() try while (!hasWinner) if (tortoise_walk %

12、 100 = 0 & (tortoise_walk != 0|tortoise_walk=finish) /乌龟每100米休息500毫秒 System.out.println(乌龟休息中); Thread.sleep(500); tortoise_walk+; System.out.println(乌龟已跑+tortoise_walk+米); catch (InterruptedException e) e.printStackTrace(); class Rabbit_Run implements Runnable Override public void run() try while (

13、!hasWinner) if (rabbit_walk % 20 = 0 & (rabbit_walk != 0|rabbit_walk=finish) /兔子每20米休息500毫秒 System.out.println(兔子休息中); Thread.sleep(500); rabbit_walk=rabbit_walk+5; /每秒跑5步 System.out.println(兔子已跑+rabbit_walk+米); catch (InterruptedException e) e.printStackTrace(); public void run() new Thread(new Rab

14、bit_Run().start(); new Thread(new Tortoise_Run().start(); public static void main(String args) throws Exception long temp_actionTime=System.currentTimeMillis(); System.out.println(比赛开始:+new Date(temp_actionTime)+毫秒); Test t=new Test(); new Thread(t).start(); while(true) if(t.tortoise_walk=t.finish|t

15、.rabbit_walk=t.finish) t.hasWinner=true; break; String winnnerName=t.tortoise_walkt.rabbit_walk?乌龟:兔子; long temp_lastTime=System.currentTimeMillis(); System.out.println(winnnerName+胜利); System.out.println(比赛结束:+new Date(temp_lastTime)+毫秒); System.out.println(所耗时间:+(temp_lastTime-temp_actionTime)+毫秒)

16、; System.out.println(兔子=+t.rabbit_walk+ 乌龟=+t.tortoise_walk); 调度算法:FCFS流程图SJF流程图:源代码:#include stdio.h#includestdlib.h#includestring.h#define M 50struct sjf int jobnumber; float submittime; float runtime; float starttime; float finishtime; float waittime; float turnaroundtime;temp;static struct sjf s

17、tM;void input(struct sjf *p,int N) int i; printf(Please input the job number,submit time and run time:nFor exmple:1 8.5 2.0n); for(i=0;iN;i+) scanf(%d%f%f,&pi.jobnumber,&pi.submittime,&pi.runtime); void print(struct sjf *p,int N) int k; float h,g; printf(run order:); printf(%d,p0.jobnumber); for(k=1

18、;k%d,pk.jobnumber); printf(nThe processs information:n); printf(njobnumtsubmittruntstarttfinaltwaittturnaroundn); for(k=0;kN;k+) h+=pk.turnaroundtime; printf(%dt%-.1ft%-.1ft%-.1ft%-.1ft%-.1ft%-.1ftn,pk.jobnumber,pk.submittime,pk.runtime,pk.starttime,pk.finishtime,pk.waittime,pk.turnaroundtime); g=h/

19、N; printf(nThe average turnaround time is %-.2fn,g); /*按提交时间从小到大排序*/void sort1(struct sjf *p,int N) int i,j; for(i=0;iN;i+) for(j=0;j=i;j+) if(pi.submittimepj.submittime) temp=pi; pi=pj; pj=temp; /*运行*/void deal(struct sjf *p,int N) int k; for(k=0;kpk-1.finishtime) pk.starttime=pk.submittime; pk.fin

20、ishtime=pk.submittime+pk.runtime; else pk.starttime=pk-1.finishtime; pk.finishtime=pk-1.finishtime+pk.runtime; for(k=0;kN;k+) pk.turnaroundtime=pk.finishtime-pk.submittime; pk.waittime=pk.starttime-pk.submittime; void sort2(struct sjf *p,int N) int next,m,n,k,i; float min; sort1(p,N); for(m=0;mpm-1.

21、finishtime) pm.finishtime=pm.submittime+pm.runtime; else pm.finishtime=pm-1.finishtime+pm.runtime; for(n=m+1;nN;n+) if(pn.submittime=pm.finishtime)/*判断内存中每次完成之后又多少到达的进程*/ i+; min=pm+1.runtime; next=m+1; for(k=m+1;km+i;k+)/*找出到达后的进程中运行时间最小的进程*/ if(pk+1.runtimemin) min=pk+1.runtime; next=k+1; temp=pm+

22、1; pm+1=pnext; pnext=temp; deal(p,N); print(p,N); void main() int N,i; printf(Please input the total number of jobs:); scanf(%d,&N); input(st,N);loop2: printf(What kind of algorithm do you want? Please input 1 to select FCFS, or 2 to select SJF or 0 to exit:);loop: scanf(%d,&i); if(i=0) exit(1); els

23、e if(i=1) sort1(st,N); deal(st,N); print(st,N); goto loop2; else if(i=2) sort2(st,N); goto loop2; else printf(You have input a wrong number, please input again:); goto loop; 银行家算法:流程图源代码:#include#include#include#define False 0#define True 1using namespace std;int Max100100=0;/各进程所需各类资源的最大需求int Avali

24、able100=0;/系统可用资源char name100=0;/资源的名称int Allocation100100=0;/系统已分配资源int Need100100=0;/还需要资源int Request100=0;/请求资源向量int temp100=0;/存放安全序列int Work100=0;/存放系统可提供资源int M=100;/进程的最大数为int N=100;/资源的最大数为void showdata()/显示资源矩阵 int i,j; cout系统目前可用的资源Avaliable:endl; for(i=0;iN;i+) coutnamei ; coutendl; for (

25、j=0;jN;j+) coutAvaliablej ;/输出分配资源 coutendl; cout Max Allocation Needendl; cout进程名 ; for(j=0;j3;j+) for(i=0;iN;i+) coutnamei ; cout ; coutendl; for(i=0;iM;i+) cout i ; for(j=0;jN;j+) coutMaxij ; cout ; for(j=0;jN;j+) coutAllocationij ; cout ; for(j=0;jN;j+) coutNeedij ; coutendl; int changdata(int i

26、)/进行资源分配 int j; for (j=0;jM;j+) Avaliablej=Avaliablej-Requestj; Allocationij=Allocationij+Requestj; Needij=Needij-Requestj; return 1;int safe()/安全性算法 int i,k=0,m,apply,Finish100=0; int j; for(j=0;jN;j+) Workj=Avaliablej; for(i=0;iM;i+) apply=0; for(j=0;jN;j+) if (Finishi=False&Needij=Workj) apply+; if(apply=N) for(m=0;mN;m+) Workm=Workm+Allocationim;/变分配数 Finishi=True; tempk=i; i=-1; k+; for(i=0;iM;i+) if(Finishi=False) cout系统不安全endl;/不成功系统不安全 return 1; cout系统是安

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1