收藏 分享(赏)

操作系统课程设计65158new.doc

上传人:dzzj200808 文档编号:2320675 上传时间:2018-09-10 格式:DOC 页数:17 大小:74.50KB
下载 相关 举报
操作系统课程设计65158new.doc_第1页
第1页 / 共17页
操作系统课程设计65158new.doc_第2页
第2页 / 共17页
操作系统课程设计65158new.doc_第3页
第3页 / 共17页
操作系统课程设计65158new.doc_第4页
第4页 / 共17页
操作系统课程设计65158new.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、1实验目的通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。2实验内容(1) 用 C 语言来实现对 N 个进程采用动态优先权优先算法的进程调度。(2) 每个用来标识进程的进程控制块 PCB 用结构来描述,包括以下字段:l 进程标识数 ID;l 进程优先数 PRIORITY,并规定优先数越大的进程,其优先权越高;l 进程已占用的 CPU 时间 CPUTIME;l 进程还需占用的 CPU 时间 ALLTIME。当进程运行完毕时,ALLTIME 变为0;l 进程的阻塞时间 STARTBLOCK,表示当进程再运行 STARTBLOCK 个时间片后,进程将进入阻塞状态;l 进程被阻塞的时间 B

2、LOCKTIME,表示已阻塞的进程再等待 BLOCKTIME 个时间片后,进程将转换成就绪状态;l 进程状态 STATE;l 队列指针 NEXT,用来将 PCB 排成队列。(3) 优先数改变的原则:l 进程在就绪队列中呆一个时间片,优先数增加 1;l 进程每运行一个时间片,优先数减 3。(4) 假设在调度前,系统中有5个进程,它们的初始状态如下:ID 0 1 2 3 4PRIORITY 9 38 30 29 0CPUTIME 0 0 0 0 0ALLTIME 3 3 6 3 4STARTBLOCK 2 -1 -1 -1 -1BLOCKTIME 3 0 0 0 0STATE READY READ

3、Y READY READY READY(5) 为了清楚地观察进程的调度过程,程序应将每个时间片内的进程的情况显示出来,参照的具体格式如下:RUNNING PROG: iREADY_QUEUE:-id1-id2BLOCK_QUEUE:-id3-id4=ID 0 1 2 3 4PRIORITY P0 P1 P2 P3 P4CPUTIME C0 C1 C2 C3 C4ALLTIME A0 A1 A2 A3 A4STARTBLOCK T0 T1 T2 T3 T4 BLOCKTIME B0 B1 B2 B3 B4STATE S0 S1 S2 S3 S4#include #include int i;/循

4、环值int j;/还在阻塞或就绪队列中的进程数int s;int m;/最大 priority 的 idstruct pcbint id;int p; /priorityint cputime;int alltime;int startblock;int blocktime;int state; /0 表示 ready 1表示 end -1表示 block;struct pcb pro5=0,9,0,3,2,3,0,1,38,0,3,-1,0,0,2,30,0,6,-1,0,0,3,29,0,3,-1,0,0,4,0,0,4,-1,0,0;int changestate0() if(pro0.

5、startblock=0)pro0.state=-1;pro0.startblock-;return 1;if(pro0.blocktime=0)pro0.state=0;return 1;if(pro0.state=0return 1;if(pro0.state=-1return 1;int state0()changestate0();s=pro0.p;if(pro0.state=-1)s=-100;return s;int maxp()/求出最大 priority state0();int max=s;m=pro0.id;for(i=0;iproi.p)max=proi+1.p;m=pr

6、oi+1.id;return m;void change()maxp();int x;/得到 m 现在的数组编号for(i=0;iid=i;head-start=1;head-size=size;head-next=NULL;return head;work* insertwork(work *head,int start,int size)i+;work *pi,*pb;/pi is the insert one #pb is the pointpi=(work*)malloc(sizeof(work);pi-id=i;pi-start=start;pi-size=size;pi-next=

7、NULL;if(head=NULL)head=pi;head-next=NULL;pb=head;while(pb-next!=NULL)pb=pb-next;pb-next=pi;return head;mem *initmem(int size)mem *head=(mem*)malloc(sizeof(mem);head-start=1;head-end=640;head-next=NULL;return head;mem *insertmem(mem *head,int start,int size)mem *pi,*pb,*pf;int pbsize;pb=head;pbsize=p

8、b-end-pb-start+1;pi=(mem*)malloc(sizeof(mem);pi-start=start;pi-end=size+start-1;if(pb=NULL)head=pi;pi-next=NULL;elsewhile(pi-startpb-startpb=pb-next;if(pi-startstart)if(pb=head)head=pi;/头节点pi-next=pb;elsepf-next=pi;/其他位置pi-next=pb;elsepb-next=pi;pi-next=NULL;/在表末插入/合并相邻的内存pf=pb=head;while(pb-next!=N

9、ULL)if(pf-end+2pb-start)pf-end=pb-end;pf-next=pb-next;pf=pb;pb=pb-next;return head;int getstart(work*head,int size)work *pb;pb=head;while(pb!=NULL)if(pb-size=size)return pb-start;pb=pb-next;return 0;int alloc(mem *head,int size)mem *pb;pb=head;int a;while(pb!=NULL)if(sizeend-pb-start+1)a=pb-start;pb

10、-start=pb-start+size;return a;pb=pb-next;return 0;work*free1(work *head,int size)work *pb,*pf;while(head=NULL)printf(“no this nod“);goto end;pb=head;while(pb-size!=sizepb=pb-next;if(pb-size=size)if(pb=head)head=pb-next;else pf-next=pb-next;end:return head;void printw(work *head)work *pb;pb=head;whil

11、e(pb!=NULL)printf(“id start size-n“);printf(“%d%7d%8dn“,pb-id,pb-start,pb-size);pb=pb-next;void printm(mem *head)mem *pb;pb=head;while(pb!=NULL)printf(“start end-n“);printf(“%d%9dn“,pb-start,pb-end);pb=pb-next;void main()int wrec;/接收返回的地址int mrec;mem *mhead;mhead=initmem(640);work *whead;/1whead=ini

12、twork(130);wrec=alloc(mhead,130);/2wrec=alloc(mhead,60);whead=insertwork(whead,wrec,60);/3wrec=alloc(mhead,100);whead=insertwork(whead,wrec,100);/4mrec=getstart(whead,60);whead=free1(whead,60);mhead=insertmem(mhead,mrec,60);/5wrec=alloc(mhead,200);whead=insertwork(whead,wrec,200);/6mrec=getstart(whe

13、ad,100);whead=free1(whead,100);mhead=insertmem(mhead,mrec,100);/7mrec=getstart(whead,130);whead=free1(whead,130);mhead=insertmem(mhead,mrec,130);/8wrec=alloc(mhead,140);whead=insertwork(whead,wrec,140);/9wrec=alloc(mhead,60);whead=insertwork(whead,wrec,60);/10wrec=alloc(mhead,50);whead=insertwork(wh

14、ead,wrec,50);/11mrec=getstart(whead,60);whead=free1(whead,60);mhead=insertmem(mhead,mrec,60);printf(“作业的链表n“);printw(whead);printf(“=n“);printf(“空闲分区链表n“);printm(mhead);请求调页式存储管理方式的模拟一 :实验目的1通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点。2通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求调页系统的原理和实现过程的理解。3掌握虚拟存储请求页式存储管理中几种基本页面置换算

15、法的基本思想和实现过程,并比较它们的效率。二 :实验内容(一)设计一个虚拟存储区和内存工作区,并使用下述算法计算访问命中率。1最佳置换算法(OPT)2先进先出的算法(FIFO)3最近最久未使用算法(LRU)命中率页面失效次数页地址流长度(二)实验分析首先用 rand( )函数定义和产生指令列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。1通过随机数产生一个指令序列,共320条指令。指令的地址按下述原则生成:A:50%的指令是顺序执行的B:25%的指令是均匀分布在前地址部分C:25%的指令是均匀分布在后地址部分具体的实施方法是:A:在0,319的指令地址之间随机选取一

16、起点 m;B:顺序执行下一条指令,即执行地址序号为 m+1的指令;C:通过随机数,跳转到前地址部分0,m+1中的某条指令处,其序号为 m1;D:顺序执行下一条指令,其地址序号为 m1+1的指令;E:通过随机数,跳转到后地址部分m1+2,319 中的某条指令处,其序号为 m2;F:顺序执行下一条指令,其地址序号为 m2+1的指令;G:重复跳转到前地址部分,顺序执行,跳转到后地址部分,顺序执行的过程,直至执行320条指令。#include“stdio.h“#include“stdlib.h“#define p printf#define opt fun /在此更改函数int block=0,0,0

17、,0;/内存块int nopage=0;/缺页次数/*lru 最近最久未使用页面置换算法param m 指令值例如 m=220,则是第 220 条指令,随后被换算成:在第 23 个页面*/static int t1=-1,-1,-1,-1;void lru(int m)int x=0;/记录最大的下标int i;int max;m=m/10+1;p(“在 pape%dn“,m);max=t10;for(i=0;imax)max=t1i;x=i;p(“此时最近最久未使用的内存块是%dn“,x);goto end;for(i=0;imax)max=t1i;x=i;for(i=0;i-1;i-)p(

18、“%dn“,blocki);p(“n“);/*先进先出页面置换算法param m 指令值例如 m=220,则是第 220 条指令,随后被换算成:在第 23 个页面*/int t=0;/fifo 中的标志void fifo(int m)m=m/10+1;/换算成页面的地址p(“在 pape%dn“,m);int i;for(i=0;i-1;i-)p(“%dn“,blocki);p(“下次应该置换内存块 %dnn“,t+1);/return 0;/*opt 最佳置换算法,选择淘汰的是永不被使用或者最长时间内不被访问的页面param m 指令值例如 m=220,则是第 220 条指令,随后被换算成:

19、在第 23 个页面*/int b319;int y=0;/标志void opt(int m)m=m/10+1;if(y319)int i=0;/quanjuint c=0;while(ilongest)longest = t22c;for(c=0;c-1;c-)p(“%dn“,blockc);p(“下次置换: %dn“,bi);p(“-n“);p(“n“);void main()int a320;/指令int i;/初始化数组,例如 a219在 219/10+1 块for(i=0;i=319;i+)ai=i;int m;int x=319;/标志m=rand()%319;/随机数p(“初始值随机数为: %d“,m);p(“i:%d 执行 第%d 指令“,x,am+1);fun(am+1);x=318;for(;x!=-1;)int m1;if(m=0)m1=rand()%319;else m1=rand()%(m);/p(“i:%d 执行第%d 指令“,x,am1+1);fun(am1+1);x-;if(x=-1)break;int m2=rand()%(319-m1-2+1)+(m1+2);if(m2=319)m2=rand()%319;/p(“i:%d 执行第%d 指令“,x,am2+1);fun(am2+1);x-;m=m2;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报