操作系统B实验报告(华北电力大学科技学院).doc_第1页
操作系统B实验报告(华北电力大学科技学院).doc_第2页
操作系统B实验报告(华北电力大学科技学院).doc_第3页
操作系统B实验报告(华北电力大学科技学院).doc_第4页
操作系统B实验报告(华北电力大学科技学院).doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

课程设计报告( 2011- 2012年度第1学期)名 称: 操作系统原理课程设计B 院 系: 信息工程系 班 级: 软件09k2 学 号: 091909020227 学生姓名: 闫雪峰 指导教师: 郭丰娟 张琦 设计周数: 1 成 绩: 日期:2011年 11 月25日操作系统原理课程设计B课程设计任 务 书一、 目的与要求1. 理解和掌握操作系统的基本概念、基本组成与工作原理;2. 理解和掌握操作系统中主要功能模块的工作原理及其实现算法;3. 掌握软件模块设计技能;熟悉并能较好地利用软件开发环境独立编程、调试和分析程序运行情况,逐渐形成创新思维和从事系统软件的研究和开发能力。二、 主要内容采用某种程序设计语言,设计与开发一个仿真操作系统,要求具备进程调度、存储器管理、文件及设备管理等基本功能,具体内容包括:1. 模拟单处理器系统的进程调度,加深对进程的概念及进程调度算法的理解;2. 编写一个多线程程序,加深对现代操作系统中线程的理解;3. 编写和调试一个银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法;4. 用可变分区算法模拟主存的分配和回收,加深对存储器管理的理解,熟悉各种主存分配方法;5. 模拟虚拟存储管理中缺页中断及页面置换算法,加深对虚拟存储器管理的理解,熟悉各种页面淘汰算法;模拟设备的分配与回收,加深对设备管理的理解;模拟文件管理的工作过程,从而对各种文件操作命令的实质内容和执行过程有比较深入的了解;模拟磁盘调度的过程,加深对磁盘存储器管理的理解,熟悉各种磁盘调度算法。6. 综合以上实验的结果,并进行集成与设计,开发出一个小型虚拟操作系统。对以上课程设计内容,将根据学生的专业与实际情况进行调整,某些题目为选作题目。三、 进度计划序号设计(实验)内容完成时间备注1熟悉开发环境及程序设计语言1天2系统的分析、设计2天3调试与集成1天4验收,提交实验报告1天四、 设计(实验)成果要求至少完成主要内容中的3项,统一使用课程设计报告书,文字清楚、工整。五、 考核方式实验结果(60)+实验报告(30)+实验过程表现(10)学生姓名:指导教师:2011年11 月 25日一、课程设计(综合实验)的目的与要求1. 理解和掌握操作系统的基本概念、基本组成与工作原理;2. 理解和掌握操作系统中主要功能模块的工作原理及其实现算法;3. 掌握软件模块设计技能;熟悉并能较好地利用软件开发环境独立编程、调试和分析程序运行情况,逐渐形成创新思维和从事系统软件的研究和开发能力。二、设计正文实验1:单处理器系统的进程调度1.1实验目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。1.2实验要求1设计一个按时间片轮转法实现处理器调度的程序,每个程序由一个PCB表示。2程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。1.3实验原理和设计进程控制块PCB的格式为:进程名指针要求运行时间已运行时间状态指针进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程的指针指出第一个进程的进程控制块首地址。要求运行时间假设进程需要运行的单位时间数。已运行时间假设进程已经运行的单位时间数,初始值为“0”。状态有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用0表示。当一个进程运行结束后,它的状态为“结束”,用1表示。(1) 运行处理器调度程序前,输入进程数并且为每个进程设置所需的服务时间;(2) 把各个进程按顺序排成循环队列,用指针指出队列连接情况;(3)由于是模拟程序,在时间片轮转的前提下,每次使得相应进程:执行时间=已执行时间+1;(4)输出运行细节。1.4实验结果实验2:主存储器空间的分配和回收2.1实验目的一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现虽与主存储器的管理方式有关的,通过本实验帮助学生理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。2.2实验要求1在可变分区管理方式下采用最先适应算法实现主存分配和实现主存回收。2打印空闲区说明表的初始状态,作业4的申请量以及为作业4分配后的空闲区说明表状态;再依次打印作业3和作业2的归还量以及回收作业3,作业2所占主存后的空闲区说明表。2.3实验原理和设计1. 可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。例如:05k10k14k26k32k128k操作系统作业1作业3空闲区作业2空闲区其中,起址指出一个空闲区的主存起始地址。 长度指出从起始地址开始的一个连续空闲的长度。2.4运行结果实验3:多线程游戏(贪吃蛇)3.1实验目的 (1)任何语言,实现多线程游戏,如龟兔赛跑,摇奖机等。3.2实验原理和设计(1) vb实现贪吃蛇游戏,用到timer控件实现多线程的控制,实现贪吃蛇的基本功能(2) 连接access数据库,将最高分信息存到数据库。3.2实验结果三、课程设计(综合实验)总结通过本次课程综合实验,我对存储器内部进程调度、空间管理和页面置换等相关算法有了更加深刻的理解,同时锻炼了动手能力,为以后更加深入地学习操作系统这门课程打下了良好的基础。值得一提的是,本次实验对设计多线程游戏有了些许心得,兴趣所致,今后当加强这方面的学习,开发出一些好玩的小游戏。计算机相关的学科离不开上机实践,只有通过实践,才能更好地掌握知识,自己以后当主动上机实践相关理论知识。四、参考文献 1 计算机操作系统,西安电子科技大学出版社,2007年5月第3版;汤小丹 梁红兵 哲凤屏 汤子嬴 编著。2/ 游戏开发教程附录实验一/ timer.cpp : 定义控制台应用程序的入口点#include stdafx.hint _tmain(int argc, _TCHAR* argv)return 0;#include#include#include #define TIME 1typedef struct procuderint chrName;/进程名字int intRoundTime;int intRunningTime;/已经运行时间char chrFlag;struct procuder *pointerNext; procuder;int main()int intTotal;/进程总数int i;int intCounter=1;/计数标记procuder *pNew;/新申请的节点procuder *pPointer;/当前程序指针procuder *pPrevious;/当前指针的前一个指针procuder *pPrint;/输出打印的指针pPointer=(procuder *)malloc(sizeof(procuder);/初始化指针节点pPrevious=pPointer;/将俩个指针初始化在一起printf(请输入总数total:);scanf(%d,&intTotal); for(i=1;ipointerNext=pNew;/将新申请节点与前一个节点连接起来pPrevious=pNew;/将指示指针移到新申请的指针printf(请输入第%d进程名字:,i);scanf(%d,&(pNew-chrName);printf(请输入第%d要求运行时间:,i);scanf(%d,&(pNew-intRoundTime);pNew-chrFlag=R;pNew-intRunningTime=0;/初始化标记为和运行时间pPrevious-pointerNext=pPointer-pointerNext;/设成循环队列pPointer=pPointer-pointerNext;while(pPointer-pointerNext!=pPointer)/运行完剩一个进程结束pPointer-intRunningTime=pPointer-intRunningTime+TIME;/模拟进程运行/输出当前的状态,代码自己写把printf( 第%d次运行:当前运行的程序为%dn,intCounter+,pPointer-chrName);printf(n就绪队列情况nn进程名字需要时间运行时间状态n);if (pPointer-intRunningTimeintRoundTime)/判断当前进程是否完成未完成pPointer=pPointer-pointerNext;/轮转到下一个时间片pPrevious=pPrevious-pointerNext;/previous后移else/完成了将当前节点剔除pPointer-chrFlag=E;/设置标志位pPrevious-pointerNext=pPointer-pointerNext;/剔除当前节点pPointer=pPointer-pointerNext;/运行指针后移pPrint=pPrevious;while(pPrint-pointerNext!=pPrevious)/输出各个进程的状态printf( %d %d %d %cn,pPrint-chrName,pPrint-intRoundTime,pPrint-intRunningTime,pPrint-chrFlag);pPrint=pPrint-pointerNext;/后移printf( %d %d %d %cn,pPrint-chrName,pPrint-intRoundTime,pPrint-intRunningTime,pPrint-chrFlag);printf(n);/换行while(pPointer-intRunningTimeintRoundTime)pPointer-intRunningTime=pPointer-intRunningTime+TIME;/模拟进程运行printf( 第%d次运行:当前运行的程序为%dn,intCounter+,pPointer-chrName);printf(n就绪队列情况nn进程名字需要时间运行时间状态n);printf( %d %d %d %cnn,pPointer-chrName,pPointer-intRoundTime,pPointer-intRunningTime,pPointer-chrFlag);system(pause);return 0;实验二/ MemoryControl.cpp : 定义控制台应用程序的入口点。#include stdafx.hint _tmain(int argc, _TCHAR* argv)return 0;#include#include#includetypedef struct memorytable/空间去说明表结构体int intStartAddress;/起始地址int intLength;/空间长度int intFlag;/标记为为空表目为未分配memorytable;struct process/进程的属性包括名字所需时间以运行时间int intName;int iEndFlag;/标记为标记是否已经卸载过int iSuccessfullyFitMemory;/是否成功分配内存标记int intStartTime;int intNeedTime;int intRoundTime;int intNeedMemorySize;int intStartAddress;struct process *sNext;int PrintMemoryTable(struct memorytable sSubMemoryTable,struct process *sSubPointer,int intSubTotal)/输出空间说明表的情况int i;int iCounter=0;/计数器计算总共有多少个自由表项printf(n空间说明表:当前内存分区表总大小为%d个表项nn,intSubTotal*2);printf(栏目地址长度状态n);for(i=0;iintSubTotal*2;i+)/循环输出当前空间说明表中所有表目相if(sSubMemoryTFlag=1) iCounter+;/计数器+有一个自由表项计数器加一printf(%d %d %d %dn,i,sSubMemoryTStartAddress,sSubMemoryTLength,sSubMemoryTFlag);printf(当前共有%d个能分配表目,分别从%d号内存栏目n,iCounter,iCounter-1);return 0;int Crimple(struct memorytable sSubMemoryTable,struct process *sSubPointer,int intSubTotal)/内存缩紧代码int i,j;/计数器for(i=0;iintSubTotal;i+)for(j=i+1;jsSubMemoryTStartAddress)/若j不为空表目且j的开始地址小于i的开始地址,交换sSubMemoryTable2*intSubTotal=sSubMemoryTablei;sSubMemoryTablei=sSubMemoryTablej;sSubMemoryTablej=sSubMemoryTable2*intSubTotal;else/i为空表目,交换i和j的值if(sSubMemoryTFlag=1)/且j不是空表目sSubMemoryTable2*intSubTotal=sSubMemoryTablei;sSubMemoryTablei=sSubMemoryTablej;sSubMemoryTablej=sSubMemoryTable2*intSubTotal;/打印输出代码PrintMemoryTable(sSubMemoryTable,sSubPointer,intSubTotal);return(0);int FitMemory(struct memorytable sSubMemoryTable,struct process *sSubPointer,int intSubTotal)int i=-1;/计数器while(+isSubPointer-intNeedMemorySize)/判断当前栏的大小是否能放下进程printf(将%d号内存起始地址%d,内存大小%d 分配给%d进程占用内存大小%dn,i,sSubMemoryTStartAddress,sSubMemoryTLength,sSubPointer-intName,sSubPointer-intNeedMemorySize);sSubPointer-intStartAddress=sSubMemoryTStartAddress;sSubMemoryTStartAddress=sSubMemoryTStartAddress+sSubPointer-intNeedMemorySize;sSubMemoryTLength=sSubMemoryTLength-sSubPointer-intNeedMemorySize;/输出空间说明表PrintMemoryTable(sSubMemoryTable,sSubPointer,intSubTotal);return 1;if(sSubMemoryTLength=sSubPointer-intNeedMemorySize)/刚好相等printf(将%d号内存起始地址%d,内存大小%d 分配给%d进程占用内存大小%dn,i,sSubMemoryTStartAddress,sSubMemoryTLength,sSubPointer-intName,sSubPointer-intNeedMemorySize);sSubPointer-intStartAddress=sSubMemoryTStartAddress;sSubMemoryTFlag=0;sSubMemoryTStartAddress=0;sSubMemoryTLength=0;/缩紧分区说明表,输出空间说明表Crimple(sSubMemoryTable,sSubPointer,intSubTotal);return 2;printf(内存分配失败%d号进程:需要内存空间为%d 在内存空闲说明表中无满足要求者n,sSubPointer-intName,sSubPointer-intNeedMemorySize);/内存分配失败PrintMemoryTable(sSubMemoryTable,sSubPointer,intSubTotal);sSubPointer-iSuccessfullyFitMemory=0;/内存分配失败回受时不回收return 0;int RemoveMemory(struct memorytable sSubMemoryTable,struct process *sSubPointer,int intSubTotal)/从内存卸载函数int i;/计数器int j;int intFlag=0;/标位位int intStartAddress;int intLength;/定义起始地址和长度临时变量intStartAddress=sSubPointer-intStartAddress;intLength=sSubPointer-intNeedMemorySize;/初始化长度for(i=intSubTotal*2-1;i=0;i-)if(sSubMemoryTFlag=1)&(sSubMemoryTStartAddress=intStartAddress+intLength)/如果有与归还区下临的空闲分区表printf(有与%d号进程下邻的空闲分区表%d号内存起始地址%d,长度%dn,sSubPointer-intName,i,sSubMemoryTStartAddress,sSubMemoryTLength);intLength+=sSubMemoryTLength;intFlag=1;/设置标记位for(j=i-1;j=0;j-)/判断是否有与当前表目上临的空闲去if(sSubMemoryTFlag=1)/上临的区域不为空表目if(sSubMemoryTStartAddress+sSubMemoryTLength=intStartAddress)/有上林空闲区/有上邻空闲区代码,将下邻空闲区置为空表目,修改上邻空闲区的长度printf(有与%d号进程上邻的空闲分区表%d号内存起始地址%d,长度%dn,sSubPointer-intName,j,sSubMemoryTStartAddress,sSubMemoryTLength);sSubMemoryTFlag=0;sSubMemoryTLength=0;sSubMemoryTStartAddress=0;/将下邻空闲表目初始化sSubMemoryTLength+=intLength;Crimple(sSubMemoryTable,sSubPointer,intSubTotal);/缩紧代码return(1);/无上邻空闲区代码,修改下邻空闲区的起始地址和长度printf(无与%d号进程上邻的空闲分区n,sSubPointer-intName);sSubMemoryTStartAddress=intStartAddress;sSubMemoryTLength=intLength;Crimple(sSubMemoryTable,sSubPointer,intSubTotal);return(2);/无上邻空闲区/没有有与归还区下临的空闲分区表if(intFlag=0)printf(无与%d号进程下邻的空闲分区n,sSubPointer-intName);for(i=0;iintName,i,sSubMemoryTStartAddress,sSubMemoryTLength);sSubMemoryTLength+=intLength;Crimple(sSubMemoryTable,sSubPointer,intSubTotal);/return(3);/有与归还区上邻的空闲区printf(无与%d号进程上邻的空闲分区表目n,sSubPointer-intName,i);for(i=intSubTotal*2-1;i0;i-)/查找表找到一个空表目if(sSubMemoryTFlag=0)sSubMemoryTFlag=1;sSubMemoryTStartAddress=intStartAddress;sSubMemoryTLength=intLength;Crimple(sSubMemoryTable,sSubPointer,intSubTotal);return(4);/没有归还区上邻的空闲区/回收失败printf(sorry 回收失败n);return(0);int main()int i;/计数器int intMemorySize;int intTotal;/内存分成N份int intStartAddress;/内存起始地址int intProcessTotal;/进程总数int intTime=0;int intEndTime;/结束时间struct memorytable sMemoryTable100;/定义空间说明变总共有个空间struct memorytable *sTemp; /定义变量struct process *sHead;struct process *sPointer;/定义进程数据struct process *sNew;for (i=0;i100;i+)/初始化说明表sTemp=(memorytable *)malloc(sizeof(struct memorytable);/申请新空间if (!sTemp) exit(1);/判断是否申请成功sMemoryTablei=*sTemp;sMemoryTFlag=0;sMemoryTLength=0;sMemoryTStartAddress=0;printf(请输出内存大小*KB:);/输入内存总大小,本程序采用固定分配即将内存等分成n分请让内存大小能整除分区的个数scanf(%d,&intMemorySize);printf(请输入将内存等分成多少分:);/内寸等分成n分scanf(%d,&intTotal);printf(请输入内存起始地址:);/输入内存起始地址scanf(%d,&intStartAddress);printf(请输入共有多少个进程要装入内存:);/输入进程数scanf(%d,&intProcessTotal);printf(请输入程序运行的最终结束时间:);/输入运行时间scanf(%d,&intEndTime);/初始化内存数组的代码for(i=0;iintTotal;i+)sMemoryTFlag=1;sMemoryTLength=intMemorySize/intTotal;sMemoryTStartAddress=intStartAddress+i*sMemoryTLength;/初始化进程的一些属性,sHead为进程队列的头指针sHead=(struct process *)malloc(sizeof(struct process);sPointer=sHead;for(i=0;isNext=sNew;sPointer=sNew;sPointer-sNext=NULL;/以下为初始化进程的属性printf(请输入进程%d的名字:,i);scanf(%d,&(sPointer-intName);printf(请输入进程%d开始装入内存的时间:,i);scanf(%d,&(sPointer-intStartTime);printf(请输入进程%d将要运行的时间:,i);scanf(%d,&(sPointer-intNeedTime);printf(请输出进程%d需要的内存大小:,i);scanf(%d,&(sPointer-intNeedMemorySize);sPointer-intRoundTime=0;sPointer-iEndFlag=0;sPointer-iSuccessfullyFitMemory=1;/默认成功分配内存标记为能分配分配失败时置零/开始模拟将程序装入内存,注视进程开始时间必须大于while(+intTime)/运行一次时间加一sPointer=sHead;/初始化队列指针while(sPointer=sPointer-sNext)!=NULL)if(sPointer-intStartTime=intTime)/如果到了开始时间/装入内存代码printf(n正在装入%d号进程,当前逻辑时间%dn,sPointer-intName,intTime);/printf(%d号进程所需内存大小为%dn,sPointer-intName,sPointer-intNeedMemorySize);/打印进程信息FitMemory(sMemoryTable,sPointer,intTotal);if(intTime=sPointer-intStartTime)&(sPointer-intRoundTimeintNeedTime)/若程序已经装入,并且为运行完模拟时间加一sPointer-intRoundTime+;/已经运行时间加一if(sPointer-intRoundTime=sPointer-intNeedTime)&(sPointer-iEndFlag=0)/时间到达从内训卸载/进程从内训卸载代码printf(n正在卸载%d号进程【装入时间%d 需要时间%d 运行时间%d】,当前逻辑时间%dn,sPointer-intName,sPointer-intStartTime,sPointer-intNeedTime,sPointer-intRoundTime,intTime);sPointer-iEndFlag=1;/设置进程完成运行标记位为即运行结束if(sPointer-iSuccessfullyFitMemory=1)/判断分配内存是否成功,若分配成功才回收printf(%d号进程从%d地址开始,占用内存大小为%dn,sPointer-intName,sPointer-intStartAddress,sPointer-intNeedMemorySize);/打印进程信息RemoveMemory(sMemoryTable,sPointer,intTotal);elseprintf(%d号进程:需内存空间为%d 分配时未能成功分配此处不回收n,sPointer-intName,sPointer-intNeedMemorySize);/此处添加跳出运行代码if(intTimeintEndTime) break;system(pause);return 0;/主函数结束实验三Dim Score As IntegerDim Speed As IntegerDim EatTag As IntegerDim conn As ADODB.ConnectionDim rs As ADODB.RecordsetDim aspect As IntegerDim PassTag As IntegerDim WallTag As IntegerPublic Sub CloseAccess() rs.Close conn.Close Set conn = Nothing Set rs = NothingEnd SubPublic Sub LinkAccess() 链接数据库过程 Set conn = New ADODB.Connection conn.Open Provider=Microsoft.Jet.OLEDB.4.0;Data Source= & App.Path & db3.mdb Set rs = New ADODB.Recordset rs.Open select * from 排行榜 where 标记= & CboWall.ListIndex & CboPass.ListIndex & , connEnd SubPublic Sub RankPage() 生成最高分过程 Dim Name As String Call LinkAccess If Score rs.Fields(分数) Then Name = InputBox(恭喜 恭喜,请输入姓名, 破纪录啦, , Screen.Width / 2, Screen.Height / 2) conn.Execute (update 排行榜 set 姓名= & Name & ,分数= & Score & where 标记= & CboWall.ListIndex & CboPass.ListIndex & ) LblSort.Caption = rs.Fields(姓名) & & rs.Fields(分数) & 分 重新显示最高分 End If Call CloseAccessEnd SubPublic Sub IsWall(WallTagSub As Integer, PassTagSub As Integer) If WallTagSub = 0 Then 判断是否有围墙 If aspect = 2 And Pic(0).Left + Pic(0).Width PicRect.ScaleWidth Then PicHead.Left = 0 ElseIf aspect = 1 And PicHead.Left PicRect.ScaleHeight Then PicHead.Top = 0 ElseIf aspect = 3 And PicHead.Top 0 Then PicHead.Top = PicHead.Top + PicRect.Height End If Else If PicHead.Left PicRect.ScaleWidth - 250 Or PicHead.Top PicRect.ScaleHeight Then 舌头碰到墙壁 Call GameOver End If End If Select Case PassTagSub Case 1 If (PicHead.Left = 1500 And PicHead.Left = 5250) And (PicHead.Top = 1750 Or PicHead.Top = 3250) Then Call GameOver End If End Select End SubPublic Sub GameSelect() Dim ProblemTag As Integer, i As Integer ProblemTag = CboProblem.ListIndex If WallTag = 1 Then 判断是否有围墙 For i = 1 To 112 卸载围墙 Unload PicWall(i) Next i End If WallT

温馨提示

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

评论

0/150

提交评论