《广工操作系统实验报告(共58页).doc》由会员分享,可在线阅读,更多相关《广工操作系统实验报告(共58页).doc(58页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上成绩 操作系统实验报告学 院 计算机学院 专 业 软件工程 学 号 姓 名 指导教师 日 期 2014年7月 实验一:进程调度实验题目11.实验要求: 编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对五个进程进行调度。2、 实验原理 “最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。 静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。 动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。例如:在进程获得一次CPU后就将其优先数减少1。或者,进程等待的时间超过某一时限时增加其
2、优先数的值,等等3、 流程图 4、 源代码#include stdio.h#include #include #define getpch(type) (type*)malloc(sizeof(type)/#define NULL 0struct pcb /* 定义进程控制块PCB */ char name10; char state; int super; int ntime; int rtime; struct pcb* link;*ready=NULL,*p;typedef struct pcb PCB;void sort() /* 建立对进程进行优先级排列函数*/ PCB *first
3、, *second; int insert=0; if(ready=NULL)|(p-super)(ready-super) /*优先级最大者,插入队首*/ p-link=ready; ready=p; else /* 进程比较优先级,插入适当的位置中*/ first=ready; second=first-link; while(second!=NULL) if(p-super)(second-super) /*若插入进程比当前进程优先数大,*/ /*插入到当前进程前面*/ p-link=second; first-link=p; second=NULL; insert=1; else /*
4、 插入进程优先数最低,则插入到队尾*/ first=first-link; second=second-link; if(insert=0) first-link=p; void input() /* 建立进程控制块函数*/ int i,num;/ clrscr(); /*清屏*/ printf(n 请输入进程号?); scanf(%d,&num); for(i=0;iname); printf(n 输入进程优先数:); scanf(%d,&p-super); printf(n 输入进程运行时间:); scanf(%d,&p-ntime); printf(n); p-rtime=0;p-sta
5、te=w; p-link=NULL; sort(); /* 调用sort函数*/ int space() int l=0; PCB* pr=ready; while(pr!=NULL) l+; pr=pr-link; return(l);void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ printf(n qname t state t super t ndtime t runtime n); printf(|%st,pr-name); printf(|%ct,pr-state); printf(|%dt,pr-super); printf(|%dt,pr-nt
6、ime); printf(|%dt,pr-rtime); printf(n);void check() /* 建立进程查看函数 */ PCB* pr; printf(n * 当前正在运行的进程是:%s,p-name); /*显示当前运行进程*/ disp(p); pr=ready; printf(n *当前就绪队列状态为:n); /*显示就绪队列状态*/ while(pr!=NULL) disp(pr); pr=pr-link; void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/ printf(n 进程 %s 已完成.n,p-name); free(p);void
7、 running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ (p-rtime)+; if(p-rtime=p-ntime) destroy(); /* 调用destroy函数*/ else (p-super)-; p-state=w; sort(); /*调用sort函数*/ int main() /*主函数*/ int len,h=0; char ch; input(); len=space(); while(len!=0)&(ready!=NULL) ch=getchar(); h+; printf(n The execute number:%d n,h); p=read
8、y; ready=p-link; p-link=NULL; p-state=R; check(); running(); printf(n 按任一键继续.); ch=getchar(); printf(nn 进程已经完成.n); ch=getchar(); return 0; 5、 运行结果 6、 体会心得题目21、 实验要求: 编写并调试一个模拟的进程调度程序,采用“轮转法”调度算法对五个进程进行调度。 2、 实验原理: 轮转法可以是简单轮转法、可变时间片轮转法,或多队列轮转法。 简单轮转法的基本思想是:所有就绪进程按 FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时
9、间片相同。如果运行进程用完它的时间片后还为完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。直至所有的进程运行完毕。 3、 流程图: 4、 源代码:#include stdio.h #include #include #define getpch(type) (type*)malloc(sizeof(type) /#define NULL 0 struct pcb /* 定义进程控制块PCB */ char name10; char state; int super; int ntime; int rtime; struct pcb* link; *ready=NULL,*p;
10、typedef struct pcb PCB; void sort() /* FCFS函数*/ PCB* loc; PCB* re; loc = ready; if(ready = NULL) ready = p; else while (loc != NULL) re = loc; loc = loc-link; re-link = p; void input() /* 建立进程控制块函数*/ int i,num=5;printf(输入5个进程控制块:);for(i=0;iname); printf(n 输入进程优先数:); scanf(%d,&p-super); printf(n 输入进程
11、运行时间:); scanf(%d,&p-ntime); printf(n); p-rtime=0; p-state=w; p-link=NULL; sort(); /* 调用sort函数*/ int space() int l=0; PCB* pr=ready; while(pr!=NULL) l+; pr=pr-link; return(l); void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ printf(n qname t state t super t ndtime runtime n); printf(|%st,pr-name); printf(|%
12、ct,pr-state); printf(|%dt,pr-super); printf(|%dt,pr-ntime); printf(|%dt,pr-rtime); printf(n); void check() /* 建立进程查看函数 */ PCB* pr; printf(n * 当前正在运行的进程是:%s,p-name); /*显示当前运行进程*/ disp(p); pr=ready; printf(n *当前就绪队列状态为:n); /*显示就绪队列状态*/ while(pr!=NULL) disp(pr); pr=pr-link; void destroy() /*建立进程撤消函数(进程
13、运行结束,撤消进程)*/ printf(n 进程 %s 已完成.n,p-name); free(p); void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ (p-rtime)+; if(p-rtime=p-ntime) destroy(); /* 调用destroy函数*/ else /(p-super)-; p-state=w; sort(); /*调用sort函数*/ int main() int len,h=0; char ch; input(); len = space(); while(len != 0) & (ready != NULL) ch =
14、 getchar(); h+; printf(n The excute number: %d n,h); p = ready; ready = p-link; p-link = NULL; p-state = R; check(); running(); printf(n 按任一键继续.); ch = getchar(); printf(nn 进程已经完成.n); ch = getchar(); return 0; 5、 运行结果: 6、 体会心得:实验二:作业调度实验题目11、 实验要求编写并调试一个单道处理系统的作业等待模拟程序。作业等待算法:分别采用先来先服务(FCFS),最短作业优先(
15、SJF)、响应比高者优先(HRN)的调度算法。对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,以比较各种算法的优缺点。2、 实验原理FCFS:在计算机并行任务处理中,被视为最简单的任务排序策略,即是无论任务大小和所需完成时间,对先到的任务先处理,后到的任务后处理。它是一种策略。SJF:以进入系统的作业所要求的CPU时间为标准,总选取估计计算时间最短的作业投入运行。HRN:最高优先法(HRN)是对FCFS方式和SJF方式的一种综合平衡。FCFS方式只考虑每个作业的等待时间而未考虑执行时间的长短,而SJF方式只考虑执行时
16、间而未考虑等待时间的长短。因此,这两种在某些极端情况下会带来某些不便。3、 流程图4、 源代码#include #include using namespace std;struct jcb /* 定义作业控制块PCB */ string szJname; /作业名 int iStime; /提交时间 int iRtime; /运行时间 int iBtime; /开始运行时间 int iFtime; /完成时间 float fTtime; /周转时间 float fWtime; /带权周转时间 char cState; /作业状态 float fSuper; /优先权 struct jcb*
17、link; *ready=NULL,*p;int iRecord = 0;void FCFS(int iCnt) iRecord = 0; float fATtime = 0; float fAWtime = 0; jcb *q = ready; cout 作业名称t开始运行时间t完成时间t周转时间t带权周转时间 link) q-iBtime = iRecord; q-iFtime = q-iBtime + q-iRtime; q-fTtime = q-iFtime - q-iStime; q-fWtime = q-fTtime / q-iRtime; cout szJname t; cout
18、 iBtime t; cout iFtime t; cout fTtime t; cout fWtime t iRtime; fATtime += q-fTtime; fAWtime += q-fWtime; cout 平均周转时间: fATtime/iCnt endl; cout 平均带权周转时间: fAWtime/iCnt endl; void SJF(int iCnt) iRecord = 0; float fATtime = 0; float fAWtime = 0; jcb *pshort,*q; cout 作业名称t开始运行时间t完成时间t周转时间t带权周转时间 endl; for
19、 (int i=0; i cState = W) pshort = q; pshort-cState = F; break; q = q-link; while(q != NULL); else pshort = NULL; q = ready; do if (q-cState = W & pshort = NULL & q-iStime cState = W & pshort-iRtime q-iRtime & q-iStime link; while(q != NULL); pshort-cState = F; pshort-iBtime = iRecord; pshort-iFtime
20、= pshort-iBtime + pshort-iRtime; pshort-fTtime = pshort-iFtime - pshort-iStime; pshort-fWtime = pshort-fTtime / pshort-iRtime; cout szJname t; cout iBtime t; cout iFtime t; cout fTtime t; cout fWtime t iRtime; fATtime += pshort-fTtime; fAWtime += pshort-fWtime; cout 平均周转时间: fATtime/iCnt endl; cout 平
21、均带权周转时间: fAWtime/iCnt cState = W; q = q-link; void HRN(int iCnt) iRecord = 0; float fATtime = 0; float fAWtime = 0; jcb *psuper,*q; reset(); /把作业的状态都重新设定为Wait cout 作业名称t开始运行时间t完成时间t周转时间t带权周转时间 endl; for (int i=0; i cState = W) psuper = q; psuper-cState = F; break; q = q-link; while(q != NULL); else
22、psuper = NULL; q = ready; do if (q-cState = W & psuper = NULL & q-iStime cState = W & (psuper-iRtime - psuper-iStime)+psuper-iRtime)/psuper-iRtime (q-iRtime - q-iStime)+q-iRtime)/q-iRtime & q-iStime link; while(q != NULL); psuper-cState = F; psuper-iBtime = iRecord; psuper-iFtime = psuper-iBtime + p
23、super-iRtime; psuper-fTtime = psuper-iFtime - psuper-iStime; psuper-fWtime = psuper-fTtime / psuper-iRtime; cout szJname t; cout iBtime t; cout iFtime t; cout fTtime t; cout fWtime t iRtime; fATtime += psuper-fTtime; fAWtime += psuper-fWtime; cout 平均周转时间: fATtime/iCnt endl; cout 平均带权周转时间: fAWtime/iC
24、nt endl;int main() int num; jcb *loc; cout num; for (int i=0; i num; +i) p = new jcb; cout endl; cout 作业 i+1 : endl; cout p-szJname; cout p-iRtime; p-iStime = i; p-cState = W; p-link = NULL; if (ready = NULL) ready = p; loc = p; else loc-link = p; loc = loc-link; cout 使用FCFS算法: endl; FCFS(num); cout
25、 使用SJF算法: endl; SJF(num); cout 使用HRN算法: link; free(ready); system(pause); return 0; 5、 运行结果6、 心得实验三:存储管理实验题目11、 题目要求 设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。 可以假定每个作业都是批处理作业,并且不允许动态申请内存。为实现分区的分配和回收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。2、 相关概念 固定是分区:固定式分区是在处理作业之前就已经被划分成若干个分区,每个分区的大小可以相同,也可以不同。但是,一旦
26、划分好分区后,中的分区的个数就固定了,且每个分区的大小固定不变。该实验使用大小不相同的分区3、 数据流图开始初始化分区表页头开始查找空间满足?查找下一个分区NN分区遍历完?Y分配给程序Y分配失败 结束4、 代码#include #include using namespace std;struct jcb string szJName; int iJSize; struct jcb *link;*JList=NULL,*p;struct table int iNum; int iSize; int iAdd; string szStatus; string szJName; struct ta
27、ble *link;*TList=NULL,*q; void InitTable() table *loc; int j = 16; for (int i = 1; i !=5; +i, j *= 2) loc = new table; loc-iNum = i; loc-iSize = j; loc-iAdd = j; loc-szStatus = 未分配; loc-szJName = *; loc-link = NULL; if(TList = NULL) TList = loc; q = loc; else q-link = loc; q = q-link; void ShowTable
28、() cout 分区说明表: endl; q = TList; cout 分区号t 大小t 起址t 状态t 占用情况 endl; for(int i = 1; i != 5; +i) cout iNum t; cout iSize t; cout iAdd t; cout szStatus t; cout szJName link; void Allot() jcb *loc; p = new jcb; cout p-szJName; cout p-iJSize; p-link = NULL; if (p-iJSize link = p; loc = loc-link; q = TList; while(q != NULL) if(q-iSize = p-iJSize & q-szStatu