《操作系统课程设计报告》由会员分享,可在线阅读,更多相关《操作系统课程设计报告(16页珍藏版)》请在金锄头文库上搜索。
1、1操作系统课程设计报告班级:计算机四班学号:08031422姓名:王 朋 飞2实验一 进程调度一、实验目的通过一个简单的进程调度模拟程序的实现,加深对进程调度算法,进程切换的理解。二、需求分析采用动态优先数的方法,编写一进程调度程序模拟程序。模拟程序只进行相应的调度模拟操作,不需要实际程序。 (1) 假定系统有五个进程,每一个进程用一个进程控制块 PCB 来代表,进程控制块的格式为:进程名指针要求运行时间优先数状态其中,进程名作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。指针按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指
2、针为“0”。要求运行时间假设进程需要运行的单位时间数。优先数赋予进程的优先数,调度时总是选取优先数大的进程先执行。状态可假设有两种状态,“就绪”状态和“结束”状态。五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。(2) 在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。(3) 为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。(4) 处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优先数就减“1”。由于本实习是模拟处理器调度
3、,所以,对被选中的进程并不实际的启动运行,而是执行:优先数-1要求运行时间-1来模拟进程的一次运行。提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。在这里省去了这些工作。(5) 进程运行一次后,若要求运行时间?0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间=0,则把它的状态修改成“结束”3(E),且退出队列。(6) 若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。(7) 在所设计的程序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一
4、次后进程队列的变化。(8) 为五个进程任意确定一组“优先数”和“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。4三、概要设计1程序概要设计图52 程序源代码jingchendiaodu.cpp #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;
5、 int rtime; struct pcb* link; *ready=NULL,*p; typedef struct pcb PCB; sort() /* 建立对进程进行优先级排列函数*/ PCB *first, *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)(
6、second-super) /*若插入进程比当前进程优先数大,*/ /*插入到当前进程前面*/ p-link=second; first-link=p; second=NULL; insert=1; else /* 插入进程优先数最低,则插入到队尾*/ first=first-link; second=second-link; if(insert=0) first-link=p; input() /* 建立 进程控制块函数*/ int i,num; clrscr(); /*清屏 */ printf(n 请输入进程号?); scanf(%d, for(i=0;iname); printf(n 输
7、入进程优先数:); scanf(%d, printf(n 输入进程运行时间:); scanf(%d, 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); disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ printf(n qname t state t super t ndtime t runtime n); printf(|%s
8、t,pr-name); printf(|%ct,pr-state); printf(|%dt,pr-super); printf(|%dt,pr-ntime); printf(|%dt,pr-rtime); printf(n); check() /* 建立进程查看函数 */ PCB* pr; printf(n * 当前正在运行的进程是:%s,p-name); /*显示当前运行进程*/ disp(p); pr=ready; printf(n *当前就绪队列状态为:n); /*显示就绪队列状态*/ while(pr!=NULL) disp(pr); pr=pr-link; destroy() /*
9、建立进程撤消函数(进程运行结束,撤消进程)*/ printf(n 进程 %s 已完成.n,p-name); free(p); running() /* 建立 进程就绪函数(进程运行时间到,置就绪状 态*/ 7 (p-rtime)+; if(p-rtime=p-ntime) destroy(); /* 调用 destroy 函数 */ else (p-super)-; p-state=w; sort(); /*调用 sort 函数*/ main() /*主函数*/ int len,h=0; char ch; input(); len=space(); while(len!=0)&(ready!=
10、NULL) ch=getchar(); h+; printf(n The execute 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(); 8实验二 存储管理一、实验目的存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。本实验的目的是通过请求页式存储管理中页面置换算法模拟设计 , 了解虚拟存储技术的特点 , 掌握请
11、求页式存储管理的页面置换算法。二、需求分析通过随机数产生一个指令序列,共320条指令。指令的地址按下述原则生成 : 50% 的指令是顺序执行的; 25% 的指令是均匀分布在前地址部分; 25% 的指令是均匀分布在后地址部分。具体的实施方法是 :在 0,319 的指令地址之间随机选取一起点 m;顺序执行一条指令;在前地址0,m+1中随机选取一条指令并执行 , 该指令的地址为 m; 顺序执行一条指令 , 其地址为 m+1;在后地址 m+2,319 中随机选取一条指令并执行 ;重复上述步骤 , 直到执行 320 次指令。(1) 将指令序列变换成为页地址流设:页面大小为 1K;用户内存容量为 4 页到
12、 32 页 ;用户虚存容量为 32K 。在用户虚存中 , 按每 K 存放 10 条指令排列虚存地址 , 即 320 条指令在虚存中的存放方式为 :第 0 条 第 9 条指令为第 0 页 ( 对应虚存地址为 0,9);第 10 条 第 19 条指令为第 1 页 ( 对应虚存地址为 10,19 ) ;第 310 条 第 319 条指令为第 31 页 ( 对应虚存地址为 310,319) 。按以上方式 , 用户指令可组成 32 页。(2) 计算并输出下述各种算法在不同内存容量下的命中率。 先进先出的算法 (FIFO); 最近最久未使用算法 (LRU);命中率 = 1 - 页面失效次数页地址流长度在本
13、实验中 , 页地址流长度为 320, 页面失效次数为每次访问相应指令时 , 9该指令所对应的页不在内存的次数。三、概要设计1概要设计流程图开 始生成地址流输入算法号 S1S4形成地址页号用户内存空间 msize=2Msize32 OPT() FIFO() LRU() LFU()Msize 加 1S=? 是否用其他算法继续结 束NY1 2 3 4YN提示出错,重新输入102程序源代码produce_addstream.h#ifndef PRODUCE_ADDSTREAM_H#define PRODUCE_ADDSTREAM_H#include#include#include#include#in
14、clude using namespace std;#define random(x) (rand()%x)#define MAX_LENGTH 320struct produceint num; /指令序号int zhiling; /指令地址int virtualpage; /指令虚页号produce *next;struct produce*creatlist();void insert(struct produce *first,struct produce *s); /插入一个节点(尾插法)void print(struct produce *first); /打印函数int max(
15、vector ,int );struct produce*creatlist()srand(int)time(0);struct produce*first=new produce;first-next=NULL;int m=0,m1=0;/*int yanzheng20=7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1;for (int i=0;inum=i*4+0;s0-zhiling=yanzhengi*4+0;s0-virtualpage=s0-zhiling;insert(first,s0);struct produce *s1;s1=new produce;s1-num=i*4+1;s1-zhiling=yanzhengi*4+1;s1-virtualpage=s1-zhiling;insert(first,s1);struct produce *s2;s2=new produce;s2-nu