操作系统课程设计报告书.docx
《操作系统课程设计报告书.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计报告书.docx(37页珍藏版)》请在冰豆网上搜索。
![操作系统课程设计报告书.docx](https://file1.bdocx.com/fileroot1/2023-2/25/489508c9-a1f9-40e6-b7d9-73a83abeacce/489508c9-a1f9-40e6-b7d9-73a83abeacce1.gif)
操作系统课程设计报告书
河北大学工商学院
操作系统课程设计
题目:
操作系统课程设计
学院工商学院
学部信息科学与工程
专业计算机类
学号20144229166
姓名赵林华
指导教师王煜
2016年6月24日
设备管理2
2.1设计任务..........................................................................................................................2
2.2设计要求..........................................................................................................................2
四、程序设计及实验6
五、总结和讨论9
六、代码……………………………………………………………………………………………10
一、引言
1.1课程设计目的
通过模拟操作系统的实现,加深对操作系统工作原理理解,进一步了解操作系统的实现方法,并可练习合作完成系统的团队精神和提高程序设计能力。
1.2课程设计内容
模拟采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存储管理、设备管理、文件管理和用户接口四部分。
1.3小组人数
小组人员:
赵林华
张铭
二、需求分析
设备管理
设备管理设备管理主要包括设备的分配和回收。
模拟系统中有鼠标、键盘、打印机和视频四种设备,采用安全分配方式。
设备采用设备状态的变化还有设备颜色的变化来判断设备所处的状态,当创建文件是就指明了要调用的设备,让后等进程运行时来知道调用的什么设备,最后颜色和状态的变化来反应调用的设备与每个设备所处的状态。
设备用JButton图标显示,通过灰色和可见色判断是否被调用
2.1设计任务
设计一个设备管理分配程序,按先来先服务的算法,对设备进行分配。
2.2设计要求
设备管理主要包括设备的分配和回收。
(1)模拟系统中有A、B、C三种独占型设备,A设备3个,B设备2个,C设备1个。
(2)因为模拟系统比较小,因此只要设备表设计合理即可。
(3)采用先来先服务分配策略,采用设备的安全分配方式。
(4)屏幕显示
三、算法及设计结构
3.1算法的总体思想(流程)
设备管理的功能是按照设备的类型和系统采用的分配策略,为请求I/O进程分配一条传输信息的完整通路。
合理的控制I/O的控制过程,可最大限度的实现CPU与设备、设备与设备之间的并行工作。
1.监视所有设备。
为了能对设备实施有效的分配和控制,系统能获取设备的状态。
设备状态保存在设备控制表(DeviceTable)中,并动态的记录状态的变化及有关信息。
2.制定分配策略。
按先来先服务的算法,进行设备分配。
3.设备的分配。
把设备分配给进程。
4.设备回收。
当进程运行完毕后,要释放设备,则系统必须回收,一边其他进程使用。
图3.1
3.2Equipment模块
3.2.1功能
记录设备的状态及相关信息
检查设备是否被调用
对设备进行分配
进程结束对设备进行回收
3.2.2数据结构
一个DeviceTable类、一个DeviceTable函数。
DeviceTable是设备分配表,说明设备的分配状况,是否被占用。
Device类说明了设备是如何使用的。
每个设备是否被使用,哪个进程在使用该设备,哪些进程在等待使用该设备。
3.3cpu模块
3.3.1功能
进程对设备的调用,当进程使用设备时,检查设备是否空闲。
如果空闲,则调用该设备;如果设备正被使用,则将该进程阻塞到该设备的阻塞队列中,等到设备空闲时,再被唤醒,调用设备。
3.3.2数据结构
一个设备的枚举类型DeviceType,一个cpu函数。
Cpu函数中调用Equipment模块中的函数对设备进行检测。
如果设备空闲,就调用该设备;如果设备真在被使用,则该进程被阻塞到该设备的阻塞队列中。
3.3.3算法
通过调用Equipment模块中的函数对设背进行检测:
如果设备空闲,则使用该设备;如果设备正在工作,则进程被阻塞。
3.4form1模块
3.4.1功能
界面管理
启动进程,如果要使用设备,按先来先服务的算法调用设备。
此模块中有一个设备调用函数publicintAllocate(DeviceTypetype),根据设备的物理名调用设备,并将信息显示显示到界面中。
3.4.2算法
先来先服务(FCFS,FirstComeFirstService)分配算法:
每一设备有一队列管理,当多个作业或任务对同一设备提出I/O请求时,该算法把请求的先后次序排成一个等待该设备的队列,设备分配程序把设备分配给队列中的第一各作业。
四、程序设计与实验
对着目录节点点击右键可以添加执行文件,文本文件和新目录
点击新建执行文件,输入文件名称
弹出内容窗口,输入内容,然后退出保存,同时也可以用菜单栏编辑选项
点击是以后,创建成功,执行文件扩展名为.exe,此时磁盘显示占用:
磁盘情况
这是创建文件的过程就结束了。
图4-1
进程调用设备。
先调用A类设备,A类设备一共有三个,如果有空闲的设备,则进程就可调用;否则将进程阻塞到设备A的阻塞队列中,等待设备,等到A类设备有空闲设备时,就唤醒该进程,在断点处继续进行程序。
再调用B类设备,B类设备一共有两个,如果有空闲的设备,则进程就可调用;否则将进程阻塞到设备B的阻塞队列中,等待设备,等到B类设备有空闲设备时,就唤醒该进程,在断点处继续进行程序。
最后调用C类设备,C类设备只有一个,C设备是临界资源,如果C设备空闲,则进程就可调用;否则将进程阻塞到设备C的阻塞队列中,等待设备,等到C设备空闲,就唤醒该进程,在断点处继续进行程序。
五、总结和讨论
设备管理主要监视所有设备的状态,制定分配策略,完成设备的分配回收,合理的控制I/O的控制过程,最大限度的实现CPU与设备、设备与设备之间的把并行工作。
通过对这次操作系统课程设计的亲自参与和操作,使我深刻体会到了:
只要你想做只要你想学没有弄不懂得事情,工程里面也不能不在乎细节,等等。
感觉很受益匪浅。
懂得了操作系统包括的四部分内容:
文件管理和用户接口、存储管理、设备管理、进程管理之间的内在联系。
加深了我对这门课程的理解。
锻炼了自己在考虑全局也不是细节的能力。
通过这次实验,再一次熟悉并深入掌握了程序设计语言和界面设计。
同时,我也深深体会到了团队的重要性,如果没有同组人的互相鼓励和督促我跟本不能很快的完成任务。
一滴水的力量是有限的,但汇聚成溪流将是美丽的。
虽然我们每个人的力量都是有限的,但是激烈的讨论、相互的鼓励使我们在实践中成长。
感谢和我一起面对的同伴们,因为有你们我才变得勤奋。
更感谢给予我们谆谆教导的老师,在我们犹豫困惑时给予我们指导,谢谢您!
通过java的Swing编程,简单的模拟了一下操作系统,部分功能并不完善,希望在之后的日子里可以做的更好;
充分的体现的面相对象的思想,简单的通过时间片轮转的调度算法实现操作系统的进程模块
小组成员的充分配合,分工合作共同完成一个项目的团结协作精神
六、代码
程序代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Windows.Forms;
namespaceOS.ClassFolder
{
publicenumInterrupt
{
IO,
End,
No
}
publicenumProcessState
{
Block,
Ready,
Execute,
White
}
publicenumDeviceType
{
a,
b,
c,
no
}
publicstructPCB
{
publicintProcessID;//进程块的编号(0-9)
publicstringProcessName;//使用该进程块的进程名
publicintPageAdress;//页表的首地址
publicintSum;//页表的长度
publicintPC;//各个寄存器的状态
publicstringIR;
publicintDR;
publicInterruptPSW;
publicintPri;//优先级
publicintWaitTime;//要使用设备多长时间
publicintGetDeviceTime;//获得设备的时间
publicintExecuteTime;//开始执行的时间
publicDeviceTypeNeedDevice;//申请失败的设备类型
publicDeviceTypeHaveDevice;//正在使用的设备类型
publicintDN;//使用的是哪个设备
publicstringBlockReason;//阻塞的原因
publicintNext;
}
classCPU
{
publicintPC;
publicintDR;
publicstringIR;
publicInterruptPSW;
publicInterruptPSW1;
publicPCB[]PCBArray=newPCB[10];
publicDateTimeXTTime;
publicintXDTime;
publicintWhite;//空白
publicintReady;//就绪
publicintBlock;//阻塞
publicintExecute;//执行
privateDeviceTypetype;
privateinttime;
publicOS.ClassFolder.MainRamram=newMainRam();
publicOS.ClassFolder.DeviceDev=newDevice();
privatevoidInit()
{
//
//初始化PCB块
//
White=0;
Ready=Block=Execute=10;
for(inti=0;i<10;i++)
{
PCBArray[i].ProcessID=i;
PCBArray[i].Next=i+1;
}
//
//初始化寄存器
//
PC=0;
PSW=Interrupt.No;
PSW1=Interrupt.No;
IR="";
//
//初始化时间
//
XTTime=Convert.ToDateTime("00:
00:
00");
XDTime=0;
}
//
//构造函数
//
publicCPU()
{
Init();
}
#regioncpu类的事件和委托
//
//申请设备的事件和委托
//
publicclassDeviceStateChangeEventArgs:
EventArgs
{
privateint_Atime;
privateDeviceType_type;
privateint_DN;
privatestring_processname;
privateint_needtime;
publicintAtime
{
get{return_Atime;}
set{_Atime=value;}
}
publicDeviceTypetype
{
get{return_type;}
set{_type=value;}
}
publicintDN
{
get{return_DN;}
set{_DN=value;}
}
publicstringprocessname
{
get{return_processname;}
set{_processname=value;}
}
publicintneedtime
{
get{return_needtime;}
set{_needtime=value;}
}
}
publicdelegatevoidDeviceStateChangeEventHander(objectsender,DeviceStateChangeEventArgse);
publiceventDeviceStateChangeEventHanderDeviceStateChange;
publicdelegatevoidErrorIREventHander(objectsender,EventArgse);
publiceventErrorIREventHanderErrorIR;
publicdelegatevoidQueueChangeHander(objectsender,EventArgse);
publiceventQueueChangeHanderQueueChange;
publicdelegatevoidFinishIRHander(objectsender,EventArgse);
publiceventFinishIRHanderFinishIR;
publicdelegatevoidExecuteIsWhiteHander(objectsender,EventArgse);
publiceventExecuteIsWhiteHanderExecuteIsWhite;
#endregion
//
//空闲PCB链表的操作
//
publicintGetOneFromWhite()
{
inta=White;
if(a<10)
{
White=PCBArray[a].Next;
}
returna;
}
publicvoidInsertOneToWhite(inta)
{
PCBArray[a].Next=White;
White=a;
}
//
//就绪PCB链表的操作
//
publicvoidInsertOneToReady(inta)
{
PCBArray[a].Next=Ready;
Ready=a;
}
publicvoidGetOneFromReady(inta)
{
intb=Ready;
if(a==b)
{
Ready=PCBArray[a].Next;
}
else
{
while(b<10)
{
if(PCBArray[b].Next==a)
{
PCBArray[b].Next=PCBArray[PCBArray[b].Next].Next;
}
b=PCBArray[b].Next;
}
}
}
//
//阻塞PCB链表的操作
//
publicvoidInsertOneToBlock(inta)
{
PCBArray[a].Next=Block;
Block=a;
}
//
//Creat函数,创建进程
//
publicvoidCreat(stringName,stringstr)
{
//
//申请PCB,a>10,则申请失败
//
inta=GetOneFromWhite();
intb;
if(str.Length>0)
{
intsum=(str.Length+15)/16;
if(a<10)
{
if(ram.Judge(sum)==true)
{
//
//分配内存并加载到内存
//
b=ram.Allocate(sum);
ram.LoadContent(str,b);
//
//初始化PCB
//
PCBArray[a].ProcessName=Name;
PCBArray[a].PageAdress=b;
PCBArray[a].Sum=sum;
PCBArray[a].PC=0;
PCBArray[a].IR="";
PCBArray[a].DR=0;
PCBArray[a].PSW=Interrupt.No;
PCBArray[a].WaitTime=-10;
PCBArray[a].Pri=1024/str.Length;
PCBArray[a].ExecuteTime=0;
PCBArray[a].NeedDevice=DeviceType.no;
PCBArray[a].HaveDevice=DeviceType.no;
PCBArray[a].GetDeviceTime=0;
PCBArray[a].DN=-1;
PCBArray[a].BlockReason="";
InsertOneToReady(a);
//
//是否转向进程调度
//
intc=JudgeAttemper();
if(c<10)
{
Attemper(c);
}
}
else
{
InsertOneToWhite(a);
MessageBox.Show("内存不足或文件太长,创建进程失败","消息",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
else
{
MessageBox.Show("PCB块不足,创建进程失败","消息",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
else
{
MessageBox.Show("文件为空,不能创建进程","错误",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
//
//Destroy函数,撤销程序
//
publicvoidDestory(inta)
{
//
//回收内存
//
intp=PCBArray[a].PageAdress;
intsum=PCBArray[a].Sum;
ram.DeAllocate(p,sum);
//
//回收PCB块
//
InsertOneToWhite(a);
Execute=10;
//
//显示结果
//
//
//
//
}
//
//BlockProcess函数,阻塞进程
//
publicvoidBlockProcess(inta,DeviceTypeb,inttime)
{
//
//保护CPU现场
//
PCBArray[a].PC=PC;
PCBArray[a].IR=IR;
PCBArray[a].DR=DR;
//
//判断申请设备是否成功,根据不同情况填写BlockReason项
//
boold=Dev.JudgeDevice(b);
if(d==false)
{
PCBArray[a].NeedDevice=b;
PCBArray[a].HaveDevice=DeviceType.no;
PCBArray[a].BlockReason="申请"+b+"设备失败";
PCBArray[a].PC=PCBArray[a].PC-4;
}
else
{
PCBArray[a].DN=Dev.Allocate(b);
PCBArray[a].HaveDevice=b;
PCBArray[a].NeedDevice=DeviceType.no;
PCBArray[a].GetDeviceTime=XDTime;
PCBArray[a].WaitTime=time;
PCBArray[a].BlockReason="等待IO输入输出";
if(DeviceStateChange!
=null)
{
DeviceStateChangeEventArgse=newDeviceStateChangeEventArgs();
e.DN=PCBArray[a].DN;
e.type=b;
e.processname=PCBArray[a].ProcessName;
e.needtime=time;
e.Atime=XDTime;
DeviceStateChange(null,e);
}
}
//
//修改进程状态
//
InsertOneToBlock(a);
Execute=10;
//
//转向进程调度
//
intc=JudgeAttemper();
if(c<10)
{
Attemper(c);
}
}
//
//WakeUp函数,唤醒进程
//
publicvoidWakeUp(intID,DeviceTypedevice)
{
//
//唤醒自己
//
intd=Block;
if(Block==ID)
{
Block=PCBArray[ID].Next;
InsertOneToReady(ID);
}
else
{
while(PCBArray[d].Next<10)
{
if(PCBArray[d].Next==ID)
{
PCBArray[d].Next=PCBArray[ID].Next;
InsertOneToReady(ID);
break;
}
d=PCBArray[d].Next;
}
}
//
//检查第一个节点
//
while(Block<10&&PCBArray[Block]