第3章-与存储管理有关的操作系统算法实践作业(占课程整体分数5%)_第1页
第3章-与存储管理有关的操作系统算法实践作业(占课程整体分数5%)_第2页
第3章-与存储管理有关的操作系统算法实践作业(占课程整体分数5%)_第3页
第3章-与存储管理有关的操作系统算法实践作业(占课程整体分数5%)_第4页
第3章-与存储管理有关的操作系统算法实践作业(占课程整体分数5%)_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上第3章 与存储管理有关的操作系统算法实践作业(占课程整体分数5%)参照“强化实践能力培养课程内容”中“内存页面置换算法实践能力培养考核选例”程序,编写一个能演示LRU内存页面置换算法的程序,它可根据给定的一组页面引用序列号和实存页数,显示LRU置换页的过程,能统计和报告LRU置换算法情况下依次淘汰的页号、缺页次数(页错误数)和缺页率。参考运行结果:#include"stdio.h"#include"stdlib.h"void CopyL(intSour,int Dist ,int x); /数组Sour复制到数组Dist,复制到

2、x个数void SetDI(intDiscL);  /随机生成磁道数  void Print(intPri,int x);  /打印输出数组Privoid DelInq(int Sour,intx,int y);  /数组Sour把x位置的数删除,并把y前面的数向前移动,y后的数保持不变(即会出现2个y) void FCFS(int Han,intDiscL);  /先来先服务算法(FCFS)void SSTF(int Han,intDiscL);  /最短寻道时间优先算法(SSTF)int SCAN(int Han,intDiscL

3、,int x,int y);  /扫描算法(SCAN)void CSCAN(int Han,intDiscL);  /循环扫描算法(CSCAN)/void N_Step_SCAN(intHan1,int DiscL);  /N步扫描算法(NStepScan)void PaiXu();  /寻道长度由低到高排序void Pri();int NAll=0;int Best52; /用作寻道长度由低到高排序时存放的数组 int Limit=0; /输入寻找的范围磁道数iint Jage;float Aver=0; int main() in

4、t i; int DiscLine10;  /声明准备要生成的随机磁道号的数组 int Hand; /磁道数 int Con=1; int n; while(Con=1)   Jage=0;  printf("n 请输入初始的磁道数(0<n<65536):");     scanf("%d",&Hand);   printf("n+ 输入寻找的范围:");&

5、#160; scanf("%d",&Limit);  if(Limit>65536)   printf("超出范围!");     elseprintf("  *n");printf("  *磁盘调度算法 *n");    printf(" *n");    printf("*    

6、       1.先来先服务算法(FCFS)                     *n");    printf("  *          2.最短寻道时间优先算法(SSTF

7、)               *n");    printf("  *          3.扫描算法(SCAN)               &#

8、160;         *n");    printf("  *          4.循环扫描算法(CSCAN)                    &#

9、160;*n");    printf("  *n"); scanf("%d",&n); if(n=0) exit(0); printf("n"); switch(n)  case 1:  SetDI(DiscLine);  /随机生成磁道数  FCFS(Hand,DiscLine); /先来先服务算法(FCFS)  break; case 2:  SetDI

10、(DiscLine);  /随机生成磁道数  SSTF(Hand,DiscLine); /最短寻道时间优先算法(SSTF)  break; case 3:  SetDI(DiscLine);  /随机生成磁道数  SCAN(Hand,DiscLine,0,9);  /扫描算法(SCAN)  break; case 4:        SetDI(DiscLine);  /随机生成磁道数  CSCAN(Han

11、d,DiscLine); /循环扫描算法(CSCAN)     break; case 5:        SetDI(DiscLine);  /随机生成磁道数    SetDI(DiscLine);  /随机生成磁道数  FCFS(Hand,DiscLine); /先来先服务算法(FCFS)  SSTF(Hand,DiscLine); /最短寻道时间优先算法(SSTF)  SCAN(Hand,DiscLine,0,

12、9); /扫描算法(SCAN)  CSCAN(Hand,DiscLine);  /循环扫描算法(CSCAN)  PaiXu(); /寻道长度由低到高排序  printf("nn+ 寻道长度由低到高排序:");   for(i=0;i<5;i+)     printf("%4d ",Besti0);    break;   printf("nn+ 是否继续(按0结束,按1继续)?");

13、0; scanf("%5d",&Con);      /数组Sour复制到数组Dist,复制到x个数void CopyL(intSour,int Dist ,int x) int i; for(i=0;i<=x;i+)   Disti=Souri; /打印输出数组Privoid Print(intPri,int x) int i; for(i=0;i<=x;i+)   printf("%5d",Prii);

14、 /随机生成磁道数void SetDI(intDiscL) int i; for(i=0;i<=9;i+)      DiscLi=rand()%Limit;/随机生成10个磁道号  printf("+ 需要寻找的磁道号:"); Print(DiscL,9);  /输出随机生成的磁道号 printf("n");/数组Sour把x位置的数删除,并把y前面的数向前移动,y后的数保持不变(即会出现2个y) void DelInq(int

15、Sour,int x,int y) int i; for(i=x;i<y;i+)    Souri=Souri+1;  x+; /先来先服务算法(FCFS)void FCFS(int Han,intDiscL) int RLine10; /将随机生成的磁道数数组Discl复制给数组RLine int i,k,All,Temp;  /Temp是计算移动的磁道距离的临时变量 All=0; /统计全部的磁道数变量 k=9;  /限定10个的磁道数 

16、;CopyL(DiscL,RLine,9);  /复制磁道号到临时数组RLine    printf("n+ 按照FCFS算法磁道的访问顺序为:"); All=Han-RLine0; for(i=0;i<=9;i+)   Temp=RLine0-RLine1;/求出移动磁道数,前一个磁道数减去后一个磁道数得出临时的移动距离  if(Temp<0)    Temp=(-Temp);/移动磁道数为负数时,算出相反数作为移动磁道数  printf(&

17、quot;%5d",RLine0);  All=Temp+All;/求全部磁道数的总和   DelInq(RLine,0,k);/每个磁道数向前移动一位  k-;  BestJage1=All;/Best1存放移动磁道数  BestJage0=1; /Best0存放算法的序号为:1  Jage+;/排序的序号加1 Aver=(float) All)/10;/求平均寻道次数  printf("n+ 移动磁道数:<%5d> ",All); printf(&q

18、uot;n+ 平均寻道长度:*%0.2f* ",Aver);/最短寻道时间优先算法(SSTF)void SSTF(int Han,intDiscL) int i,j,k,h,All; int Temp; /Temp是计算移动的磁道距离的临时变量 int RLine10;   /将随机生成的磁道数数组Discl复制给数组RLine int Min; All=0; /统计全部的磁道数变量 k=9;  /限定10个的磁道数 CopyL(DiscL,RLine,9);

19、60; /复制磁道号到临时数组RLine    printf("n+ 按照SSTF算法磁道的访问顺序为:"); for(i=0;i<=9;i+)         Min=64000;  for(j=0;j<=k;j+) /内循环寻找与当前磁道号最短寻道的时间的磁道号      if(RLinej>Han)  /如果第一个随机生成的磁道号大于当前的磁道号,执行下一句  &

20、#160; Temp=RLinej-Han;  /求出临时的移动距离   else    Temp=Han-RLinej;  /求出临时的移动距离   if(Temp<Min)  /如果每求出一次的移动距离小于Min,执行下一句       Min=Temp; /Temp临时值赋予Min    h=j; /把最近当前磁道号的数组下标赋予h      

21、All=All+Min; /统计一共移动的距离  printf("%5d",RLineh);  Han=RLineh;   DelInq(RLine,h,k);  /每个磁道数向前移动一位  k-;  BestJage1=All;/Best1存放移动磁道数  BestJage0=2;/Best0存放算法的序号为:2 Jage+;/排序序号加1 Aver=(float)All)/10;/求平均寻道次数  printf("n+ 移动磁道数:

22、<%5d> ",All); printf("n+ 平均寻道长度:*%0.2f* ",Aver);/扫描算法(SCAN)int SCAN(int Han,intDiscL,int x,int y)    int j,n,k,h,m,All; int t=0; int Temp; int Min; int RLine10; /将随机生成的磁道数数组Discl复制给数组RLine  int Order; Order=1; k=y; m=2;

23、  /控制while语句的执行,即是一定要使当前磁道向内向外都要扫描到 All=0; /统计全部的磁道数变量 CopyL(DiscL,RLine,9);  /复制磁道号到临时数组RLine    printf("n+ 按照SCAN算法磁道的访问顺序为:"); Min=64000; for(j=x;j<=y;j+)  /寻找与当前磁道号最短寻道的时间的磁道号   if(RLinej>Han)  /如果第一个随机生成的磁道号大于

24、当前的磁道号,执行下一句   Temp=RLinej-Han;  /求出临时的移动距离  else   Temp=Han-RLinej;  /求出临时的移动距离  if(Temp<Min)     Min=Temp; /Temp临时值赋予Min   h=j;  /把最近当前磁道号的数组下标赋予h    All=All+Min;     printf("

25、%5d",RLineh); if(RLineh>=Han)  /判断磁道的移动方向,即是由里向外还是由外向里  Order=0;  t=1;  Han=RLineh; DelInq(RLine,h,k);  /每个磁道数向前移动一位 k-; while(m>0)    if(Order=1) /order是判断磁盘扫描的方向标签,order是1的话,磁道向内移动     for(j=x;j<=y;j

26、+)         h=-1;    Min=64000;    for(n=x;n<=k;n+)  /判断离当前磁道最近的磁道号         if(RLinen<=Han)           Temp=Han-RLinen;      &

27、#160;         if(Temp<Min)             Min=Temp;  /Temp临时值赋予Min                h=n;  /把最近当前磁道号的数组下标赋予h 

28、0;                 if(h!=-1)         All=All+Min;  /叠加移动距离     printf("%5d",RLineh);     Han=RLineh; /最近的磁道号作为当前磁道     DelInq

29、(RLine,h,k);     k-;          Order=0; /当完成向内的移动,order赋予0,执行else语句,使磁道向外移动      m-; /向内完成一次,m减一次,保证while循环执行两次    else /order是0的话,磁道向外移动     for(j=x;j<=y;j+)    &

30、#160;  h=-1;    Min=64000;    for(n=x;n<=k;n+)  /判断离当前磁道最近的磁道号         if(RLinen>=Han)           Temp=RLinen-Han;          &

31、#160;     if(Temp<Min)             Min=Temp;   /Temp临时值赋予Min                   h=n;  /把最近当前磁道号的数组下标赋予h  

32、60;                if(h!=-1)         All=All+Min;  /叠加移动距离     printf("%5d",RLineh);     Han=RLineh;  /最近的磁道号作为当前磁道     DelIn

33、q(RLine,h,k);     k-;          Order=1; /当完成向内的移动,order赋予0,执行else语句,使磁道向外移动      m-;  /向内完成一次,m减一次,保证while循环执行两次    NAll=NAll+All; if(y-x)>5)   BestJage1=All;/Best1存放移动磁道数

34、  BestJage0=3;/Best0存放算法的序号为:3  Jage+;/排序序号加1  Aver=(float)All)/10;/求平均寻道次数   printf("n+ 移动磁道数:<%5d> ",All);  printf("n+ 平均寻道长度:*%0.2f* ",Aver);  if(t=1) printf("n+ 磁道由内向外移动"); else printf("n+ 磁道由外向内移动"); 

35、;return(Han);/循环扫描算法(CSCAN)void CSCAN(int Han,intDiscL)  int j,h,n,Temp,m,k,All,Last,i; int RLine10; /将随机生成的磁道数数组Discl复制给数组RLine  int Min; int tmp=0; m=2; k=9; All=0;  /统计全部的磁道数变量 Last=Han; CopyL(DiscL,RLine,9);  /复制磁道号到临时数组RLine&

36、#160;   printf("n+ 按照CSCAN算法磁道的访问顺序为:"); while(k>=0)   for(j=0;j<=9;j+)  /从当前磁道号开始,由内向外搜索离当前磁道最近的磁道号     h=-1;   Min=64000;   for(n=0;n<=k;n+)       if(RLinen>=Han)     

37、;    Temp=RLinen-Han;            if(Temp<Min)           Min=Temp;               h=n;               if(h!=-1)  

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论