操作系统课程设计(共26页).doc
精选优质文档-倾情为你奉上河北大学工商学院装订线 操作系统课程设计 题目: 操作系统课程设计 学 院 工商学院 学 部 信息科学与工程 专 业 计算机类 学 号 姓 名 赵林华 指导教师 王煜 2016 年 6 月 24 日 目 录目 录2一、引言11.1课程设计目的11.2课程设计内容11.3小组人数及编程语言1二、需求分析2设备管理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.13.2 Equipment模块3.2.1 功能记录设备的状态及相关信息检查设备是否被调用对设备进行分配进程结束对设备进行回收3.2.2 数据结构一个DeviceTable类、一个DeviceTable函数。DeviceTable是设备分配表,说明设备的分配状况,是否被占用。Device类说明了设备是如何使用的。每个设备是否被使用,哪个进程在使用该设备,哪些进程在等待使用该设备。 3.3 cpu模块3.3.1 功能进程对设备的调用,当进程使用设备时,检查设备是否空闲。如果空闲,则调用该设备;如果设备正被使用,则将该进程阻塞到该设备的阻塞队列中,等到设备空闲时,再被唤醒,调用设备。3.3.2 数据结构一个设备的枚举类型DeviceType,一个cpu函数。Cpu函数中调用Equipment模块中的函数对设备进行检测。如果设备空闲,就调用该设备;如果设备真在被使用,则该进程被阻塞到该设备的阻塞队列中。3.3.3 算法通过调用Equipment模块中的函数对设背进行检测:如果设备空闲,则使用该设备;如果设备正在工作,则进程被阻塞。3.4 form1模块3.4.1 功能界面管理启动进程,如果要使用设备,按先来先服务的算法调用设备。此模块中有一个设备调用函数public int Allocate(DeviceType type),根据设备的物理名调用设备,并将信息显示显示到界面中。3.4.2 算法先来先服务(FCFS, First Come First Service)分配算法:每一设备有一队列管理,当多个作业或任务对同一设备提出I/O请求时,该算法把请求的先后次序排成一个等待该设备的队列,设备分配程序把设备分配给队列中的第一各作业。四、程序设计与实验对着目录节点点击右键可以添加执行文件,文本文件和新目录点击新建执行文件,输入文件名称弹出内容窗口,输入内容,然后退出保存,同时也可以用菜单栏编辑选项点击是以后,创建成功,执行文件扩展名为.exe,此时磁盘显示占用:磁盘情况这是创建文件的过程就结束了。YNNNY执行的进程根据设备的物理名调用设备设备a是否空闲设备b是否空闲设备c是否空闲进程结束,回收设备Y将该进程放到设备a的阻塞队列中将该进程放到设备b的阻塞队列中将该进程放到设备c的阻塞队列中图4-1进程调用设备。先调用A类设备, A类设备一共有三个,如果有空闲的设备,则进程就可调用;否则将进程阻塞到设备A的阻塞队列中,等待设备,等到A类设备有空闲设备时,就唤醒该进程,在断点处继续进行程序。再调用B类设备, B类设备一共有两个,如果有空闲的设备,则进程就可调用;否则将进程阻塞到设备B的阻塞队列中,等待设备,等到B类设备有空闲设备时,就唤醒该进程,在断点处继续进行程序。最后调用C类设备, C类设备只有一个,C设备是临界资源,如果C设备空闲,则进程就可调用;否则将进程阻塞到设备C的阻塞队列中,等待设备,等到C设备空闲,就唤醒该进程,在断点处继续进行程序。五、总结和讨论设备管理主要监视所有设备的状态,制定分配策略,完成设备的分配回收,合理的控制I/O的控制过程,最大限度的实现CPU与设备、设备与设备之间的把并行工作。通过对这次操作系统课程设计的亲自参与和操作,使我深刻体会到了:只要你想做只要你想学没有弄不懂得事情,工程里面也不能不在乎细节,等等。感觉很受益匪浅。懂得了操作系统包括的四部分内容:文件管理和用户接口、存储管理、设备管理、进程管理之间的内在联系。加深了我对这门课程的理解。锻炼了自己在考虑全局也不是细节的能力。通过这次实验,再一次熟悉并深入掌握了程序设计语言和界面设计。同时,我也深深体会到了团队的重要性,如果没有同组人的互相鼓励和督促我跟本不能很快的完成任务。一滴水的力量是有限的,但汇聚成溪流将是美丽的。虽然我们每个人的力量都是有限的,但是激烈的讨论、相互的鼓励使我们在实践中成长。感谢和我一起面对的同伴们,因为有你们我才变得勤奋。更感谢给予我们谆谆教导的老师,在我们犹豫困惑时给予我们指导,谢谢您!通过java的Swing编程,简单的模拟了一下操作系统,部分功能并不完善,希望在之后的日子里可以做的更好;充分的体现的面相对象的思想,简单的通过时间片轮转的调度算法实现操作系统的进程模块小组成员的充分配合,分工合作共同完成一个项目的团结协作精神六、代码程序代码using System;using System.Collections.Generic;using System.Text;using System.Windows.Forms;namespace OS.ClassFolder public enum Interrupt IO, End, No public enum ProcessState Block, Ready, Execute, White public enum DeviceType a, b, c, no public struct PCB public int ProcessID; /进程块的编号(0-9) public string ProcessName; /使用该进程块的进程名 public int PageAdress; /页表的首地址 public int Sum; /页表的长度 public int PC; /各个寄存器的状态 public string IR; public int DR; public Interrupt PSW; public int Pri; /优先级 public int WaitTime; /要使用设备多长时间 public int GetDeviceTime; /获得设备的时间 public int ExecuteTime; /开始执行的时间 public DeviceType NeedDevice; /申请失败的设备类型 public DeviceType HaveDevice; /正在使用的设备类型 public int DN; /使用的是哪个设备 public string BlockReason; /阻塞的原因 public int Next; class CPU public int PC; public int DR; public string IR; public Interrupt PSW; public Interrupt PSW1; public PCB PCBArray=new PCB10; public DateTime XTTime; public int XDTime; public int White;/空白 public int Ready;/就绪 public int Block;/阻塞 public int Execute;/执行 private DeviceType type; private int time; public OS.ClassFolder.MainRam ram = new MainRam(); public OS.ClassFolder.Device Dev = new Device(); private void Init() / /初始化PCB块 / White = 0; Ready =Block=Execute=10; for (int i = 0; i < 10; i+) PCBArrayi.ProcessID = i; PCBArrayi.Next = i + 1; / /初始化寄存器 / PC = 0; PSW = Interrupt.No; PSW1 = Interrupt.No; IR = "" / /初始化时间 / XTTime = Convert.ToDateTime("00:00:00"); XDTime = 0; / /构造函数 / public CPU() Init(); #region cpu类的事件和委托 / /申请设备的事件和委托 / public class DeviceStateChangeEventArgs : EventArgs private int _Atime; private DeviceType _type; private int _DN; private string _processname; private int _needtime; public int Atime get return _Atime; set _Atime = value; public DeviceType type get return _type; set _type = value; public int DN get return _DN; set _DN = value; public string processname get return _processname; set _processname = value; public int needtime get return _needtime; set _needtime = value; public delegate void DeviceStateChangeEventHander(object sender, DeviceStateChangeEventArgs e); public event DeviceStateChangeEventHander DeviceStateChange; public delegate void ErrorIREventHander(object sender, EventArgs e); public event ErrorIREventHander ErrorIR; public delegate void QueueChangeHander(object sender, EventArgs e); public event QueueChangeHander QueueChange; public delegate void FinishIRHander(object sender,EventArgs e); public event FinishIRHander FinishIR; public delegate void ExecuteIsWhiteHander(object sender, EventArgs e); public event ExecuteIsWhiteHander ExecuteIsWhite; #endregion / /空闲PCB链表的操作 / public int GetOneFromWhite() int a = White; if (a<10) White = PCBArraya.Next; return a; public void InsertOneToWhite(int a) PCBArraya.Next = White; White = a; / /就绪PCB链表的操作 / public void InsertOneToReady(int a) PCBArraya.Next = Ready; Ready = a; public void GetOneFromReady(int a) int b = Ready; if (a = b) Ready = PCBArraya.Next; else while (b < 10) if (PCBArrayb.Next = a) PCBArrayb.Next = PCBArrayPCBArrayb.Next.Next; b = PCBArrayb.Next; / /阻塞PCB链表的操作 / public void InsertOneToBlock(int a) PCBArraya.Next = Block; Block = a; / /Creat函数,创建进程 / public void Creat(string Name,string str) / /申请PCB,a>10,则申请失败 / int a = GetOneFromWhite(); int b; if (str.Length > 0) int sum = (str.Length + 15) / 16; if (a < 10) if (ram.Judge(sum) = true) / /分配内存并加载到内存 / b = ram.Allocate(sum); ram.LoadContent(str, b); / /初始化PCB / PCBArraya.ProcessName = Name; PCBArraya.PageAdress = b; PCBArraya.Sum = sum; PCBArraya.PC = 0; PCBArraya.IR = "" PCBArraya.DR = 0; PCBArraya.PSW = Interrupt.No; PCBArraya.WaitTime = -10; PCBArraya.Pri = 1024 / str.Length; PCBArraya.ExecuteTime = 0; PCBArraya.NeedDevice = DeviceType.no; PCBArraya.HaveDevice = DeviceType.no; PCBArraya.GetDeviceTime = 0; PCBArraya.DN = -1; PCBArraya.BlockReason = "" InsertOneToReady(a); / /是否转向进程调度 / int c = 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函数,撤销程序 / public void Destory(int a) / /回收内存 / int p = PCBArraya.PageAdress; int sum = PCBArraya.Sum; ram.DeAllocate(p,sum); / /回收PCB块 / InsertOneToWhite(a); Execute = 10; / /显示结果 / / / / / /BlockProcess函数,阻塞进程 / public void BlockProcess(int a,DeviceType b,int time) / /保护CPU现场 / PCBArraya.PC = PC; PCBArraya.IR = IR; PCBArraya.DR = DR; / /判断申请设备是否成功,根据不同情况填写BlockReason项 / bool d = Dev.JudgeDevice(b); if (d = false) PCBArraya.NeedDevice = b; PCBArraya.HaveDevice = DeviceType.no; PCBArraya.BlockReason = "申请" + b + "设备失败" PCBArraya.PC = PCBArraya.PC - 4; else PCBArraya.DN = Dev.Allocate(b); PCBArraya.HaveDevice = b; PCBArraya.NeedDevice = DeviceType.no; PCBArraya.GetDeviceTime = XDTime; PCBArraya.WaitTime = time; PCBArraya.BlockReason = "等待IO输入输出" if (DeviceStateChange != null) DeviceStateChangeEventArgs e=new DeviceStateChangeEventArgs(); e.DN = PCBArraya.DN; e.type = b; e.processname = PCBArraya.ProcessName; e.needtime = time; e.Atime = XDTime; DeviceStateChange(null,e); / /修改进程状态 / InsertOneToBlock(a); Execute = 10; / /转向进程调度 / int c = JudgeAttemper(); if (c < 10) Attemper(c); / /WakeUp函数,唤醒进程 / public void WakeUp(int ID,DeviceType device) / /唤醒自己 / int d = Block; if (Block = ID) Block = PCBArrayID.Next; InsertOneToReady(ID); else while (PCBArrayd.Next < 10) if (PCBArrayd.Next = ID) PCBArrayd.Next = PCBArrayID.Next; InsertOneToReady(ID); break; d = PCBArrayd.Next;