




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一章:设计内容及要求一、课程设计的目的本课程是操作系统课程的重要组成部分,通过本课程的学习,使学生能更进一步地理解操作系统的设计和实现思路。掌握操作系统主要原理和算法。培养学生的实际运用操作系统原理分析解决问题的能力。二、课程设计的题目1. 进程管理仿真程序设计三、设计内容(一)进程管理仿真程序设计1.基本要求:设计一个仿真程序,仿真进程管理的五大功能,包括创建进程,用新进程替换当前进程映像,进程状态转换,进程调度,上下文切换。2.创新要求在基本要求达到后,可以进行创新设计。3.设计方法和基本原理 设计一个PCB数据结构,该结构包含进程的所有信息,如进程号pid ,父进程号ppid,进程优先数,进程运行时间,进程时间片,程序计数器值,累加器值等。 设计一个kernel程序,该程序分配一个大的内存空间,用于存放模拟进程。 在kernel中设计一个解释函数,解释执行模拟程序中的语句。 设计一个命令解释程序,接收用户命令,发送给kernel。 在kernel中设计一个调度函数,调度模拟程序执行。 在kernel中设计一个上下文切换函数,负责模拟程序的切换。Kernel中设置一个定时器,负责处理时间片。用伪指令编写系统信息程序和用户测试程序。 第二章:设计说明一、问题描述:系统由4种程序组成,它们是进程管理程序(kernel)、命令解释程序(commander)、系统信息程序( reporter)、用户程序(Application)。系统内有3种进程(下称模拟进程),它们是: 命令解释进程(commander),系统信息进程( reporter),用户进程(Application)。Kernel程序首先运行。Kernel启动后,创建commander进程。Kernel程序根据需要创建reporter进程和Application进程。Kernel负责维护6个数据结构,包括时间 (Time), 处理器状态(CPUstate),进程表 (PCBTable), 就绪队列(ReadyState),等待队列(BlockedState),运行进程(RunningState)。系统采用时间轮转和优先级调度混合算法。优先级以优先数表示,优先数越大则优先级越高。调度时,就绪队列中优先数最大的进程优先运行,相同优先数进程按FIFO方式调度。进程运行一个时间片以后,其优先数数减1(即降低一级);进程在就绪队列中等待3个时间片以后,其优先数加1。二、方案设计: 设计一个PCB数据结构,该结构包含进程的所有信息,如进程号pid ,父进程号ppid,进程优先数,进程运行时间,进程时间片,程序计数器值,累加器值等。 设计一个kernel程序,该程序分配一个大的内存空间,用于存放模拟进程。 在kernel中设计一个解释函数,解释执行模拟程序中的语句。 设计一个命令解释程序,接收用户命令,发送给kernel。 在kernel中设计一个调度函数,调度模拟程序执行。 在kernel中设计一个上下文切换函数,负责模拟程序的切换。Kernel中设置一个定时器,负责处理时间片。用伪指令编写系统信息程序和用户测试程序。三、设计分析:代码解释:1. 创建简单虚拟内核其实,若只考虑功能实现,我们完全可以不定义虚拟CPU。所以,为了简单又简单,我们不定义虚拟CPU,而直接通过进程PCB进行计算。但这不便于同学们理解上下文切换。有兴趣的同学可以考虑定义一个虚拟CPU(参见“虚拟内核(含虚拟CPU)设计提示.doc”)。编写编译程序:(1)定义指令#define MOV 01 /传送指令:立即数赋值给寄存器A#define ADD 02 /加法指令:寄存器A加立即数#define OUT 80 /输出指令: 寄存器A的值输出到端口(端口号01-表示显示器)2. 定义PCB结构typedef struct short A; /寄存器Aint PC; /程序计数器PCchar *addr;/程序加载起始地址int length;/程序大小PCB;#define MAX_PID 10 /假设系统可同时运行10个进程PCB pcbsMAX_PID; /定义PCB结构数组,用于存放所有的PCB3. 定义系统变量定义一个全局变量作为系统变量:int cur_pid; /当前_进程号初始化:cur_pid=0;4. 加载用户程序打开字节码文件,求字节码文件长度。获取当前进程的PCB: PCB *pcb=pcbs+cur_pid;分配加载内存:pcb-addr=(char *)malloc(字节码文件长度);字节码文件读入到pcb-addr;登记加载信息:pcb-A=0; pcb-PC=0; pcb-length=字节码文件长度;5. 编写执行指令的函数获取当前进程的PCB: PCB *pcb=pcbs+cur_pid;在pcb-addr+pcb-PC所指的单元取指令,执行该指令。修改程序计数器:pcb-PC+=刚才执行的指令长度;比如,假设PC所指的字节码为020F00。可以这么些执行代码:short op_data; /注意,操作数为16位整数,所以要定义为shortchar cmd;cmd= *(pcb-addr+pcb-PC); /取指令if(cmd=0x02) /执行指令op_data= *(short*)(pcb-addr+pcb-PC+1); /取操作数pcb-A+= op_data; /操作数加到寄存器Apcb-PC+=3;/修改程序计数器,使之指向下一条指令5. 扩展PCB结构添加新的结构成员typedef struct int A; /寄存器Aint PC; /程序计数器PCchar *addr;/程序加载起始地址int length;/程序大小/以下为新增成员int pid;/进程号,值-1MAX_PID,-1表示无进程int ppid;/父进程号int gpid;/进程组号char state;/进程状态:01-新建,02-就绪,03-运行, 04-等待,/ 05-完成int slice;/时间片大小。为了简单,假设为“指令条数/时间片”int B; /寄存器Bint F; /寄存器Fchar *addr;/程序加载起始地址char priority;/优先数, 值为0-31,其中31为最高级char last; /上次运行的时间,调度时要用此时间PCB;6.扩展系统变量增加两个全局变量,作为系统变量:int max_pid; /最大_进程号unsigned int tick; /时间嘀嗒数,假设每条指令占一个机器周期,嘀嗒一次/= 下面3个变量暂不使用 =long intf; /中断标志(可管理32个中断)/以下成员先暂时定义为字节流,以后要把它们改为结构体char *sys_stack;/系统栈,存放系统参数。char *usr_stack; /用户栈,存放用户私有数据,如存放函数参数,返回地址等等。char *signal;/信号,暂时这样定义,以后要把它改为结构体/= 下面3个变量暂不使用 =初始化:max_pid=0; tick=0;7.优先级设计for(int p=0;ppriority-=2;elsepcbx-priority+=2;for(int j=0;jstate=0) coutendl; cout进程j+1的优先级为:priorityendl; else coutendl; cout进程j+1已经结束!endl; 8.进程按优先级调度运行while(1)cur_pid=0; for(int q=0;qprioritypriority) cur_pid=q;PCB *pcb=pcbs+cur_pid;for(int i=0;iclise;i+)exeInstruction(cur_pid);/执行指令 if(pcb-PC=pcb-length)/执行完毕 if(pcb-state=0) pcb-state=1; /标志位置1,表示进程结束 pcb-priority=0; /优先级置0 delete pcb-addr;/回收内存 flag+; int z; coutz; if(z=1) system(cls); if(flag=argc-1) return 0;第三章:测试1.用户设计各进程的优先级和时间片:2.程序按各进程的优先级完成调度:本次运行进程所用时间片以及显示全部进程状态3.运行过的进程优先级减少2,其他进程优先级增加2总测试效果:第四章:总结 这次的程序设计和以往的不同,原来的课程设计主要是了解题目要求,然后自己按自己的思路设计的自己的算法编写代码即可,但是这次要按照操作系统本来的逻辑编写,初始有点不太适应,但是经过对题目的分析,发现固然这次的题目固定了我们的算法,但是也同时使得设计更加简便,只要按照本来固有的逻辑,即可编写出合理的程序,在程序编写当中也遇到了一系列的问题,但是主要是由于自己对操作系统掌握不够清楚,最后通过最操作系统书本的复习和与同学们的讨论顺利完成了这次的课程设计,收获颇丰。但是也从中了解到了自己的不足之处,就是对原有逻辑运用不够熟练的问题,有待改善!此次课程设计让我学到了一些知识,对专业知识有了更深一层次的理解,增强了以后学习的信心,同时也发现我还有很多知识要学习,我要更加努力! 参考文献1 孙钟秀 操作系统概念(第4版). 北京:高等教育出版社,2010.2 王万森等. 计算机操作系统原理. 北京: 高等教育出版社, 20013 李大友主编,操作系统,北京:机械工业出版社,2000源代码#ifndef _COMPILER_H_#define _COMPILER_H_#include iostream.h#include string.h#include stdio.h/把源程序编译为字节码程序#include cpl.hchar * getcmd(char *buf,char *one)int i=0; /形参buf的下标int j=0; /形参one的下标while(1)while(bufi=0x20 | bufi=0x0d) i+; /去掉空格和换行符if(bufi=0x0a) i+; break; /指令以回车结束onej=bufi; /复制指令i+; j+; /修改下标,准备下一字节onej=0; /添加结束符return buf+i; /返回指令流余下的部分int main(int argc, char *argv)if(argc!=3) /判断命令行参数个数是否为3cout命令错。n命令用法:cpl 源程序文件名 字节码文件文件名n;return -1;FILE *fin; /流文件结构char *buf; /读缓冲fin=fopen(argv1,rb); /打开源程序文件if(fin=NULL) /若打开失败cout找不到源文件。;return -1;fseek(fin,0L,SEEK_END); /读写指针移到文件末尾long fsize=ftell(fin); /求文件长度fseek(fin,0L,SEEK_SET); /读写指针移到文件开头buf=new charfsize; /分配读缓冲fread(buf,1,fsize,fin); /文件读入buf中FILE *fout; /流文件结构fout=fopen(argv2,wb); /打开源程序文件if(fout=NULL)/若打开失败cout=fsize-2) break; /若到达文件尾,则跳出循环delete buf;fclose(fin);fclose(fout);return 0;*#ifndef _VIRTUAL_KERNEL_#define _VIRTUAL_KERNEL_#include iostream.h#include string.h#include stdio.h#define NOP 00/空指令: 消耗一个机器周期#define MOV 01 /传送指令:立即数赋值给寄存器A#define ADD 02 /加法指令:寄存器A加立即数#define OUT 80/输出指令: 寄存器A的值输出到端口(端口号01-表示显示器)#define JMP 10 /跳转指令 : 程序跳转到 相应地方执行 #define AND 11 /与指令: 操作数与寄存器 A 相与 结果放到 A 中 #define OR 12 / 或指令: 操作数 与寄存器 A 相或 结果放到 A 中 #define EXT 20 /系统调用 指令: 程序结束 #define MUL 30 /乘法指令: 操作数与寄存器 A 相乘 结果放到 A 中#define INC 31 /自加 1 指令 : 寄存器 A 值 加 1#define SUB 32 /减法指令 : 寄存器 A 的值 减去 操作数的 值 结果保存到 A 中 #define MAX_PID 10/系统并发运行的进程数的最大值/定义PCB结构类型typedef struct int A;/累加器A int PC;/程序计数器PC char *addr;/程序加载起始地址 int length;/程序大小 /以下为新增成员 int pid;/进程号,值-1MAX_PID,-1表示无进程 int ppid;/父进程号 int gpid;/进程组号 char state;/进程状态:01-新建,02-就绪,03-运行, 04-等待, / 05-完成 int slice;/时间片大小。为了简单,假设为指令条数/时间片 int B; /寄存器B int F; /寄存器F /char *addr;/程序加载起始地址 int priority;/优先数, 值为0-31,其中31为最高级 char last; /上次运行的时间,调度时要用此时间PCB;int cur_pid;/当前_进程号PCB pcbsMAX_PID;/进程控制块数组int max_pid; /最大_进程号unsigned int tick; /时间嘀嗒数,假设每条指令占一个机器周期,嘀嗒一次void initSystem(void); /初始化系统int loadProgram(char *name);/加载应用程序int exeInstruction(int pid);/执行指令#endif*#include vknl.h#include /初始化系统void initSystem(void)cur_pid=0; max_pid=0; /最大_进程号 tick=0; /时间嘀嗒数,假设每条指令占一个机器周期,嘀嗒一次/加载应用程序int loadProgram(char *name)FILE *fin=fopen(name,rb); /打开源程序文件if(fin=NULL) return -1;/若打开失败,返回-1fseek(fin,0L,SEEK_END); /文件读写指针移到文件末尾long fsize=ftell(fin); /求文件长度fseek(fin,0L,SEEK_SET); /读写指针移到文件开头PCB *pcb=pcbs+cur_pid;/获取当前进程PCBpcb-addr=new charfsize; /为新进程分配内存fread(pcb-addr, fsize, 1, fin); /程序读入内存fclose(fin); /关闭文件pcb-length=fsize;/进程大小pcb-A=0; /初始化寄存器pcb-PC=0;pcb-slice=(cur_pid+1)%4 + 1;pcb-priority=31;return 0; /正常返回/执行指令int exeInstruction(int pid)PCB *pcb=pcbs+cur_pid;/获取当前进程PCBchar op_cmd=*(pcb-addr+pcb-PC); /取操作码short op_dat=*(short*)(pcb-addr+pcb-PC+1); /取操作数/注意,我们约定操作数是16位整数,所以要定义为short。/printf(%d %d %dn,cur_pid,op_cmd,op_dat);if(op_cmd=MOV)/传送指令1pcb-A=op_dat;/操作数赋给累加器Aelse if(op_cmd=ADD)/加法指令2pcb-A+=op_dat;/加计算else if(op_cmd=OUT)/输出指令3 printf(%dn, pcb-A);/输出累加器A的内容else if(op_cmd=JMP) /执行跳转指令 即将pc的值改为op_dat的值 4 pcb-PC=op_dat-3; else if(op_cmd=EXT) /执行系统调用 exit()指令 推出 程序5 exit(0); else if(op_cmd=AND) /执行 与操作 与 A 与 结果存入 A 中6 pcb-A=pcb-A&op_dat; else if(op_cmd=OR) /执行 或操作 或 A 或 结果存入 A 中 7 pcb-A=pcb-A|op_dat; else if(op_cmd=NOP) /执行 或操作 或 A 或 结果存入 A 中 8 pcb-A=pcb-A; else if(op_cmd=INC) /执行 或操作 或 A 或 结果存入 A 中 9 pcb-A=pcb-A+1; else if(op_cmd=SUB) /执行 或操作 或 A 或 结果存入 A 中 10 pcb-A=pcb-A-op_dat; else if(op_cmd=MUL) /执行 或操作 或 A 或 结果存入 A 中 11 int a=pcb-A; for(int i=0;iA=pcb-A+a; pcb-PC+=3;/修改程序计数器return 0;/正常返回int main(int argc, char *argv)/argc参数个数 argv存放字符串initSystem();/初始化系统int load=0;for(load=1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年纺织品市场动态分析试题及答案
- 国际美术设计师考试知识点回顾试题及答案
- 2024年助理广告师考试知识图谱试题及答案
- 社工比赛面试题及答案
- 2024年纺织品检验员复习计划试题及答案
- 2024年纺织品设计师证书备考中的经验借鉴试题及答案
- 潍坊化学初中试题及答案
- 2024年纺织品设计师的工作愿景考题及答案
- 精雕细琢2024国际商业美术设计师试题及答案
- 体能教练测试题及答案
- 2025-2030中国纳米银网行业市场现状供需分析及投资评估规划分析研究报告
- 人教版小学数学六年级下册说课稿
- 初中生物尿液的形成和排出课件 2024-2025学年冀少版生物七年级下册
- 2025年广东省广州市华兴教育港澳台联考学校高考英语二模试卷
- 危重患者风险评估与安全护理体系
- 车务调车合同协议
- (四调)武汉市2025届高中毕业生四月调研考试 历史试卷(含答案)
- 俗世奇人试题及答案
- 儿童肺血栓栓塞症诊断与治疗专家共识(2025)解读课件
- 苏霍姆林斯基的教育思想
- 2025年内蒙古自治区中考一模语文试题(原卷版+解析版)
评论
0/150
提交评论