模拟操作系统课程设计概要_第1页
模拟操作系统课程设计概要_第2页
模拟操作系统课程设计概要_第3页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

1、一引言1.1性质计算机系统是计算机系统中不可缺少的基本系统软件,计算机系统是由硬件和软件两 部分构成的。操作系统实际上是一个计算机系统中硬、软件资源的总指挥部。能有效的组 织和管理计算机系统中的硬件和软件资源、合理的组织计算机工作流程,控制程序的执行、 并向用户提供各种服务功能,使得用户能够合理、方便、有效的使用计算机,是整个计算 机系统能高效运行的一组程序模块的集合。操作系统在计算机体系中张非常重要的地位。 本课程设计旨在加深对操作系统的认识和理解。通过对操作系统模拟的实现,掌握操作系 统的工作原理和实现方法。提高学生分析问题和解决问题的能力,并提高学生的编程能力。1.2教学目的通过对操作系

2、统模拟的实现,使学生加深对计算机操作系统的认识和理解,掌握操作 系统的工作原理和实现方法。是学生在理论知识应用于实践的过程中,提高学生分析问题 和解决问题的能力。同时也提高学生的编程能力。1.3任务和要求实现操作系统的模拟,此系统为操作系统的模拟,提供命令接口和图形借口。该系统 包括文件管理,实现了磁盘模拟、文件的创建、编辑、移动、复制、删除等功能。单用户 多进程的存储管理、设备管理和进程管理部分。存储管理包括主存分配与回收。设备管理 包括设备的分配与回收。设备分配时采用采用先来先服务策略,设备回收时唤醒等待设备 的进程。进程管理主要包括进程调度,采用时间片轮转法,实现了进程的创建和撤销、进

3、程的阻塞和唤醒和中断。并且以上过程在屏幕上显示。并提供友好的用户使用页面。1.4意义通过对操作系统模拟的实现,加深对计算机操作系统的认识和理解,提高学生把理论 应用与实际的能力。使学生的缝隙问题和解决问题的能力得到提高。为以后的发展打下基 础。1.5论文结构安排第一章 引言 说明本课程设计的性质、教学目的与任务和要求,意义,以及论文结构 安排。第二章系统分析与设计 写出系统要求,分析出包含哪些功能模块、每个模块的计划采用的实现方法和原理第三章 系统实现 写出主要模块的实现,包括全局变量说明和主要功能的实现流程 (按 照模块说)第四章 结束语 总结课程实际的体会二系统分析与设计2.1文件管理文件

4、的逻辑结构文件的逻辑结构采用流式结构,文件的内容均采用文本文件,系统中有两种文件,一 种是存放任意字符的文件(.txt),一种是可执行文件(.exe),可执行文件的内容就是系统内进 程的程序体。可执行文件要包括如下命令:X=?;给i赋值一位数X+ ; i 加 1X- ; i 减 1!?;第一个?为A,B,C中某个设备,第二个?为一位数,表示使用设备的时间end;表示文件结束文件的物理结构文件的物理结构采用索引文件,每个文件分配一个索引块(用来存放索引的盘块)把 分配给该文件的所有盘块号都记录在该索引块中,按照这种分派方式存储的文件就是索引 文件。由于索引块就是一个存放许多盘块号的盘块,因此,为

5、使系统能找到文件存放的地 址,文件目录项记录该文件索引块的盘块号和文件长度。为一个大文件分配磁盘空间时, 如果所分配除去盘块的盘块号,已经装满一索引块时,便需再为该文件分配另一个索引块, 用于将以后继续分配给该文件的盘块号记录其中,以此类推。同时,应为这些索引块再建 立一级索引,即系统再分配一索引块,作为一级索引块的索引块,将第一块、第二块、第 三块、索引块的盘块号写入此索引块中,这样便形成了二级索引的分配方式,如果文 件非常大的时候,还可以用三级、四级索引分配方式。本系统实现二级索引,如图2-1所示:15图2-1文件索引分配方式目录结构目录结构采用树型目录结构。目录项内容(16个字节):目录

6、名、文件名:6个字节;扩展名:3个字节(可执行文件扩展名为exe,目录没有扩展名); 目录、文件属性:1字节;文件长度:2字节(目录没有长度,字节数)。地址:直接地址项1个,一级索引项1个,二级索引1项,每项1个字 节;预留1字节根目录:根目录位置固定,占用磁盘 2块,大小固定,共16项,占用模拟磁盘 第1、2块;子目录;位置不固定,大小不固定目录结构如图2-2所示:图2-2目录结构示意图磁盘模拟磁盘的分配采用混合索引结构的分配方式。系统采用成组链接法记录磁盘空间的使用 情况。空闲块每组登记10个空闲块,专用块占用第0块。索引块中每个盘块号占用4字节,登记32块。如图2-3是空闲块成组链接示意

7、图:用户接口用户接口提供用户命令接口,具体实现以下命令:1. 创建文件:create文件名2. 拷贝文件:copy源文件名 目标文件名 (拷贝文件可同名拷贝,也可更名拷贝)3. 删除文件:delete文件名4. 移动文件:move源文件名 目标文件名(磁盘内和磁盘间文件移动不同,磁盘内的 移动实际只是目录的改变,并不需要真的移动文件;磁盘间的文件移动实际上是先拷贝文 件到目标磁盘,然后再删除源文件。)5. 显示文件:type文件名(仅仅是显示文件内容)6. 编辑文件:edit文件名(此命令完成对文件的编辑,只读文件不可以修改。)7. 改变文件属性:change文件名属性(将文件在只读和非只读、

8、隐藏和非隐藏之间 转换。)8. 磁盘格式化命令:format9. 建立目录:makdir目录名(建立目录,若有同名目录存在,则建立失败。)10. 删除空目录:rdir目录名(只能删除空目录,非空目录不能删除)11. 删除目录:deldir目录名(既可以删除空目录,又可以删除非空目录,对与非空 目录,首先要删除其下文件和目录,然后才能删除其本身。)2.2存储管理存储管理部分主要实现主存空间的分配和回收、存储保护。模拟系统中,内存部分分为两部分,一部分是系统区,这里只存放进程控制块,一部 分是用户区,这里主要是对用户区的管理。系统区包括pcb区域、主存空间分配表。存储管理采用可移动的可变分区存储管

9、理方式。采用数组来模拟主存的用户区,每个数组元素占用一个字节。实验中主存大小为512个字节主存的模拟:采用数组来模拟主存的用户区,每个数组元素占用一个字节,主存大小为512个字节,每个主存块16个字节数据结构:本次实验采用页式管理策略对主存进行分配和回收策略,采用位示图记录 主存使用情况主存分配策略:当有程序要存放入主存时,查看空闲块总数是否够用,如果够用,先 分配一块用来存放页表,然后查位示图中为“ 0”的位,根据查到的位所在的字号和位号 可计算出对应的块号,同时在该位填上占用标志“ 1”,并填写页表;不够用,分配失败。块号=字号*字长+位号主存回收策略:根据页表归还存储空间时,可以根据归还

10、块的块号推算出在位示图中的位置:字号=块号/位示图中字长 位号=块号mod位示图中字长然后把这一位的“ T清成“ 0”,表示该块成为空闲块了,最后回收页表所占用空间。屏幕显示:主存使用情况示意图,哪些主存已经分配,哪些主存未分配,以不同的颜 色表示(例如,红色表示已分配,蓝色表示未分配)。正在运行的进程对应指令存放的位 置以特殊颜色显示。2.3进程管理进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实 现。主要寄存器的模拟用全局变量模拟重要寄存器,如 cpu重要寄存器,程序状态寄存器 PSW指令寄存器 IR,程序计数器PC,数据缓冲寄存器DR等。中断的模拟中断的发现应该

11、是硬件的工作,这里在函数 CPU中加检测PSW的方式来模拟。在CPU ()函数中,每执行一条指令之前,先检查psw/判断有无中断,若有进行中断处理,然后再运行解释指令。CPU函数应该不断循环执行的。模拟中断的种类和中断处理方式:程序结束(执行指令end形成的中断,软中断):将结果写入文件out,其中包括文件路径名和x的值,调用进程撤销原语撤销进程,然后进行进程调度;I/O中断(设备完成输入输出):将输入输出完成的进程唤醒,将等待该设备的一个 进程同时唤醒。时钟模拟系统中的绝对时钟和相对时钟用全局变量模拟。系统时钟用来记录开机以后的时间。这里的系统时钟并不是计算机的真正的时钟,这里所说的时间只是

12、一个单位,例如 使用vb中的时钟控件实现,每触发一次timer事件,绝对时钟增1,表示增加一个时间单 位,绝对时钟减1,表示时间片消耗一个。进程控制块进程控制块内容包括进程标识符、主要寄存器内容、进程状态、阻塞原因等等。本模 拟系统最多容纳10个进程块。pcb区域用数组模拟。进程控制块根据内容的不同组成不同的队列,空白进程控制块链、就绪队列和阻塞队列,正在运行的进程只有一个,系统初始时只有空白进程控制块链。236进程调度采用抢占式优先级调度算法。进程调度函数的主要工作是:将正在运行的进程保存在该进程对应进程控制块中;从就绪队列中选择一个进程;将这个进程中进程控制块中记录的各寄存器内容恢复到CP

13、U各个寄存器内237进程控制建立四个函数模拟进程创建、撤销、阻塞和唤醒四个原语。进程创建create进程创建的主要工作是:第一步,申请空白进程控制块;第二步,申请主存空间,申请成功,装入主存;第三步,初始化进程控制块;第四步,将进程链入就绪队列,根据情况决定是否转向进程调度。进程撤销destory进程撤销的主要工作是:第一步,回收进程所占内存资源;第二步,回收进程控制块;第三步,在屏幕上显示进程执行结果,进程撤销进程阻塞block进程阻塞的主要工作是:第一步,保存运行进程的CPU现场;第二步,修改进程状态;第三步,将进程链入对应的阻塞队列,然后转向进程调度。238进程的创建:进程创建的主要工作

14、是:第一步,申请空白进程控制块;第二步,申请主存空间,申请成功,装入主存;第三步,初始化进程控制块;239进程的撤销:进程撤销的主要工作是:第一步,回收进程所占内存资源;第二步,回收进程控制块;第三步,在屏幕上显示进程执行结果,进程撤销进程的阻塞:进程阻塞的主要工作是:第一步,保存运行进程的CPU现场;第二步,修改进程状态;第三步,将进程链入对应的阻塞队列,然后转向进程调度。进程的唤醒进程唤醒的主要工作是第一步,将进程由阻塞队列中摘下;第二步,修改进程状态为就绪;第三步,链入就绪队列,根据情况决定是否转向进程调度。屏幕显示屏幕显示要求包括:显示系统时钟;显示正在运行的进程的进程名、运行的指令、

15、中间结果、相对时钟寄存器内容;显示就绪队列中进程名;显示阻塞队列中进程名。硬件工作的模拟硬件工作的模拟包括中央处理器的模拟、主要寄存器的模拟、中断的模拟和时钟的模 拟四方面。 中央处理器的模拟。用函数 CPU()(该函数不能有参数)模拟中央处理器。该函数 主要负责解释“可执行文件”中的命令。如:给 x赋值X=?;X自加X+;X自减X-;申请设 备和时间!?;程序结束end;CPU只能解释指令寄存器IR中的指令。一个进程的运行时要根据进程执行的位置,将对应的指令存放到指令寄存器中。 主要寄存器的模拟用全局变量模拟重要寄存器,如cpu重要寄存器,程序状态寄存器PSW指令寄存器IR,程序计数器PC数

16、据缓冲寄存器DR等。 中断的模拟。中断的发现应该是硬件的工作,这里在函数CPU中加检测PSW勺方式来模拟。在CPU()函数中,每执行一条指令之前,先检查PSW判断有无中断,若有进行中断处理,然后再运行解释指令。CPU函数应该不断循环执行的。模拟中断的种类有如下几种:程序结束、时间片到、I/O中断。程序结束(执行指令end形成的中断,软中断):将结果写入文件 out,其中包括文件路径名和x的值,调用 进程撤销原语撤销进程,然后进行进程调度;I/O中断(设备完成输入输出):将输入输 出完成的进程唤醒,将等待该设备的一个进程同时唤醒。时钟中断:进程时间片用完,转 为就绪,重新进程调度。时钟的模拟。系

17、统中的绝对时钟和相对时钟用全局变量模拟。系统时钟用来记录开机以后的时 间。这里的系统时钟并不是计算机的真正的时钟,这里所说的时间只是一个单位, 例如使用vb中的时钟控件实现,每触发一次 timer事件,绝对时钟增 1,表示增加一个时间单位,绝对时钟减1。2.4设备管理设备管理主要包括设备的分配和回收。模拟系统中有A、B、C三种独占型设备,A设备3个,B设备2个,C设备1个。 设备分配:采用先来先服务策略。设备回收:回收设备后,要注意唤醒等待设备的进程。屏幕显示:每个设备是否被使用,哪个进程在使用该设备,哪些进程在等待使用该设 备。三系统实现3.1程序主页面程序主页面如图3-1所示:欢迎西血占闭

18、内存3.2全局变量未占毬禽当幅进隹曲対片cid- til命脅按口»fjc图3-1程序主页面2013/7714 20; 2?; 09public const int n = 10, m = 10;public static Free_table free_table = new Free_table n; public static Used_table used_table = new Used_tablem; public static Used_table buffer = new Used_table n;public static char mm = new char512;

19、模拟内存空闲分区表 已分分区表private List<Label> mems = new List<Label>();内存private List<TextBox> readys = new List<TextBox>(); private List<TextBox> waitsn = new List<TextBox>(); private List<TextBox> waitsr = new List<TextBox>();就绪队列 阻塞名字 阻塞原因public static char us

20、eeq = 'U'public static stri ng a0, a1, a2, a3, a4, a5;public static int running = 1;public static int already = 2;public static int block ing = 3;public static int PC, PSW, DR, TIME, TIME2;public static char AX, BX, CX, DX;public static char IR = new char4;public static PCB pcb = new PCB10;p

21、ublic static queue ready = new queue();就绪队列public static queue wait = new queue();阻塞队列public static queue empty = new queue();空闲 PCB队歹Upublic static int run;public static EQ eq = new EQ6;设备数组public in t ETIME = new in t6; /各个设备的时间public static int time = 0;/表示系统时间public const int min isize = 2;/ 文件p

22、rivate List<Label> memc = new List<Label>();public File_ Fun cti on c = new File_ Function( 0);public static int aaa = 0;public static int bbb = 0;private List<Label> memc = new List<Label>();public File_ Fun cti on c = new File_ Function( 0);public static int aaa = 0;public

23、static int bbb = 0;3.3文件管理创建目录:建立目录首先要找到建立目录的位置(父目录),然后查找该目录是否存在,如果父 目录不存在,不能建立,如果存在,查找是否存在同名目录,存在,不能建立,不存在, 则查找一个空目录项,为该目录项申请一个盘块,并填写目录内容,初始目录有我的电 脑和我的电脑下的磁盘C两个目录。目录创建过程如图3-2所示:图3-2创建一个目录的流程图创建一个目录的命令如图3-3所示:命令接口makdir C:H确认命令接帀图3-3创建一个目录的命令删除空目录:删除空目录首先要找到该目录,如果目录不存在,删除失败;如果存在,但是,是非 空目录,显示不能删除,操作失

24、败;若是空目录,将目录在树形目录和磁盘中删除,如图 3-4所示:开始是非空目录,将空目录在磁盘中删删除失败将空目录项在树形控件中删除结束图3-4删除空目录的流程图删除一个空目录的命令如图3-5所示:命令接口rdir C:H确认命令接亍图3-5删除一个空目录的命令删除目录删除目录是在删除空目录的基础上增加了删除非空目录的功能。首先检查要删除的目 录是否为空,若为空,调用删除空目录的函数,将其删除;若不为空,深度优先遍历以该 目录为根节点的子树,将其孩子节点依次都删除,最后调用删除空目录的函数,将该目录 删除,就完成了删除目录的工作。文件的创建与删除文件的创建与删除,是建立在目录的创建与删除基础之

25、上的。只需要调用建立和删除 目录函数,建立或删除文件目录。然后,将该文件插入到打开文件表中就完成了一个文件 的建立,删除则对应回收操作。文件的建立流程如图3-6所示:建立失败!结束否1是建立失败!F结束 I图3-6新建文件流程图新建一个文件的命令如图3-7所示:命令接口create C : a. txt确认命令接亍图3-7新建一个文件的命令文件的删除流程如图3-8所示:删除失败结束图3-8删除文件流程图删除一个文件的命令如图3-9所示:命令接口delete C : a. txt确认命令接亍图3-9删除一个文件的命令文件的存储建立文件和目录后,要求可以在磁盘上长期的保存。实现文件的长期存储,是通

26、过在 自己电脑的外存上,动态建立文件来实现的,在每次模拟的磁盘有内容的改变的时候,将 内容写到外存的文件一次,当系统再次重新启动的时候,将外存中的文件内容读到模拟磁 盘的数组中,就实现了简单的文件的长期存储,具体代码如下:public File_ Function (i nt tag) _/ TODO:在此处添加构造函数逻辑/建立一个文件或文本文档来模拟磁盘,初始化时如果文件为空,则磁盘第一二块存储FAT表,第三块存储根目录,若文件不为空,则不修改文本。流星操作系统 流星操作系统disk.txt" 建立C盘if (!File.Exists(path)FileStream fs = n

27、ew FileStream(path, FileMode.CreateNew);fs.Seek(0, SeekOrigi n.Begi n);fs.Write(disk, 0, 8192);for (i nt i = 0; i < 3; i+)FATi = 255;for (i nt i = 3; i < 128; i+)FATi = 0;fs.Seek(0, SeekOrigi n.Begi n);fs.Write(FAT, 0, 128);fs.Close();else/从磁盘中提取数据写入FAT表中FileStreamfs = new FileStream(path, Fil

28、eMode.Ope n,FileAccess.Read);fs. Read(FAT, 0, 128);fs.Close();磁盘模拟根据成组连接法,将磁盘的空闲块进行链接,空闲块的分配和回收都是针对专用块来 操作的,没分配一块后,把空闲块数减1,但要把一组中的第一个空闲块分配除去之前应该把登记在该块中的下一组的块号及块数保存到专用快中(原专用块中的信息已经无用, 因为它指示的一组空闲块都已被分配)。当归还一块时,只要把归还块的块号登记到专用 块的当前组中且将空闲块数加1,如果当前组已经满10块,则把专用块中的内容写到归还 的那块中,该归还块作为新组的第一块。空闲块的分配和回收都是针对专用块来操

29、作的,没分配一块后,把空闲块数减1,但要把一组中的第一个空闲块分配除去之前应该把登记在该块中的下一组的块号及块数保 存到专用快中(原专用块中的信息已经无用,因为它指示的一组空闲块都已被分配),如图3-10所示:图3-10分配一个盘快示意图当归还一块时,只要把归还块的块号登记到专用块的当前组中且将空闲块数加1,如果当前组已经满10块,则把专用块中的内容写到归还的那块中,该归还块作为新组的 第一块,如图3-11所示:空闲块数+1把专用块内容写入归还块中归还块号填入(L+空闲块数)单元将归还块号填入专用块的1单元将专用块的0单元置成1I图3-11归还一个盘快示意图磁盘使用情况用文件分配表来记录:磁盘

30、有多少块,该表就有多少项,某文件的一个磁盘块号为i,则这个文件的下一个磁盘块的块号记录在表的第i项。如图3-12是空闲块位示图法示意图:根目录FATFile000400030004000500060007FFFF000500070008FFFF4 1V数据区File PartiFile Part2File Part3图3-12空闲块FAT示意图磁盘的状态在每次分配和回收磁盘块的函数过程中实现,每分配一个空闲块,将相 应label由蓝色改为棕色,表示该磁盘块已经被占用;每回收一块磁盘块的时候,将相应 label由棕色改为蓝色,表示该磁盘块空闲。如图 3-13所示:图3-13磁盘的状态显示3.4用

31、户接口用户接口包括命令接口和图形接口两种,命令接口要求用户输入规定格式的文字命 令,系统判断输入是否正确采取相关操作。图形借口相比于命令接口比较方便,用户不必 输入命令,直接选择菜单项进行操作。用户接口如图3-14所示:命令接口确认命令接亍图3-14用户接口页面命令接口流程图如图3-15所示:结束图3-15命令接口流程图图形接口流程如图3-16所示:开始右击选中要操作的树形节点调用对应函数执行对应的功能:.结束图3-16图形接口流程图3.5进程管理进程管理页面如图3-17所示:图3-17进程管理页面分配内存空间函数:public int allocate© nt t, i nt xk

32、, stri ng str) /采用最优分配算法进行分配,作业名是J,作业大小是xkint i, k, j, a, b;int ad;k = -1;for (i = 0; i < n; i+) /寻找空间大于xk的最小空闲区登记项kif (free_tablei.le ngth >= xk & free_tablei.flag = 1)if (k = -1 | free_tablei.le ngth < free_tablek.le ngth) k = i;if (k = -1)/未找到可用空闲区,返回错误信息return -1;/找到可用空闲区,开始分配,若空闲区大

33、小与要求分配的空间差小于minisize大小,则空闲区全部分配出去,/若空闲区大小与要求的空间差大于mi nisize大小,则从空闲区划出一部分分配。if (free_tablek .len gth <= min isize)free_tablek.flag = 0;ad = free_tablek.address;xk = free_tablek.le ngth; _elsefree_tablek .len gth = free_tablek.le ngth - xk;ad = free_tablek.address;free_tablek.address = ad + xk;/从上往

34、下分 _i = 0;while (!(used_tablei.flag = -1 & i < m)i+;/寻找已分配表的空表目if (i >= m) /没有找到空表目if (free_tablek.flag = 0)/若没有空的已分分区表,则要修改空闲分区表free_tablek.flag = 1;elsefree_tablek.le ngth = free_tablek.le ngth + xk; return -1;else /若找到则修改已分分区表并装入主存 used_tablei.address = ad; used_tablei.le ngth = xk; use

35、d_tablei.flag = t;for (j = 0; j < xk; j+)mmad + j = strj;/改变内存块颜色a = ad / 4;b = xk / 4;for (i = a; i < a + b; i+)memsi.BackColor = Color.Yellow;/修改颜色变回占内存状态/申请内存成功,返回起始地址return ad;当所剩内存不足时会出现报错,如图内存模拟页面如图如图3-19所示内存内存说明空闲内存占用内存运行图3-19内存模拟页面回收内存空间函数:public int reclaim© nt r)int i, k, j, s,

36、t, a, b;int S, L;/寻找已分分区表中的对应登记项s = 0;while (used_tables.flag != r & s < m)s+;if (s >= m)回收失败 没找到进程return 0;used_tables.flag = -1;S = used_tables.address;L = used_tables.le ngth;/修改内存块颜色a = S / 4;b = L / 4;for (i = a; i < a + b; i+)memsi.BackColor = Color.Blue;/修改颜色变回不占内存状态/寻找回收分区的上下邻空闲

37、区,上邻表目k,下邻表目jj = -1;k = -1;i = 0;while (i < n & (j = -1 | k = -1)if (free_tablei.flag = 1)if(free_tablei.address + free_tablei.le ngth= S) k = i;/找到上邻if (free_tablei.address = S + L) j = i;/找到下邻i+;if (k != -1)if (j != -1) /上下都有空闲区,合并三项free_tablek .len gth=free_tablek.le ngthfree_tablej.le ngt

38、h + L;free_tablej.flag = 0;else /上邻空闲区,下邻非空闲区,与上邻合并free_tablek.le ngth = free_tablek.le ngth + L;elseif (j != -1) /上邻非空闲区,下邻空闲区,与下邻合并 free_tablej.address = S; free_tablej.le ngth = free_tablej.le ngth + L;else/上下邻都为非空闲区,回收区域直接填入t = 0;while (free_tablet.flag = 1 & t < n)t+;if (t >= n)used_t

39、ables.flag = r;return 0; free_tablet.address = S; free_tablet.le ngth = L; free_tablet.flag = 1; _ return 1;进程调度函数:采用时间片轮转调度算法,时间片为 5。进程调度函数的主要工作是:第一步,将正在运行的进程保存在该进程对应进程控制块中;第二步,从就绪队列中选择一个进程;第三步,将这个进程中进程控制块中记录的各寄存器内容恢复到CPU各个寄存器内。public int sheduli ng()int i, j, s, h;char a = new char4;if (ready.tail

40、 = -1 & ready.head = -1) /就绪队列中无进程可调度return 0;else /有进程可调度i = ready.head;/记录取走的if (pcbready.head. next = -1)/就绪队列只有一个进程了,取走后为空ready.tail = ready.head = -1;else /就绪队列中不只剩下一个进程ready.head = pcbready.head. next;/显示就绪队列中的进程j = 0;h = ready.head;if (ready.head != -1)/有进程while (pcbh. next != -1)/不是唯一的re

41、adysj.Text = pcbh. name.ToStri ng();h = pcbh. next;j+;readysj.Text = pcbh. name.ToStri ng();j+;for (s = j; s < 10; s+)readyss.Text =""TIME = 5;/设置时间片textBox12.Text = TIME.ToStri ng();timer3.E nabled = true;/控制时间片的/恢复该进程现场信息AX = pcbi.ax;BX = pcbi.bx;CX = pcbi.cx;DX = pcbi.dx;/ PSW = pcbi

42、.psw;PC = pcbi.pc;DR = pcbi.dr;/修改指向运行进程的指针runrun = i; return 1;函数: 中央处理器的模拟。用函数CPU()(该函数不能有参数)模拟中央处理器。该函数主要负责解释“可执行文件”中的命令。如:给 x赋值x=?;x自加x+;x自减x-;申请设 备和时间!?;程序结束end;CPU只能解释指令寄存器IR中的指令。一个进程的运行时要根据进程执行的位置,将对应的指令存放到指令寄存器中 主要寄存器的模拟用全局变量模拟重要寄存器,如cpu重要寄存器,程序状态寄存器PSW指令寄存器IR,程序计数器PC数据缓冲寄存器DR等。 中断的模拟。中断的发现应

43、该是硬件的工作,这里在函数CPU中加检测PSW勺方式来模拟。在CPU()函数中,每执行一条指令之前,先检查PSW判断有无中断,若有进行中断处理,然后再运行解释指令。 CPU函数应该不断循环执行的。模拟中断的种类有如下几种:程序结束、时间片到、I/O中断。程序结束(执行指令end形成的中断,软中断):将结果写入文件out,其中包括文件路径名和x的值,调用进程撤销原语撤销进程,然后进行进程调度;I/O中断(设备完成输入输出):将输入输 出完成的进程唤醒,将等待该设备的一个进程同时唤醒。时钟中断:进程时间片用完,转 为就绪,重新进程调度public void CPU() int a, s;char

44、eq;/没有中断/if (flag1 = 0 & flag2 = 0 & flag3 = 0)if (PSW = 0)if (run = -1)/s = sheduli ng();if (s = 0)/a = 0;textBox3.Text ="textBox4.Text =""textBox5.Text ="" textBox12.Text ="" return;没有运行的进程调度新进程就绪队列为空,调用闲逛进程闲逛进程"else /if ( run != -1)/还有进程AX = mmpcbru

45、 n.pc; /读出指令BX = mmpcbru n.pc + 1;CX = mmpcbru n.pc + 2;DX = mmpcbru n.pc + 3;memsPC / 4 - 1.BackColor = Color.Yellow;/修改颜色变回占内存状态PC = pcbru n .pc + 4;pcbr un .pc = PC; pcbr un .ax = AX; pcbru n.bx = BX;pcbr un .cx = CX;pcbru n.dx = DX;IR0 = AX;IR1 = BX;IR2 = CX;IR3 = DX;/解释指令textBox4.Text=IR0.ToStr

46、i ng()+ IR1.ToStri ng()IR2.ToStri ng() + IR3.ToStri ng();if (IR1='=')DR = (in t)(IR2) - 48;else if (IR1 = '+')DR+;else if (IR1='-')DR-;else if (IR0 = '!')a = (in t)(IR2) - 48; /记录需要占用设备多长时间eq = IR1;AppEquip(eq, ru n, a);/调用设备申请函数else if (IR0 = 'e')if (PSW = 0)

47、 PSW = 1; elsetimer6.E nabled = true;else /非法输入else/有中断时if (PSW = 1)/程序结束int x;x = run;PSW = 0;run = -1;timer3.E nabled = false; textBox4.Text ="处理end中断!"destroy(x); elseif (PSW = 2)/I/O中断归还设备PSW = 0;textBox4.Text =" if (ETIME0 = 0) awake('A',a0);if (ETIME1 = 0) awake('A&#

48、39;,a1);if (ETIME2 = 0) awake('A',a2);if (ETIME3 = 0) awake('B',a3);if (ETIME4 = 0) awake('B',a4);if (ETIME5 = 0) awake(C,a5);else if (PSW = 3) / textBox4.Text =" if (run != -1)/处理I/O中断!"时钟中断处理时钟中断!"刚刚执行完end中断,所以run=-1memsPC / 4 - 1.BackColor = Color.Yellow;/修改

49、颜色变回占内存状态AX = mmpcbru n.pc;BX = mmpcbru n.pc + 1;CX = mmpcbru n.pc + 2;DX = mmpcbru n.pc + 3;PC = pcbru n.pc + 4;pcbr un .ax = AX;pcbru n.bx = BX;pcbr un .cx = CX;pcbru n.dx = DX;pcbr un .pc = PC;pcbru n.dr = DR;/保存现场信息后,把它放到就绪队列的尾部if (ready.tail = -1 && ready.head = -1)/就绪队列为空ready.tail = r

50、eady.head = run;pcbr un . next = -1;else/就绪队列不为空pcbready.tail. next = run;pcbr un . next = -1;ready.tail = run;run = -1;PSW = 0;elsePSW = 0;创建进程函数:进程创建creat的主要工作是:第一步,申请空白进程控制块;第二步,申请主存空间,申请成功,装入主存;第三步,初始化进程控制块;第四步,将进程链入就绪队列,根据情况决定是否转向进程调度。public void create(string str)/创建进程的函数,返回0表示创建失败,返回 1表示创建成功i

51、nt i, j, ad, h, xk;xk = str.Le ngth;char a = new char4;if (empty.tail = -1 & empty.head = -1) /空闲进程快不足,创建进程失败MessageBox.Show("PCB不足10块,创建进程失败!");return;else/有空闲进程控制块,则取出并修改队列内容if (empty.head = empty.tail) /只剩一个空闲进程控制块i = empty.head;empty.head = empty.tail = -1;else/空闲进程控制块不只一个i = empty.head;empty.head = pcbempty.head. next;ad = allocate(i, xk, str); /i作为进程名if (ad = -1)/申请内存失败,归还空闲进程控制块if (empty.tail = -1 & empty.head = -1) /判断空闲队列是否为空empty.tail = empty.head = i; pcbempty.tail. next = -1;elsepcbempty.tail. next = i;pcbi. next = -1;

温馨提示

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

评论

0/150

提交评论