欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    操作系统程序设计操作系统模拟实现.doc

    • 资源ID:2385946       资源大小:184.50KB        全文页数:45页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    操作系统程序设计操作系统模拟实现.doc

    操作系统程序设计操作系统模拟实现 院 系: 计算机科学技术学院软件工程系 班 级: 软件 08 1 班 姓 名: 学 号: 指导教师: 2010 年6月 30日操作系统程序设计任务书一、题目:操作系统模拟实现二、设计要求(1)独立完成(2)良好的交流、沟通能力(3)充分运用前序课所学的软件工程、程序设计等相关知识(4)充分运用调试和排错技术(5)简单测试驱动模块和桩模块的编写 (6)查阅相关资料,自学具体课题中涉及到的新知识。(7)按要求写出课程设计报告,并于设计结束后1周内提交。其主要内容包括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件需求分析、总体设计、详细设计、程序的调试与测试、总结与体会、结束语、程序清单(带中文注释)、参考文献等。三、设计内容及步骤1.根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么。具体要求至少实现进程管理模拟、存储器管理模拟、文件管理模拟,并将几个模块较好地集成一个整体,给出一个较好的用户界面。2.根据实现的功能,划分出合理的模块,明确模块间的关系。3.编程实现所设计的模块。4.程序调试与测试。5.结果分析。程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。6.编写课程设计报告;四、课程设计工作计划2010年6月12日前,指导教师讲课,学生根据题目准备资料,需求分析;2010年6月13日,提交软件总体模块结构图和分工方案;2010年6月13日2009年6月16日,完成程序模块并通过独立编译;2010年6月17日2010年6月20日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行,数据必须存储到磁盘文件中,已备验收;2010年6月22日,验收、开始撰写课程设计报告;2010年6月24日前,提交课程设计报告,并将软件的源文件及报告的word文档打印交到老师办公室里。 指导教师签章: 教研室主任签章 操作系统导教师评语与成绩指导教师评语:课程设计表现成绩: 课程设计验收成绩: 课程设计报告成绩: 课程设计 总成绩: 指导教师签章 2010年 7月 日目录目录I1 概述11.1课程设计目的11.2本次课程设计对今后的影响1二 需求分析22.1. 引言22.1.1功能需求22.1.2编写背景22.2 任务概述22.2.1 目标22.2.2 系统的特点33 总体设计43.1 整体功能图43.2 抽象数据类型定义44 详细设计75 程序的调试与测试85.1 调试分析85.2测试结果86 用户使用说明107总结与体会11程序清单12参考文献401 概述1.1课程设计目的操作系统原理课程设计是软件工程专业实践性环节之一,是学习完操作系统原理课程后进行的一次较全面的综合练习。其目的在于加深对操作系统的理论、方法和基础知识的理解,掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。1.2本次课程设计对今后的影响通过本项课程设计,可以培养独立思考、 综合运用所学有关相应知识的能力,能更好的巩固操作系统原理课程学习的内容,掌握 工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!更加理解了各种操作系统如windows系统、Linux系统等的原理!为后续各门计算机课程的学习和毕业设计打下坚实基础。能方便使用和编写出更好的其他软件。同时增加了同学之间的互帮互助精神!共同学习共同进步! 二 需求分析2.1. 引言2.1.1功能需求 通过一学期的学习慢慢发现操作系统原理课程设计是总结一学期成果的最好方式,是学习完操作系统原理课程后进行的一次较全面的综合练习。其目的在于加深对操作系统的理论、方法和基础知识的理解,掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。是一个不可缺少的环节。2.1.2编写背景经过一个学期的操作系统原理课程的学习,我们学到了很多理论上的知识,对操作系统及其各方面的功能有了深刻的认识,但这是远远不够的,我们要讲理论编程实践,虽然我们学习期间做过很多的实验,但是都是针对操作系统的某一块具体的功能的,我们对了解了每块具体的功能的实现,但是,整体说来还是模糊,所以,很有必要将各个模块整合起来,也就是模拟一个操作系统,这样,不仅跟深入学习了各个模块,更认识了一个完整的OS,对我们来说受益匪。2.2 任务概述2.2.1 目标 至少实现进程管理模拟、存储器管理模拟、文件管理模拟,并将几个模块较好地集成一个整体,给出一个较好的用户界面。进程管理模拟:在多道程序运行环境下,进程数目一般多于处理机数目,是的进程要通过竞争来使用处理机。这就要求系统能按某种属案发,动态的把处理机分配给就绪队列中的一个进程,使之运行。进程调度的功能就是从就绪队列中挑选一个进程到处理机上运行。存储器管理模拟:主存是中央处理器直接存取指令和数据的存储器,能否合理的利用主存,在很大程度上将影响到整个计算机系统的性能。在多道作业和多进程环境下,共享主存空间。当作业执行完毕或进程运行结束后将主存空间归还系统。文件管理模拟:用于用户界面和操作命令在操作系统中的作用,实现操作系统中对文件的管理。2.2.2 系统的特点 本次可设主要是简单的模拟一个操作系统,包括一个主界面,实现了银行家算法、模拟文件管理、主存空间的分配与回收、进程调度等功能。模拟了操作系统的进程管理、文件管理、存储器管理。银行家算法,包括了新加作业、申请资源、撤销作业、查看资源情况四个模块。如果申请资源后系统进入不安全状态,则申请失败。进程调度实现了调度进程的三个主要算法优先数、先来先服务、时间片轮转法。其中,优先数算法中优先数的确定为(50-进程的服务时间),每轮一次优先数-3。时间片轮转法的时间片由用户自己输入。存储器管理实现了申请空间、撤销作业、显示空闲表等功能。如果空闲空间不足则申请失败。模拟文件管理很全面,包含了创建目录、删除目录、改变目录、创建文件、删除文件、显示目录的功能。另外,我还加了回到根目录的功能 3 总体设计3.1 整体功能图银行家算法进程调度存储器管理退出主界面新加作业申请资源撤销作业查看资源优先数时间片轮转先来先服务申请空间撤销作业显示空闲表改变目录创建目录创建文件删除文件删除目录显示目录模拟文件管理帮助3.2 抽象数据类型定义银行家算法:const int MAX_P=20; / 进程的最大容量const int MAXA=10; / A类资源的最大数量const int MAXB=5; /B类资源的最大数量const int MAXC=7; /C类资源的最大数量typedef struct anode int a,b,c,/*三种资源总数*/remain_a,remain_b,remain_c/*三种资源剩余数*/; bank;typedef struct node1 char name20; int a,b,c,need_a,need_b,need_c; process; / 进程的结构体结点模拟文件管:typedef struct bnode char name50; int type;/*0代表目录,1代表普通文件*/ struct bnode *next,/* 兄弟节点*/*sub,/*第一个子节点*/*father/*父节点*/; int size; /*文件的大小*/dirnode;dirnode *workdir;/当前工作目录 dirnode root;/根目录 char path100;/定义路径信息 const int MAXJOB = 100;/定义最大记录数存储器管理:首先需要建立空闲区数据文件,空闲区数据文件包括若干行,每行有两个字段:起始地址,内存块大小(均为整数),各自段一逗号隔开。空闲区数据文件:0,1010,0818,1028,0634,1044,09空闲表的结构:typedef struct cnodeint start;int length;char tag20;job; job freesMAXJOB;/定义空闲区表 int free_quantity;job occupysMAXJOB;int occupy_quantity;进程调度:进程存在的标识是进程控制块(PCB),进程控制块结构如下:typedef struct dnode char name10; int prio; int round; int cputime; int needtime; int count; char state; struct dnode *next;PCB; / 进程的PCBPCB *finish,*ready,*run,*r;4 详细设计基本操作:银行家算法:银行家算法主要由5个函数实现了四大功能,即新加作业、为作业申请资源、撤销作业、查看资源情况。void yinitial() /初始化函数void add() / 新加作业函数void bid() /为作业申请资源void yfinished()/撤销作业void yview()/查看资源情况模拟文件管理:模拟文件管理实现了很多功能,当然也有很多函数,每一个文件和目录都是用一个节点来描述的,用type来控制,有两个值,0和1,0代表目录,1代表普通文件void minitial() /初始化目录函数dirnode * init() /初始化新节点的函数void CD(char dirname) /改变目录void CREATE(char filename,int filesize) /创建文件void DEL(char filename)/删除文件void dir(dirnode *p) /现实所有目录,本目录下所有兄弟目录和文件void dirs(dirnode *p,char str)/显示由目录下子目录中的文件和目录void LSALL()/显示所有目录void MD(char dirname)/创建目录void RD(char dirname)/删除目录进程调度:void firstin()/调度进程使之运行void prt1(char a)/*void prt2(char a ,PCB *q)void prt(char algo)*/上面的三本分主要是显示出来进程的调度情况void insert1(PCB *q)/插入新的进程void creat1(char alg)/* void creat2(char alg)*/以上两个实现进程的创建void priority(char alg)/优先数算法的实现void roundrun(char alg)/时间片轮转法的实现void FCFSrun(char alg)/先来先服务算法的实现void xianshi()/显示主界面的函数void yinhangjia()/主函数掉该函数实现银行家算法void wenjianguanli()/主函数调度该函数实现文件管理void zhucunkongjian()/主函数调度该函数实现存储器管理void jinchengdiaodu()/主函数调度该函数实现进程调度5 程序的调试与测试5.1 调试分析(1)在试验过程中遇到了很多错误,最开始的时候,在将各个模块连接起来的时候几个函数的名字一样,出现了错误,如图: 图 1-1后来将函数的名字都改变了一下。(2)在主函数中将各个模块的主函数连起来的时候,退出来的时候整个程序就结束了,而我是想推出来的时候是退回到主界面,后来又给改了一下,加了一个while循环,还有变量flag,有flag来控制,当flag=0的时候就跳出while循环,然后清屏,掉一个编好的显示函数,显示主界面,这样就退回了主界面,后来又发现主函数有很多东西,很乱,我又将每个模块的主函数部分又分出去一个函数,这样主函数掉每个模块的原来的主函数部分就好了。5.2测试结果主界面:图1银行家算法:图2模拟文件管理:图3主存空间分配与回收:图4进程调度: 图5帮助:图6 6 用户使用说明 本次的实验主要是模拟一个操作系统,当运行的时候会出现一个主界面,上面列出了该系统主要实现的功能,可以根据提示选择1.、应行家算法2、模拟文件管理3、贮存空间的分配与回收4、进程调度 5、退出系统。选择完后就进入该模块,如果选择的是1即银行家算法,进去后界面也会有提示,1、新加作业,2,、为作业申请资源3、撤销作业4、查看资源情况、0退出系统,选择你想要操作的。会提示你相应的操作。如果选择的是2即模拟文件管理,进入后也有界面给予提示,但是这个模块有先后顺序,即应该先创建目录,之后在进行其他操作,我还加入了一个额外的功能,如果输入cd . 就会回到上一级目录里。如果选择的是3,即存储器管理,这个模块首先要在改程序在同一目录下建立一个空闲表,进入该模块后首先要输入改空闲表,例如,input.txt,如果该空闲表存在的话就会继续往下进行,根据提示做想要实现的操作。如果选择的是4,即进程调度,进入后可以选择P、优先数算法,R、时间片轮转法 F、先来先服务算法、E退出时间片轮转法的时间片由用户来定。这些模块中的退出都是退到主界面的,要想退出本系统,在主界面里有一个退出。7总结与体会这次课程设计对我来说获益很大、体会很深,通过这次课程设计将所学的操作系统课程的知识用于实践,对所学的知识有了系统的了解、更深刻。在将各个模块连起来过正中首先要对各个模块都深入了解,不仅复习了所学的,以前不明白的现在明白了好多,而且对“操作系统”不再陌生,但是“操作系统“所要做的绝不是这么少的,所学的这些是远远不够的,希望还能有更深的了解。这次课程设计给我了很大的启示:无论学什么都要一步一个脚印,不能前面开始学很有劲头,后面就松懈了,要持之以恒。感谢老师耐心的教导,您认真的态度让很多人“畏惧”,但对我来说是提升自身,我想我的“操作系统”之路还没走完,会有更深入的学习。再次感谢老师!程序清单#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>using namespace std;typedef struct node char name10; int prio; int round; int cputime; int needtime; int count; char state; struct node *next;PCB;PCB *finish,*ready,*run,*r;int N;/以上是进程调度结构体 const int MAX_P=20;const int MAXA=10;const int MAXB=5;const int MAXC=7;typedef struct nodee int a,b,c,/*三种资源总数*/remain_a,remain_b,remain_c/*三种资源剩余数*/; bank;typedef struct node1 char name20; int a,b,c,need_a,need_b,need_c; process;bank banker;process processesMAX_P;int quantity;/作业的数量 /以上是银行家算法结构体 const int MAXJOB = 100;/定义最大记录数typedef struct nodezint start;int length;char tag20;job; job freesMAXJOB;/定义空闲区表 int free_quantity;job occupysMAXJOB;int occupy_quantity;/以上是主存空间分配回收结构体 typedef struct nodem char name50; int type;/*0代表目录,1代表普通文件*/ struct nodem *next,/* 兄弟节点*/*sub,/*第一个子节点*/*father/*父节点*/; int size; /*文件的大小*/dirnode;dirnode *workdir;/当前工作目录 dirnode root;/根目录 char path100;/定义路径信息 /以上是模拟文件管理 void firstin() run = ready; run->state = 'R' ready = ready->next;void prt1(char a) if(a='P'|a = 'p') printf("进程号 cpu时间 所需时间 优先数 状态n"); else if(a ='r'|a ='R') printf("进程号 cpu时间 所需时间 记数 时间片 状态n"); else if(a='f'|a='F') printf("进程号 所需时间 状态n");void prt2(char a ,PCB *q) if(a='P'|a = 'p') printf("%-10s%-10d%-10d%-10d%cn",q->name,q->cputime,q->needtime,q->prio,q->state); else if(a = 'r'| a = 'R') printf("%-10s%-10d%-10d%-10d%-10d%cn",q->name,q->cputime,q->needtime,q->count,q->round,q->state); else if(a='f'|a='F') printf("%-10s%-10d%cn",q->name,q->needtime,q->state);void prt(char algo) PCB *p; prt1(algo); if(run != NULL&& !(algo = 'r'|algo ='R')/这个对RR不适应! prt2(algo,run); p = ready; while(p != NULL) prt2(algo,p); p = p->next; p = finish; while(p != NULL) prt2(algo,p); p = p->next; getchar();void insert1(PCB *q) PCB *p1,*s,*r; int b; s = q; p1 = ready; r = p1; b = 1; while(p1 != NULL)&&b) if(p1->prio >= s->prio) r = p1; p1 = p1->next; else b = 0; if(r != p1) r->next = s; s->next = p1; else s->next = p1; ready = s; void creat1(char alg) PCB *p; int i,time; char na10; ready = NULL; finish = NULL; run = NULL; printf("输入进程号和运行时间:n"); for(i = 1; i <= N; i+) p = (PCB *)malloc(sizeof(PCB); scanf("%s",na); scanf("%d",&time); strcpy(p->name,na); p->cputime = 0; p->needtime = time; p->state = 'W' p->prio = 50-time; if(ready != NULL) insert1(p); else p->next = ready; ready = p; /clrscr(); if(alg ='p'|alg ='P') printf(" 优先数算法输出信息:n"); else printf(" 先来先服务算法输出信息:n"); printf("*n"); prt(alg); run = ready; ready = ready->next; run->state = 'R'void creat2(char alg) PCB *p; int i,time,round; char na10; ready = NULL; finish = NULL; run = NULL; printf("请输入时间片:"); scanf("%d",&round); printf("输入进程号和运行时间:n"); for(i = 1; i <= N; i+) p = (PCB *)malloc(sizeof(PCB); scanf("%s",na); scanf("%d",&time); strcpy(p->name,na); p->cputime = 0; p->needtime = time; p->state = 'W' p->count = 0; p->round = round; p->next = NULL; if(i = 1)/*按顺序插入到ready链表中*/ r = ready = p; else r->next = p; r = p; /clrscr(); printf(" 时间片轮转算法输出信息:n"); printf("*n"); prt(alg);void priority(char alg) while(run != NULL) run->cputime += 1; run->needtime -= 1; run->prio -= 3; if(run->needtime = 0) run->next = finish; finish = run; run->state = 'F' run = NULL; if(ready != NULL) firstin(); else if(ready != NULL) && (run->prio < ready->prio) run->state = 'W' insert1(run); firstin(); prt(alg); void roundrun(char alg)bool flag;/当ready列里只有一个时做标记 while(N) flag = 1;/初始化为1 run = ready;/run每次运行ready的队头 run->count+;/没运行一次计数器加1 if(run->needtime < run->round)/当剩余时间小于时间片轮转时间时的情况 run->cputime += run->needtime; run->needtime = 0; else run->cputime += run->round; run->needtime -= run->round; run->state = 'W'/变为等待 if(ready->next != NULL) ready = ready->next; else flag = 0;/当ready剩一个时做标记 if(run->needtime = 0)/当run结束时放入finish队列里 run->next = finish; finish = run; run->state = 'F' N-;/进程数少1 else if(flag)/执行完如果不是剩一个的话,就把run放到队尾 r->next = run; r = run; r->next = NULL; if(N)ready->state = 'R'/结束时不应该有'R" else ready = NULL;/结束时应该为空 prt(alg);/输出 void FCFSrun(char alg) PCB *p; while(run!=NULL) run->cputime += run->needtime; run->needtime =0; run->next = finish; finish = run; run->state = 'F' run = NULL; if(ready!=NULL) firstin(); prt(alg); void Process() system("cls"); printf(" *欢迎进入进程调度算法页面*n"); printf(" 1.优先数算法 2.时间片轮转算法n"); printf(" 3.先来先服务算法 0.安全退出 n"); printf(" *n"); printf(" 请在03之间选择 :"); void ProcessControl() int x,flag = 1; char alg; while(flag) Process(); scanf("%d",&x); if(x !=0) printf("输入进程数:"); scanf("%d",&N); switch(x) case 1:alg = 'p'creat1(alg);priority(alg);break; case 2:alg = 'r'creat2(alg);roundrun(alg);break; case 3:alg = 'f'creat1(alg);FCFSrun(alg);break; case 0:flag = 0;break; default:printf("输入有误,请在03之间选择:n");break; /初始化函数void Initial() int i; banker.a=MAXA; banker.b=MAXB; banker.c=MAXC; banker.remain_a=MAXA; banker.remain_b=MAXB; banker.remain_c=MAXC; for(i=0;i<MAX_P;i+) strcpy(processesi.name,""); processesi.a=0; processesi.b=0; processesi.c=0; processesi.need_a=0; processesi.need_b=0; processesi.need_c=0; /新加作业void add() char name20; int flag=0,t,need_a,need_b,need_c,i; cout<<endl; cout<<"新加作业" <<endl; cout<<"-"<<endl; cout<<"请输

    注意事项

    本文(操作系统程序设计操作系统模拟实现.doc)为本站会员(laozhun)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开