操作系统学年论文
- 格式:doc
- 大小:875.89 KB
- 文档页数:29
1 引言1.1 性质操作系统是计算机科学与技术专业的主要专业基础课和主干课。
操作系统对计算机系统资源实施管理,是所有其他软件与计算机硬件的唯一接口,所有用户在使用计算机时都要得到操作系统提供的服务。
本课程使学生掌握操作系统的基本概念、基本原理、设计方法和实现技术,具有初步分析实际操作系统的能力,训练分析和解决实际问题能力,为其今后在相关领域开展工作打下坚实的基础。
1.2 教学目的本科程通过模拟操作系统原理的实现,应使学生加深对操作系统工作原理和操作系统实现方法的理解,系统科学地受到分析问题和解决问题的训练,提高运用理论知识解决实际问题的能力。
为学生从事科学研究和独立负担计算机及其应用方面的工作打好扎实的基础。
1.3 任务和要求此系统为基于时间片轮转调度算法的进程管理系统,主要实现存储管理,设备管理和进程管理。
存储管理部分主要实现主存空间的分配和回收、存储保护。
设备管理主要包括设备的分配和回收。
进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。
1.4 意义通过本模拟系统的设计,可以加深学生对操作系统的原理的理解,明白操作系统的各项功能的具体实现和具体操作,提高学生的动手能力。
1.5 论文结构安排第2章为系统分析与设计,写出系统要求,分析出包含哪些功能模块、每个模块的计划采用的实现方法和原理。
第3章为系统实现,写出主要模块的实现,包括全局变量说明和主要功能的实现流程。
第4章为结束语,总结课程设计的体会。
2 系统分析与设计2.1 存储管理的要求存储管理部分主要实现主存空间的分配和回收、存储保护。
模拟系统中,采用虚拟页式储管理方案(PCB区域、位示图等单独存放),模拟系统中只管理用户区。
模拟系统中,主存部分分为两部分,一部分是系统区,这里只存放进程控制块(PCB)和主存分配表(位示图),一部分是用户区,这里主要是对用户区的管理:2.1.1 数据结构采用位示图记录主存使用情况,实现主存空间的分配和回收、存储保护。
用数组模拟内存用户区,大小为512字节,每个主存块16个字节(32块)。
2.1.2 页表可以占用内存用户区,也可以放在另外区域或pcb;可以采用预调入策略;页面局部置换算法(在本物理块中选择淘汰页,换入新页);模拟系统中,缺页中断发生在根据根据pc取指令时;2.1.3 初始化初始主存块分配数量自行决定方法,不能分配太多,也不能太少2.1.4 屏幕显示主存使用情况示意图,哪些主存已经分配,哪些主存未分配,以不同的颜色表示(例如,红色表示已分配,蓝色表示未分配)。
正在运行的进程对应指令存放的位置以特殊颜色显示。
2.2 设备管理的要求设备管理主要包括设备的分配和回收。
⑴设备的模拟模拟系统中有A、B、C三种独占型设备,A设备3个,B设备2个,C设备1个。
⑵数据结构因为模拟系统比较小,因此只要设备表设计合理既可。
⑶设备分配采用先来先服务策略。
⑷设备回收回收设备后,要注意唤醒等待设备的进程。
⑸屏幕显示屏幕显示要求包括:每个设备是否被使用,哪个进程在使用该设备,哪些进程在等待使用该设备。
2.3 进程管理的要求进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。
2.3.1 硬件工作的模拟①时钟的模拟。
系统中的绝对时钟和相对时钟用全局变量模拟。
系统时钟用来记录开机以后的时间。
这里的系统时钟并不是计算机的真正的时钟,这里所说的时间只是一个单位,例如使用vb中的时钟控件实现,每触发一次timer事件,绝对时钟增1,表示增加一个时间单位,绝对时钟减1,表减少一个单位时间。
②主要寄存器的模拟用全局变量模拟重要寄存器,如cpu重要寄存器,程序状态寄存器PSW(int 0或1)、寄存器IR,程序计数器PC(int),数据缓冲寄存器DR等。
③中断的模拟中断的发现应该是硬件的工作,这里在函数CPU中加检测PSW的方式来模拟在CPU()函数中,每执行一条指令之前,先检查PSW,判断有无中断,若有进行中断处理,然后再运行解释指令。
模拟中断的种类和中断处理方式:程序结束(执行指令end形成的中断,软中断):将结果写入文件out,其中包括文件路径名和x的值,调用进程撤销原语撤销进程,然后进行进程调度;I/O中断(设备完成输入输出):将输入输出完成的进程唤醒,将等待该设备的一个进程同时唤醒。
时钟中断:进程时间片用完,转为就绪,重新进程调度。
缺页中断:发生在根据根据pc取指令时。
④中央处理器的模拟用函数CPU( )(该函数不能有参数)模拟中央处理器。
该函数主要负责解释“可执行文件”中的命令。
x=?;x++;x--;!??;end.注意:CPU只能解释指令寄存器IR中的指令。
一个进程的运行时要根据进程执行的位置,将对应的指令存放到指令寄存器中。
CPU函数应该不断循环执行的。
Cpu函数应该包括的内容:cpu(){L:检测有无中断,有进行处理If(缺页中断)缺页中断处理;If(进程结束软中断)撤销进程;进程调度;If(输入输出完成)输入输出中断处理;If(时间片到)进程调度根据pc取指令,若pc所指指令在主存,将指令放入IR寄存器;若不在主存,置中断,延时,goto L;执行IR指令;//解释执行课程设计中的指令pc++延时}可以建立一个闲逛进程idle,进程就绪判断正在运行进程是否为idle,是则转向进程调度。
2.3.2 进程控制块进程控制块内容包括进程标识符、主要寄存器内容、进程状态、阻塞原因等等。
本模拟系统最多容纳10个进程块。
pcb区域用数组模拟。
进程控制块根据内容的不同组成不同的队列,空白进程控制块链、就绪队列和阻塞队列,正在运行的进程只有一个,系统初始时只有空白进程控制块链。
2.3.3 进程调度采用时间片轮转调度算法,时间片为5。
进程调度函数的主要工作是:第一步,将正在运行的进程保存在该进程对应进程控制块中;第二步,从就绪队列中选择一个进程;第三步,将这个进程中进程控制块中记录的各寄存器内容恢复到CPU各个寄存器内。
2.3.4 进程创建进程创建的主要工作是:第一步,申请空白进程控制块;第二步,申请主存空间,申请成功,装入主存;第三步,初始化进程控制块;第四步,将进程链入就绪队列,根据情况决定是否转向进程调度。
2.3.5 进程撤销进程撤销的主要工作是:第一步,回收进程所占内存资源;第二步,回收进程控制块;第三步,在屏幕上显示进程执行结果,进程撤销2.3.6 进程阻塞进程阻塞的主要工作是:第一步,保存运行进程的CPU现场;第二步,修改进程状态;第三步,将进程链入对应的阻塞队列,然后转向进程调度。
进程管理2.3.7 进程的唤醒进程唤醒的主要工作是第一步,将进程由阻塞队列中摘下;第二步,修改进程状态为就绪;第三步,链入就绪队列,根据情况决定是否转向进程调度。
2.3.8 屏幕显示屏幕显示要求包括:显示系统时钟;显示正在运行的进程的进程名、运行的指令、中间结果、相对时钟寄存器内容;显示就绪队列中进程名;显示阻塞队列中进程名。
屏幕显示3 系统实现3.1 全局变量系统代码中定义了一些全局变量public struct PCB//===================================进程控制块{public string pcb_name;//进程名public int pcb_num; //进程号public int dr; //数据缓冲寄存器DR 缓存,记录结果public int pc; //程序计数器PC 进程在内存中的起始地址 public int page_adr; //进程页表在内存中的起始地址public int psw; //程序状态字PSWpublic char ax, bx, cx, dx;//指令寄存器IR 当前正在执行的一条指令public int next; //下一个进程编号,建立阻塞队列,就绪队列,空闲队列等之用public char eq; //设备名称public char reason; //设备阻塞原因,reason=A缺少A设备,reason=B缺少B设备,reason=C缺少C设备,"o"表示不缺设备 public int result; //计算结果public int event_time;//使用资源时间public int pstate; //进程状态,pstate=1执行,pstate=2,就绪,pstate=3,阻塞}//====================================================进程控制块public struct queue//=======================队列{public int head;public int tail;}//========================================队列public struct EQUIP//================================设备结构 {public char equ_name;//设备名public int equ_num; //设备号public int flag; //状态标志,1表示占用,0表示空闲}//==================================================设备结构public struct page_table //=============================页表项结构 {public int page_num; //页号public int block_num;//块号public int state; //表示该页是否已经调入内存,"0"表示未调入,"1"表示已调入public int visit; //访问位,最近是否被访问,"0"表示未访问过,"1"表示被访问过public int adress; //外存地址}//====================================================页表项结构 public static int free_bit;//内存空闲块数public static int PC, DR, PA,TIME2;public static int TIME = 5;//时间片public static int PSW = -1;//PSW=-1表示无程序可运行,PSW=0无中断,PSW=1程序结束,PSW=2抢占CPU中断,PSW=3I/O中断public static char AX, BX, CX, DX;//用于保存运行环境public static int fbn = 32;//内存空闲块总数,初始为32public static int time = 0;//表示系统时间public static int pre_block_num=1;//上次分配到的内存块的块号public static int run=-1;//记录对应正在运行的进程控制块的块号,-1表示系统有无进程正在执行public static byte[] memory = new byte[512];//模拟内存,32块public static char[] IR = new char[4];public static PCB[] pcb = new PCB[10];//最多10个进程控制块public static queue ready = new queue();//就绪队列public static queue wait = new queue();//阻塞队列public static queue empty = new queue();//空白PCB队列public static int[] bit_map = new int[32];//位示图1表示占用,0表示空闲public static EQUIP[] eq = new EQUIP[6];//设备数组public static page_table[] pages = new page_table[10];//内存中页表 public static EQUIP[] equipment = new EQUIP[6];//6个设备,用数组表示public int[] ETIME = new int[6]; //各个设备使用一次的时间private List<Label> mm = new List<Label>();//显示内存public List<Label> C = new List<Label>();//显示磁盘Cpublic List<Label> D = new List<Label>(); //显示磁盘Dprivate List<TextBox> ready_disp = new List<TextBox>();//显示就绪队列进程名字private List<TextBox> wait_disp = new List<TextBox>();//显示阻塞队列进程名字private List<TextBox> block_reason_disp = new List<TextBox>();//显示阻塞原因3.2 内存分配虚拟页式存储内存分配时,首先,为作业创建进程;其次,根据输入的作业长度,求出所需内存大小。