操作系统原理课程设计B_第1页
操作系统原理课程设计B_第2页
操作系统原理课程设计B_第3页
操作系统原理课程设计B_第4页
操作系统原理课程设计B_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计报告( 2013- 2014年度第1学期)名 称:操作系统原理课程设计 院 系: 班 级:软件 学 号: 学生姓名 指导教师: 设计周数: 1 成 绩: 日期:2013年 月 日操作系统原理课程设计B课程设计任 务 书一、 目的与要求1. 理解和掌握操作系统的基本概念、基本组成与工作原理;2. 理解和掌握操作系统中主要功能模块的工作原理及其实现算法;3. 掌握软件模块设计技能;熟悉并能较好地利用软件开发环境独立编程、调试和分析程序运行情况,逐渐形成创新思维和从事系统软件的研究和开发能力。二、 主要内容采用某种程序设计语言,设计与开发一个仿真操作系统,要求具备进程调度、存储器管理、文件及设备管理等基本功能,具体内容包括:1. 模拟单处理器系统的进程调度,加深对进程的概念及进程调度算法的理解;2. 编写一个多线程程序,加深对现代操作系统中线程的理解;3. 编写和调试一个银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法;4. 用可变分区算法模拟主存的分配和回收,加深对存储器管理的理解,熟悉各种主存分配方法;根据个人情况选做其中三个。三、 进度计划序号设计(实验)内容完成时间备注1熟悉开发环境及程序设计语言1天2系统的分析、设计2天3调试与集成1天4验收,提交实验报告1天四、 设计(实验)成果要求至少完成主要内容中的3项,统一使用课程设计报告书,文字清楚、工整。学生姓名:张迪指导教师: 年 月 日实验一多线程实验实验目的及要求实现多线程的一些操作,理解多线程间的协调工作方式,同时了解多线程和进程之间的关系以及他们的区别。设计一个多线程的小程序,了解线程的启动,停止,睡眠,挂起等的基本功能。实验正文实验思路:本次多线程实验是猜字小游戏,系统线程随机给出一个数,系统进程等待,并且唤醒另一个进程,这个线程给出一个猜的数字,唤醒系统进程且等待,猜字线程和系统中的数比较,直到猜对就结束。实验结果:随机给你一个数为28,猜猜是多少我第1次猜这个数:100你猜大了我第2次猜这个数是50你猜大了我第3次猜这个数是25你猜小了我第4次猜这个数是37你猜大了我第5次猜这个数是31你猜大了我第6次猜这个数是28恭喜,你猜对了我成功了课程设计结论通过本次实验,我了解了多线程的基本概念,知道线程间怎么协调工作,且知道了线程和进程的区别。而且编写程序时要一步一步来编写,这样才能达到自己想要的结果。参考文献张白一,崔尚森,面向对象程序设计Java(第二版),西安电子科技大学出版社,2006,12附录流程图程序TwoThreadGuessNumber.javapackage com;public class TwoThreadGuessNumber public static void main(String args) Number number = new Number();/调用Numbernumber.giveNumberThread.start();/启动电脑给出的线程number.guessNumberThread.start();/启动猜数字的线程Number.javapackage com;import java.util.Scanner;class Number implements Runnable final int smaller = -1, larger = 1, success = 10;int realNumber, guessNumber, min = 0, max = 200;int message=smaller;Thread giveNumberThread, guessNumberThread;/创建线程Number() giveNumberThread = new Thread(this);guessNumberThread = new Thread(this);Overridepublic synchronized void run()/synchronized为互斥锁,任一时刻只有一个资源访问int count = 1;while(true)if (Thread.currentThread() = giveNumberThread)if (count = 1) realNumber = (int) (Math.random() * 100) + 1;System.out.println(随机给你一个数为 + realNumber + ,猜猜是多少); else if (realNumber guessNumber) message = smaller;System.out.println(你猜小了); else if (realNumber guessNumber) message = larger;System.out.println(你猜大了); elsemessage = success;System.out.println(恭喜,你猜对了);try notify();/唤醒猜字进程wait();/系统给予的进程等待 catch (Exception e) System.out.println(=+e.getMessage();else if (Thread.currentThread() = guessNumberThread) if (count = 1) guessNumber = (min + max) / 2;System.out.println(我第 + count + 次猜这个数: + guessNumber); else if (message = smaller)min = guessNumber;guessNumber = (min + max) / 2;System.out.println(我第 + count + 次猜这个数是+ guessNumber); else if (message = larger) max = guessNumber;guessNumber = (min + max) / 2;System.out.println(我第 + count + 次猜这个数是+ guessNumber);else if (message = success)System.out.println(我成功了);System.exit(0);/return;try notify();wait();/Thread.sleep(); catch (Exception e) System.out.println(=+e.getMessage();count+;实验二调度算法实验实验目的与要求实现进程调度算法,有先来先服务、短作业优先、响应比高优先,进一步理解了进程调度各种算法的概念及含义。设计一个调度算法的程序,采用不同的调度算法对不同的进程进行调度,例如,为照顾为数众多的短作业,应采用短作业程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程,为了更公平,应用高响应比的算法,这样不会让各个作业等太久。实验正文实验思路:设计程序模拟进程的先来先服务FCFS,短作业优先SJF调度过程和高响应比。假设有n个进程分别在T1, ,Tn时刻到达系统,它们需要的服务时间分别为S1, ,Sn。分别采用先来先服务FCFS和短作业优先SJF进程调度算法,高响应比优先调度算法进行调度,计算每个进程的完成时间,周转时间和带权周转时间,优先权,并且统计n个进程的平均周转时间和平均带权周转时间。程序要求如下:1)进程个数n;每个进程的到达时间T1, ,Tn和服务时间S1, ,Sn;选择算法1-FCFS,2-SJF。2)要求采用先来先服务FCFS和短作业优先SJF分别调度进程运行,计算每个进程的周转时间,带权周转时间,并且计算所有进程的平均周转时间,带权平均周转时间;3)输出:要求模拟整个调度过程,输出每个时刻的进程运行状态,如“时刻3:进程B开始运行”等等;4)输出:要求输出计算出来的每个进程的周转时间,带权周转时间,所有进程的平均周转时间,带权平均周转时间。实验结果:课程设计结论通过此次课程设计,更深入的理解了各个进程调度算法,及实现过程。参考文献汤小丹,梁红兵,哲风屏,汤子瀛,计算机操作系统(第二版),西安电子科技大学出版社,2007年5月附录流程图系统流程图先来先服务流程短作业优先程序#include using namespace std;struct workchar name; /进程名int DTime;/到达时间int STime;/服务时间int FTime;/完成时间float CTime;/周转时间float PTime;/带权周转时间float Rp;/优先权struct work *next;/指向下一个作业;int works;/作业数目work *MIN(work *w,int i)work *p=w-next;work *q=p;while(p-next)if(i=0)/到达时间最小的if(q-DTime)=(p-next-DTime)q=p-next;/把到达时间最小的赋给qelse if(i=1)/服务时间最小的if(q-STime=p-next-STime)q=p-next;else if(i=2)/响应比最高的if(q-Rpnext-Rp)q=p-next;p=p-next;return q;void Delete_work(work *W,work *q,work *w)work *p=W;while(p-next!=q)if(p-next=NULL)return ;p=p-next;work *L=p-next;p-next=L-next;L-next=w-next;w-next=L;int FCFS(work *w1)int i;float sum1=0,sum2=0;float ctime=0,pctime=0;/ctime为平均周转时间,pctime为带权平均周转时间int time=0;/当前时间work *w2=new work;/w2中存放已经执行完的作业w2-next=NULL;for(i=1;i=works;i+)work * p=MIN(w1,0); if(timeDTime)time=p-DTime;p-FTime=time + p-STime;p-CTime=p-FTime - p-DTime;time+=p-STime;p-PTime=p-CTime/p-STime;coutname;Delete_work(w1,p,w2);w1-next=w2-next;coutnext)work *p1=q-next;sum1+=p1-CTime;/求周转时间的总和sum2+=p1-PTime;/求带权周转时间的总和q=q-next;ctime=sum1/works;coutctimeendl;/平均带权周转时间 = 带权周转时间总和/作业数pctime=sum2/works;cout用FCFS算法,平均带权周转时间为:n;coutpctimenext=NULL;w3-next=NULL;for(i=1;inext)/从w1中找出已到达的作业if(p1-next-DTimenext,w2);/找到已到达的作业从w1中删除,加到w2链表else if(p1-next!=NULL)p1=p1-next;/*上一个完成了,下一个作业还未到达 则从w1队列里找 到达时间最短的作业执行然后更新当前时间time */if(w2-next=NULL)work *p=MIN(w1,0);time=p-DTime;p-FTime=time+p-STime;/完成时间p-CTime=p-FTime - p-DTime;/周转时间p-PTime=p-CTime/p-STime;/带权周转时间time += p-STime;coutname;Delete_work(w1,p,w3);/更新w1else/从已到达作业中选择服务时间最短的作业执行并更新当前时间work *p2=MIN(w2,1);/找服务时间最小的p2-FTime=time+p2-STime;/完成时间p2-CTime=p2-FTime-p2-DTime;/周转时间p2-PTime=p2-CTime/p2-STime;/带权周转时间time += p2-STime; /更新时间为p2服务后的时间coutname;Delete_work(w2,p2,w3);work *p3=w1;while(p3-next)p3=p3-next;p3-next=w2-next;w2-next=NULL;/w2清零w1-next=w3-next;/还原作业序列/计算平均周转时间coutnext)/所有作业的周转时间总和work *p1=q-next;sum1+=p1-CTime;sum2+=p1-PTime;q=q-next;/平均周转时间ctime=sum1/works;coutctimeendl;/计算平均带权周转时间pctime=sum2/works;/平均带权周转时间coutpctimenext=NULL;w3-next=NULL;for(i=1;inext)/找出已经到达的作业,计算响应比后将其放入w2中if(p1-next-DTimenext-DTime); /等待时间p1-next-Rp=1+ waitTime/p1-next-STime;/计算响应比Delete_work(w1,p1-next,w2);else if(p1-next)p1=p1-next;if(w2-next=NULL)/若当前没有已经到达的作业,选择到达时间最短的作业执行并更新当前时间work *p=MIN(w1,0);time=p-DTime;p-FTime=time+p-STime;p-CTime=p-FTime - p-DTime;p-PTime=p-CTime/p-STime;time += p-STime;coutname;Delete_work(w1,p,w3);/更新w1else/从已到达作业中选择响应比最高的作业执行并更新当前时间work *p2=MIN(w2,2);p2-FTime=time+p2-STime;p2-CTime=p2-FTime-p2-DTime;p2-PTime=p2-CTime/p2-STime;time += p2-STime;coutname;Delete_work(w2,p2,w3);work *p3=w1;while(p3-next) p3=p3-next;p3-next=w2-next;/将未执行的作业全部放入w1中w2-next=NULL;/w2清零w1-next=w3-next;/还原作业序列coutnext)/所有作业的周转时间总和work *p1=q-next;sum+=p1-CTime;q=q-next;ctime=sum/works;/平均周转时间coutctimeendl;q =w3;sum=0;coutnext)/所有作业的带权周转时间总和work *p2=q-next;sum+=p2-PTime;q=q-next;pctime=sum/works;/平均带权周转时间coutpctimenext=NULL;coutworks;cout0;i-)/输入各作业的名字,到达时间,服务时间work *p=new work;cinp-name;cinp-DTime;cinp-STime;p-Rp=0;/优先权置为0p-next=W-next;W-next=p;cout用先来先服务调度算法顺序为:n;FCFS(W);coutendl;cout用短作业优先调度算法顺序为:n;SWF(W);coutendl;cout用高响应比优先调度算法顺序为:n;HRN(W);coutendl;return 0;实验三银行家实验实验目的与要求 熟悉银行家算法,理解系统产生死锁的原因及避免死锁的方法。设计五个进程P0,P1,P2,P3,P4共享三类资源A,B,C的系统,A,B,C的资源数量分别为10,5,7。进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源号以及为某进程分配资源后的有关资源数据。实验正文实验原理: 利用银行家算法避免死锁1、银行家算法中的数据结构(1)可利用资源向量Available(2)最大需求规阵Max(3)分配矩阵Allocation(4)需求矩阵Need2、银行家算法(1)如果Requesti或=Need,则转向步骤2;否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。(2)如果Request或=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,P1必须等待。(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:Available:=Available-Requesti;Allocation:=Allocationi+Request;Needi:=Needi-request;(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。3、安全性算法系统所执行的安全性算法可描述如下:(1)设置两个向量工作向量Work。它表示系统可提供进程继续运行所需要的各类资源数目,它含有m个元素,执行安全算法开始时,Work:=Allocation;Finish。它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finishi:=false;当有足够资源分配给进程时,令Finishi:=true。(2)从进程集合中找到一个能满足下述条件的进程:Finishi:=falseNeed/=Work如找到,执行步骤(3);否则,执行步骤(4)。(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work:=Work+Allocation;Finishi:=true;Go to step 2;(4)如果所有进程的Finishi=true,则表示系统处于安全状态;否则,系统处于不安全状态。实验设计思路:银行家算法的基本思想是分配资源之前, 判断系统是否是安全的; 若是, 才分配。它是最具有代表性的避免死锁的算法。 设进程cusneed 提出请求REQUEST i ,则银行家算法按如下规则进行判断。 (1) 如果REQUEST cusneed i= NEEDcusneedi ,则转(2) ;否则,出错。 (2) 如果REQUEST cusneed i= AVAILABLEcusneedi ,则转(3) ;否则,出错。 (3) 系统试探分配资源,进(4) 系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复 原状程等待安全性检查算法 (1) 设置两个工作向量Work=AVAILABLE;FINISH (2) 从进程集合中找到一个满足下述条件的进程, FINISH=false; NEED=Work; 如找到,执行(3) ;否则,执行(4) (3) 设进程获得资源,可顺利执行,直至完成,从而释放资源。 Work+=ALLOCATION; Finish=true; (4) 如所有的进程Finish= true ,则表示安全;否则系统不安全实验结果:4.5课程设计结论通过本次实验,我了解了银行家算法,同时知道了怎么样避免死锁。4.6参考文献汤小丹,梁红兵,哲风屏,汤子瀛,计算机操作系统(第二版),西安电子科技大学出版社,2007年5月附录流程图系统流程图银行家算法流程图安全性算法流程图程序#include#include#include#define False 0#define True 1int Max5050=0;/各进程所需各类资源的最大需求int Avaliable50=0;/系统可用资源char name50=0;/资源的名称int Allocation5050=0;/系统已分配资源int Need5050=0;/还需要资源int Request50=0;/请求资源向量int temp50=0;/存放安全序列int Work50=0;/存放系统可提供资源int M=50;/作业的最大数为50int N=50;/资源的最大数为50void Show()/显示资源矩阵 int i,j; coutendl此时刻的资源分配情况为:endl; cout Max Allocation Need Avaliableendl; cout进程名 ; for(j=0;j4;j+)/j为 组的数量 for(i=0;iN;i+) coutnamei ; cout ; coutendl; for(i=0;iM;i+) cout Pi ;for(j=0;jN;j+)coutMaxij ;cout ;for(j=0;jN;j+)coutAllocationij ;cout ;for(j=0;jN;j+)coutNeedij ;if(i=0) cout ;for (j=0;jN;j+) coutAvaliablej ;/输出分配资源coutendl; int Change(int i)/进行资源分配 int j; for (j=0;jM;j+) Avaliablej=Avaliablej-Requestj;/分配后,系统现有资源 Allocationij=Allocationij+Requestj;/分配后,已得到的资源 Needij=Needij-Requestj;/分配后,还需要的资源return 1;int Safety()/安全性算法 int i,d,k=0,m,h,s,apply,Finish50=0;/k为记录安全系列的下标 int j; for(i=0;iN;i+) Worki=Avaliablei; coutendl 安全性检查 endl; cout Work Need Allocation Work+Allocation Finishendl; cout进程名 ;for(h=0;h4;h+) for(s=0;sN;s+)/资源名称分别输出 coutnames ; cout ; coutendl;for(i=0;iM;i+)/M为作业数, apply=0;/统计资源数 for(j=0;jN;j+)/N为资源数 if (Finishi=False&Needij=Workj)/进程的所需资源分别小于可用资源 apply+; if(apply=N) cout Pi ; for(d=0;dN;d+) coutWorkd ; cout ; for(d=0;dN;d+) coutNeedid ; cout ; for(d=0;dN;d+) coutAllocationid ; cout ; for(m=0;mN;m+) Workm=Workm+Allocationim;coutWorkm ; /变可分配数 Finishi=True; tempk=i;/记录安全序列 cout ; couttrue ; coutendl; i=-1;/从头开始找符合条件的作业 k+; for(i=0;iM;i+)/查找哪个作业不符合条件的,则为不安全序列 if(Finishi=False)/如果有一个作业的资源不满足条件(即finish(i)=0),则此序列不安全 for(j=0;jN;j+) Avaliablej=Avaliablej+Requestj;coutRequestj ; Allocationij=Allocationij-Requestj; Needij=Needij+Requestj; coutendl系统进入不安全状态!此时系统不分配资源!endl;/不成功系统不安全 return 0; coutendl此

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论