操作系统课程设计报告-文件系统.doc_第1页
操作系统课程设计报告-文件系统.doc_第2页
操作系统课程设计报告-文件系统.doc_第3页
操作系统课程设计报告-文件系统.doc_第4页
操作系统课程设计报告-文件系统.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

南阳理工学院操作系统课程设计报告指导老师: 学院: 软件学院学院班级:09软工2班姓名: 学号: 设计时间: 2011-12-1 3 专业年级:09软工2班 姓名:宋根林学号:068109051 教师评定: 一.设计目的:通过课程设计, 加深对操作系统各资源管理模块的理解,掌握操作系统的基本原理及功能, 具有初步分析实际操作系统、设计、构造和开发现代操作系统的基本能力。二.设计内容:设计进程控制块PCB表结构,分别适用于可强占的优先数调度算法和循环轮转调度算法。建立进程就绪队列。对两种不同算法编制入链子程序。编制两种进程调度算法:1)可强占的优先进程调度;2)循环轮转调度三设计过程1、 实现功能设计进程控制块PCB表结构,分别适用于可强占的优先数调度算法和循环轮转调度算法。建立进程就绪队列。对两种不同算法编制入链子程序。编制两种进程调度算法:1)可强占的优先进程调度;2)循环轮转调度2、 添加功能先到先服务进程调度算法,计算每个进程的周转时间和带权周转时间以及模拟cpu运行的利用率。3、 设计思路本程序用两种算法对多个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态。为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。在优先数算法中,优先数的值为50与运行时间的差值,即Pro_time-process-needtime。进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。在轮转算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。对于遇到优先数一致的情况,采用FIFO策略解决。4、 算法和流程图可强占优先调度算法实现过程流程图:循环轮转算法实现过程流程图:FCFS算法实现过程流程图:四操作界面截图及分析进程输入:可强占的优先进程调度过程:循环轮转调度过程:先到先服务调度过程:五.设计总结:通过该课程设计,加深了对系统进程调度机制的理解。在抢占方式中实践了“抢占” 必须遵循的原则:优先权原则,短进程优先原则,时间片原则。认识了几种进程调度算法的优缺点以及应用范围。加强C+的编程能力,实现类的封装。附录:程序及注释(用红色黑体标注自己设计的函数)/进程PCB类和模拟cpu的进程类的声明#include#include #include #include #includeusing namespace std ;/进程的状态#define UNREADY 0 /未就绪#define READY 1 /就绪#define EXECUTE 2 /执行#define END 3 /完成/进程的PCB类struct ProcessPcbProcessPcb()next=NULL;char pro_name20;/进程的名字int time_submit ; /提交时间,从时间的1开始计时int time_exe ;/进程所需的运行时间 int pro_id ;/进程ID - 系统生成int pro_priority ;/进程优先级=50-所需运行时间int time_start ;/开始执行的时间int time_end ;/结束的时间int time_wait ;/等待的时间int pro_state ; /进程的状态 (就绪,执行,完成)int time_left ;/还需多少时间单位 /,初始化为所需的执行时间int time_turn ;/周转时间double time_aver ;/带权周转时间ProcessPcb *next;/封装CPU调度与分配程序模块。class CpuModelpublic:CpuModel()pcbnum=0;void cpurun();/cpu模拟运行函数bool GetPcb();/进程输入函数void ShowPcb();/将输入的进程展示出来void PriModel();/可强占的优先进程调度模式void RrModel();/循环轮转调度模式void FcfsModel();/先到先服务调度模式private:ProcessPcb PcbList100;/按提交时间排的未就绪进程队列(),int pcbnum ;/进程数量int freetime;/cpu空闲时间int allturn ; /总周转时间float allaver ; /总带权周转时间;#include/cpu模拟运行函数void CpuModel:cpurun()if(!GetPcb() /进程输入函数return ;ShowPcb();/展示所需执行进程信息int choose = 0 ;while(1)cout请选择需要模拟的CPU调度算法!endl ; cout 1: 可强占的优先进程调度 endl ;cout 2: 循环轮转调度endl;cout 3: 先到先调度endl;cout 4: 退出系统 endl ;cout选择 : ;cinchoose ;coutendl ;switch(choose)case 1:/可强占的优先进程方式PriModel();break;case 2:/循环轮转调度方式RrModel();break;case 3:/先到先服务调度方式FcfsModel();break;default:return;coutendl;/按进程提交时间排序的比较函数bool cmp(ProcessPcb a,ProcessPcb b)if(a.time_submit0&a0=9)num=a0-0;else return -1;for(i=1;i=0&ai=9)num=num*10+ai-0;else return -1;return num;/进程输入函数bool CpuModel:GetPcb()char num10;coutnum;/输入进程个数pcbnum=isnumber(num);if(pcbnum=0) cout输入有错n; return 0; ;int i;for(i=0;ipcbnum;i+)/输入进程信息cout请依次输入第i+1个进程的信息!endl ;cout名字: ;cinPcbL_name ;cout提交时间:;cinnum;PcbListi.time_submit=isnumber(num);if(PcbListi.time_submit=0) cout输入有错n; return 0;cout执行时间:;cinnum;PcbListi.time_exe=isnumber(num);if(PcbListi.time_exe=0) cout输入有错n; return 0;/PcbListi.time_left=PcbListi.time_exe;/设置剩余执行时间PcbL_state=UNREADY;/设置状态为未就绪PcbL_priority=50-PcbListi.time_exe;/设置优先级,=50-执行时间coutendl ;sort(PcbList,PcbList+pcbnum,cmp);/按提交时间排序for(i=0;ipcbnum;i+)PcbL_id=i+1;/设置Id,根据提交时间return 1;/展示所需执行进程信息void CpuModel:ShowPcb()int i;coutn所需执行的进程信息如下:n;for(i=0;ipcbnum;i+)cout#进程编号: PcbL_id 进程名字: PcbL_name 提交时间: PcbListi.time_submit 执行时间: PcbListi.time_exe 优先数:PcbL_priorityendl ;coutendl;/可强占的优先进程调度模式void CpuModel:PriModel()coutnext=NULL;/head 指针不用,head-next开始为就绪队列/模拟cpu开始工作while(head-next!=NULL|pnumpcbnum)Sleep(1000);time+;/时间片为1coutTime: 第time秒endl;/打印(第time秒:)/ 进程就绪(查看未就绪的进程中在该时间片是否可以进入就绪队列)while(pnumpcbnum & PcbListpnum.time_submitnext=head-next;/插在head之后head-next=pcb; /查找在time时间片应该运行的进程if(head-next=NULL)cout没有可运行的进程next;pcb1=head-next;while(pcb1-next!=NULL)/查找当前优先级最高的就绪进程if(pcb-pro_prioritynext-pro_priority)pcb2=pcb1;pcb=pcb1-next;pcb1=pcb1-next;/运行优先级最高的进程if(pcb-time_left=pcb-time_exe)/该进程是否已开始pcb-time_start=time;/设置开始时间pcb-pro_state=EXECUTE;/设置状态为执行pcb-pro_priority=pcb-pro_priority-3;/优先级数减3pcb-time_left-;/剩余执行时间减去时间片1/打印该进程信息cout进程编号: pro_id 进程名字: pro_name 提交时间 : time_submit 执行时间: time_exen开始时间: time_start 还剩时间: time_left 优先数:pro_prioritytime_left=0)/该进程是否执行结束pcb2-next=pcb2-next-next;/将其在就绪队列中出列pcb-time_end=time;/设置结束时间pcb-time_turn=pcb-time_end-pcb-time_submit+1;/计算周转时间pcb-time_aver=pcb-time_turn/(double)pcb-time_exe;/计算带权周转时间pcb-pro_state=END;cout进程pro_id运行结束:n进程名字: pro_name 提交时间: time_submit 执行时间: time_exe 开始时间: time_start 结束时间: time_endn周转时间: time_turn 带权周转时间: time_averendl ; / end while(head!=NULL|pnumpcbnum)cout所有进程运行完毕!endl;double c=(time-freetime)/(double)time*100;cout cpu利用率:c%endl;/end/循环轮转调度模式void CpuModel:RrModel()cout#循环轮转进程调度过程如下#n;freetime=0;/初始化系统空闲时间为0int time=0;/时间int pnum=0;/已就绪进程数目ProcessPcb pcb;queue que;/就绪的进程队列 /模拟cpu开始工作while(que.empty()!=true|pnumpcbnum)Sleep(1000);time+;/时间片为1coutTime: 第time秒endl;/打印(第time秒:)/ 进程就绪(查看未就绪的进程中在该时间片是否可以进入就绪队列)while(pnumpcbnum & PcbListpnum.time_submit=time) que.push(PcbListpnum+);/查找time时间片的运行进程if(que.empty()=true)cout没有可运行的进程endl;freetime+;/elsepcb=que.front();que.pop();/出列/运行进程if(pcb.time_left=pcb.time_exe)/该进程是否已开始pcb.time_start=time;/设置开始时间_state=EXECUTE;/设置状态为执行pcb.time_left-;/剩余执行时间减去时间片1/打印进程信息cout进程编号: _id 进程名字: _name 提交时间 : pcb.time_submit 执行时间: pcb.time_exen开始时间: pcb.time_start 还剩时间: pcb.time_leftendl ;if(pcb.time_left=0) /该进程执行结束pcb.time_end=time;/设置结束时间pcb.time_turn=pcb.time_end-pcb.time_submit+1;/计算周转时间pcb.time_aver=pcb.time_turn/(double)pcb.time_exe;/计算带权周转时间_state=END;cout进程_id运行结束:n进程名字: _name 提交时间: pcb.time_submit 执行时间: pcb.time_exe 开始时间: pcb.time_start 结束时间: pcb.time_endn周转时间 : pcb.time_turn 带权周转: pcb.time_averendl ; else/未结束,加入就绪队列队尾que.push(pcb); / end while(que.empty()!=true|pnumpcbnum)cout所有进程运行完毕!endl;double c=(time-freetime)/(double)time*100;cout cpu利用率:c%endl;/end void CpuModel:RrModel()/先到先服务调度模式void CpuModel:FcfsModel()cout#先到先服务进程调度过程如下#n;freetime=0;/初始化系统空闲时间为0int time=0;/时间int pnum=0;/已就绪进程数目ProcessPcb que100;/就绪队列int quef,quee;/就绪队列的头指针和尾指针quef=0; quee=0; /模拟cpu开始工作while(quefquee|pnumpcbnum)Sleep(1000);time+;/时间片为1coutTime: 第time秒endl;/打印(第time秒:)/ 进程就绪(查看未就绪的进程中在该时间片是否可以进入就绪队列)while(pnumpcbnum & PcbListpnum.time_submit=time) quequee+=PcbListpnum+;/查找time时间片的运行进程if(quef=quee)cout没有可运行的进程endl;freetime+;else/运行进程if(quequef.time_left=quequef.time_exe)/该进程是否已开始quequef.time_start=time;/设置开始时间_state=EXECUTE;/设置状态为执行quequef.time_left-;/剩余执行时间减去时间片1/打印进程信息cout进程编号: _id 进程名字: _name 提交时

温馨提示

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

评论

0/150

提交评论