




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统课程设计报告学 院 计算机 专 业 计算机科学与技术 班 级 2011级1班 题 目 实现处理机调度模块功能 学 号 姓 名 指导教师 丁国芳 一、 采用具有二级调度的调度队列模型。其中作业调度采用先来先服务策略,进程调度采用时间片轮转调度算法。二、利用银行家算法避免死锁。三、课程设计要求:1. 系统总共运行100个作业。为每个进入后备队列的作业创建一个JCB,内容包括:作业标识、预计运行时间、资源需求等。其中预计运行时间和资源需求随机生成(120个时间片,A资源0-5,B资源0-3,C资源0-4)。2. 系统开始从后备队列中调入10个作业进入系统。以后每完成一个作业就从后备队列中调入一个,直到所有作业完成。3. 系统为每个作业创建一个进程,按JCB分配系统资源。共有3类系统资源,其中A类资源50个,B类资源30个,C类资源40个)。4. 进程在运行过程中(即每个时间片内),可能会申请新的资源(申请的各类资源个数均不超过2)。用银行家算法控制资源的分配,避免死锁。注意,每个进程申请各类资源的数目不能超过系统资源总数的二分之一。5. 创建三个阻塞队列A、B、C,分别记录因资源请求而阻塞的进程。6. 可视化编程,形象地展现进程运行的状态。四、代码实现:using System;using System.Collections.Generic;using System.Text;using System.Windows.Forms;namespace process_scheduling public partial class Form1 : Form StringBuilder sb = new StringBuilder(); static int timeflat = 0; static int, max = new int100, 3; static int, allocation = new int100, 3; static int, need = new int100, 3; public struct JCB public int flag; public String name;/作业名 public int servertime;/服务时间 public int arrivetime;/到达时间 public int remaintime;/剩余服务时间 public int f;/阻塞时获得资源变成就绪状态标志 ; Queue pqueue = new Queue();/后备队列 Queue rqueue = new Queue();/就绪队列 Queue blockA = new Queue();/阻塞A队列 Queue blockB = new Queue();/阻塞B队列 Queue blockC = new Queue();/阻塞C队列 int resource = new int3 50, 30, 40 ;/分别是资源A ,B,C 和它们的数量 static JCB job = new JCB100; public Form1() InitializeComponent(); private void Form1_Load(object sender, EventArgs e) sb.Append(); Random rd = new Random(); for (int i = 0; i 0) timeflat = Convert.ToInt32(tb_timeflat.Text); else if (tb_timeflat.Text.Length = 0) sb.Append(请输入时间片!); sb.Append(Environment.NewLine); tb_content.Text = sb.ToString(); if (timeflat 20) sb.Append(时间片大小不合法!); sb.Append(Environment.NewLine); tb_content.Text = sb.ToString(); else run(); public void run() int count = 0; for (int i = 0; i count) if (blockA.Count = 0 & blockB.Count = 0 & blockC.Count = 0) sb.Append(count.ToString(); sb.Append( 处理机处理空转 ); sb.Append(Environment.NewLine); count+; else wakeup(); else JCB pro1 = new JCB(); pro1 = rqueue.Dequeue(); if (allocationpro1.flag, 0 = maxpro1.flag, 0) if (allocationpro1.flag, 1 = maxpro1.flag, 1) if (allocationpro1.flag, 2 = maxpro1.flag, 2) if (pro1.remaintime = timeflat&pro1 .servertime =timeflat ) pro1.remaintime -= timeflat; sb.Append(时间: 作业名: 服务总时间: 剩余服务时间 状态 ); sb.Append(Environment.NewLine); sb.Append(count); sb.Append(-); sb.Append(count +timeflat) ); sb.Append( ); sb.Append(pro1 .name ); sb.Append( ); sb.Append(pro1 .servertime ); sb.Append( ); sb.Append(pro1 .remaintime ); if(pro1 .remaintime=0) sb.Append( 进程结束 ); else sb.Append( 运行中 ); sb.Append(Environment .NewLine ); count += timeflat;/当前时间加上时间片 if (pro1.remaintime != 0) addprocess(ref count ,9);/加回之前确保在这之前的进程加入到就绪队列里,9确保能有位置加入 rqueue.Enqueue(pro1);/加回就绪队列 showqueue(rqueue ); else sb.Append(时间: 作业名: 服务总时间: 剩余服务时间 状态 ); sb.Append(Environment.NewLine); sb.Append(count); sb.Append(-); sb.Append(count + pro1.remaintime ); sb.Append( ); sb.Append(); sb.Append( ); sb.Append(pro1.servertime); sb.Append( ); sb.Append(0 进程结束 ); sb.Append(Environment.NewLine); count += pro1 .remaintime ;/当前时间加上时间片 pro1.remaintime = 0;/服务时间 /进程结束查看阻塞队列 if (pro1.remaintime = 0) relaxresource(pro1); wakeup(); else sb.Append(pro1 .name ); sb.Append(阻塞 ); sb.Append(Environment.NewLine); blockC.Enqueue(pro1); else sb.Append(); sb.Append(阻塞 ); sb.Append(Environment.NewLine); blockB.Enqueue(pro1); else sb.Append(); sb.Append(阻塞 ); sb.Append(Environment.NewLine); blockA.Enqueue(pro1); tb_content.Text = sb.ToString(); /银行家算法 private int allocationarithmetic(int i, int requestA, int requestB, int requestC) int rtn = 1; /资源A if (requestA = resource0 & requestA 0) resource0 -= requestA;/减去相应资源 needi, 0 -= requestA;/减去相应需求资源数 allocationi, 0 += requestA;/增加相应资源数 else rtn = -1; /资源B if (requestB = resource1 & requestB 0) resource1 -= requestB;/减去相应资源 needi, 1 -= requestB;/减去相应需求资源数 allocationi, 1 += requestB;/增加相应资源数 else rtn = -1; /资源C if (requestC = resource2 & requestC 0) resource2 -= requestC;/减去相应资源 needi, 2 -= requestC;/减去相应需求资源数 allocationi, 2 += requestC;/增加相应资源数 else rtn = -1; if (rtn != -1) / Console.WriteLine(进程请求量出现错误,请核实后在运行程序!); /else rtn = safearithmetic(); if (rtn = 0)/此分配方案导致系统不安全 if (requestA 0) resource0 += requestA;/加上相应资源 needi, 0 += requestA;/加上相应需求资源数 allocationi, 0 -= requestA;/减去相应资源数 if (requestB 0) resource1 += requestB;/加上相应资源 needi, 1 += requestB;/加上相应需求资源数 allocationi, 1 -= requestB;/减去相应资源数 if (requestC 0) resource2 += requestC;/加上相应资源 needi, 2 += requestC;/加上相应需求资源数 allocationi, 2 -= requestC;/减去相应资源数 return rtn; /安全算法 private int safearithmetic() int finish = new int10;/完成工作量 int work = new int3;/现有资源记录量 int, record = new int10, 3;/记录就绪队列中每个进程的需求量 int, allocate = new int10, 3;/记录就绪队列中每个进程已分配的资源量 int i = 0; work0 = resource0; work1 = resource1; work2 = resource2; foreach (JCB item in rqueue) recordi, 0 = needitem.flag, 0;/进程对资源A的需求量 recordi, 1 = needitem.flag, 1; recordi, 2 = needitem.flag, 2; allocatei, 0 = allocationitem.flag, 0; allocatei, 1 = allocationitem.flag, 1; allocatei, 2 = allocationitem.flag, 2; i+; i = 0; while (i 10) if (recordi, 0 = work0 & recordi, 1 = work1 & recordi, 2 = work2 & finishi = 0) work0 += allocationi, 0; work1 += allocationi, 1; work2 += allocationi, 2; finishi = 1; i = 0; else i+; int flg = 1; for (i = 0; i 0) jp1 = blockA.Peek(); if (needjp1.flag, 0 0) jp1 = blockB.Peek(); if (needjp1.flag, 1 = 2)/请求资源 request(ref jp1, 0, needjp1.flag, 1, 0); else request(ref jp1, 0, 2, 0); if (jp1.f = 1 & jp1.flag 0) jp1 = blockC.Peek(); if (needjp1.flag, 2 = 2)/请求资源 request(ref jp1, 0, 0, needjp1.flag, 2); else request(ref jp1, 0, 0, 2); if (jp1.f = 1 & jp1.flag jp.flag) jp = blockC.Peek(); bl = 2; if (bl != -1) switch (bl) case 0: jp = blockA.Dequeue(); break; case 1: jp = blockB.Dequeue(); break; case 2: jp = blockC.Dequeue(); break; rqueue.Enqueue(jp);/将已获资源的进程加回到就绪队列中 sb.Append(); sb.Append(进入就绪队列 ); sb.Append(Environment.NewLine); showqueue(rqueue ); private void relaxresource(JCB jcb1) resource0 += allocationjcb1.flag, 0; resource1 += allocationjcb1.flag, 1; resource2 += allocationjcb1.flag, 2; private void addprocess(ref int count,int sum) JCB jb = new JCB(); if (pqueue.Count != 0) jb = pqueue.Peek(); else jb.arrivetime = int.MaxValue; while (jb.arrivetime = count & rqueue.Count 0) pro = pqueue.Dequeue(); /分配资源 if (resource0 - maxpro.flag, 0 = 0) needpro.flag, 0 = 0; allocationpro.flag, 0 = maxpro.flag, 0; resource0 -= maxpro.flag, 0; else allocationpro.flag, 0 = resource0; needpro.flag, 0 = maxpro.flag, 0 - allocationpro.flag, 0; resource0 = 0; if (resource1 - maxpro.flag, 1 = 0) needpro.flag, 1 = 0; allocationpro.flag, 1 = maxpro.flag, 1; resource1 -= maxpro.flag, 1; else allocationpro.flag, 1 = resource1; needpro.flag, 1 = maxpro.flag, 1 - allocationpro.flag, 1; resource1 = 0; if (resource2 - maxpro.flag, 2 = 0) needpro.flag, 2 = 0; allocationpro.flag, 2 = maxpro.flag, 2; resource2 -= maxpro.flag, 2; else allocationpro.flag, 2 = resource2; needpro.flag, 2 = maxpro.flag, 2 - allocationpro.flag, 2; resource2 = 0; rqueue.Enqueue(pro); tb_content.Text = tb_content.Text + .ToString() + 进入系统+Environment .NewLine ; if (pqueue.Count != 0) jb = pqueue.Peek(); /显示当前就绪队列中所有进程信息 private void showqueue(Queue q) sb.Append(当前就绪队列中所有进程信息); sb.Append(Environment .NewLin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 应急安全培训证课件
- 应急安全培训活动课件
- 应急安全培训企业培训课件
- 2024职称计算机考前冲刺试卷附参考答案详解【培优A卷】
- 秋季腹泻患儿辅食调整方案与喂养指导
- 非开挖施工合同(标准版)
- 建筑商合同(标准版)
- 租用香菇大棚合同(标准版)
- 2025年教育信息化2.0背景下教师信息技术与课程资源整合能力培养策略研究报告
- 2025年智慧校园安全管理报告:校园安全风险防控策略研究
- 人才服务合同书
- 2025-2026学年统编版八年级上册道德与法治教学计划含教学进度表
- 2025年工会入职考试试题及答案
- 2025年中国电力投资集团校园招聘笔试题型分析及备考策略
- 旅游服务安全知识培训课件
- 公司章程制定合同协议书范本模板
- 2024人教PEP版三年级英语上册全册教案
- 中国慢性胃炎诊治指南(2022年)解读
- 立体车库应急预案范文
- 体彩专管员专业知识培训课件
- 严重腹部创伤院内救治专家共识(2024)解读
评论
0/150
提交评论