操作系统页面置换算法.docx

上传人:b****6 文档编号:8658896 上传时间:2023-02-01 格式:DOCX 页数:22 大小:240.92KB
下载 相关 举报
操作系统页面置换算法.docx_第1页
第1页 / 共22页
操作系统页面置换算法.docx_第2页
第2页 / 共22页
操作系统页面置换算法.docx_第3页
第3页 / 共22页
操作系统页面置换算法.docx_第4页
第4页 / 共22页
操作系统页面置换算法.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

操作系统页面置换算法.docx

《操作系统页面置换算法.docx》由会员分享,可在线阅读,更多相关《操作系统页面置换算法.docx(22页珍藏版)》请在冰豆网上搜索。

操作系统页面置换算法.docx

操作系统页面置换算法

操作系统

课程设计报告

院(系):

  信息与数学学院   

专  业:

  信息与计算科学   

姓 名:

    张三   

班级:

_信计11402  

学 号:

  122914   

题 目:

     页面置换算法     

指导教师:

   孙庆生  

       2017年5月27日

一、课程设计目得

《Linux操作系统课程设计》就是在学完《操作系统》课程之后得实践教学环节,就是复习与检验所学课程得重要手段、通过实验环节,加深学生对操作系统基本原理与工作过程得理解,提高学生独立分析问题、解决问题得能力,增强学生得动手能力。

二、课程设计得任务与要求

由于具体得操作系统相当复杂,不可能对所有管理系统进行详细地分析。

因此,选择了操作系统中最重要得管理之一存储器管理,作为本设计得任务。

页面置换算法就是虚拟存储管理实现得关键,要求在充分理解内存页面调度机制得基础上,模拟实现OPT、FIFO、LRU几种经典页面置换算法,比较各种置换算法得效率及优缺点,从而了解虚拟存储实现得过程。

具体任务如下:

1)分析设计内容,给出解决方案

①要说明设计实现得原理;

②采用得数据结构:

定义为进程分配得物理块;定义进程运行所需访问得页面号;定义页得结构;

2)模拟三种页面置换算法;

3)比较各种算法得优劣。

4)对程序得每一部分要有详细得设计分析说明、

5)源代码格式要规范、

6)设计合适得测试用例,对得到得运行结果要有分析。

任务要求:

Linux平台下实现(Windows+VMware+ Ubuntu)

三、课程得详细设计

1)系统设计

在进程运行过程中,若其所要访问得页面不在内存而需把它们调入内存,但内存已无空闲空间时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据,送磁盘得对换区中。

但应将哪 个页面调出,须根据一定得算法来确定。

通常,把选择换出页面得算法称为页面置换算法。

 一个好得页面置换算法,应具有较低得页面更换频率。

从理论上讲,应将那些以后不再会访问得页面换出,或将那些在较长时间内不会再访问得页面调出。

2)主程序流程图

主流程图

3)先进先出(FIFO)页面置换算法

算法得基本思想:

该算法总就是淘汰最先进入内存得页面,即选择在内存中驻留时间最久得页面予以淘汰。

该算法实现简单只需把一个进程已调入内存得页面,按先后次序存入一个时间数组,并将其中时间值最大得页面进行淘汰,并替换入新得页面就可以实现。

算法流程图:

FIFO置换算法

4)最佳页面置换置换算法(OPT)

算法得基本思想:

其所选择得被淘汰页面,将就是永不使用得,或者就是在最长时间内不再被访问得页面。

可保证获得最低得缺页率。

但由于人们目前还无法预知一个进程在内存得若干个页面中,哪一个页面就是未来最长时间内不再被访问得,因而该算法也就是无法实现得。

但就是可利用该算法去评价其它算法、

算法流程图:

OPT页面置换算法

5)最近最久未使用页面置换算法LRU

算法得基本思想:

当需要淘汰某一页时,选择离当前时间最近得一段时间内最久没有使用过得页先淘汰。

该算法得主要出发点就是,如果某页被访问了,则它可能马上还被访问。

或者反过来说,如果某页很长时间未被访问,则它在最近一段时间不会被访问。

算法流程图:

LRU页面置换算法

四、源程序代码

#include”stdio.h"

#include”malloc。

h"

#defineN20

#definenum3

/*进程分配物理块数目*/

intA[N]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};

typedefstructpage/*页表映像*/

intaddress;/*页面地址*/

 structpage *next;

}page;

struct page*head,*run,*rear;

voidinitial()/*进程分配物理块*/

{

 inti=1;

page*p,*q;

head=(page *)malloc(sizeof(page));

 p=head;

  for(i=1;i〈=num;i++)

 {

 q=(page *)malloc(sizeof(page));

  p->next=q;

 q->address=-1;

 q—>next=NULL;

 p=q;

 }

 rear=p;

voidprint()

ﻩpage*p=head—〉next;

ﻩwhile(p)

{

ﻩif(p—>address!

=-1)ﻩ/*避免输出-1*/

ﻩprintf("%d\t”,p-〉address);

ﻩp=p-〉next;

}

printf("\n”);

int search(intn)/*判断链表中就是否有n*/

 page *p;

  inti=0;

 p=head;

 while(p->next)

  {

    if(p->next->address==n)

{

   printf("Getitat thepage%d\n",i+1);

    run=p;

return1;

 }

  p=p->next;

    i++;

  }

 return0;

}

void changeOPT(int n,intposition)

   inti;

 inttotal=0;

 intflag=1;ﻩ/*默认链表填满*/

intdistance[num];ﻩ/*用于存放距离*/

int MAX;

intorder=0;

  page *p,*q;

p=head->next;

 q=head->next;

  for(i=0;i〈num; i++)ﻩ/*初始化距离*/

{

    distance[i]=100;

 }

i=0;

while(p)/*判断链表中就是否填满*/

 {

if(p-〉address==-1)

 {

   flag=0;

     break;

  }

  p=p—〉next;

   i++;

}

 if(!

flag)/*链表没有填满得情况*/

 {

  p-〉address=n;

printf("Changethe page%d\n",i+1);

}

 else/*链表已经填满得情况*/

   while(q)/*计算距离*/

 {

   for(i=position+1;i<N; i++)

 {

   if(q—〉address==A[i])

      {

      distance[total]=i—position;

    break;

      }

   }

 total++;

    q=q->next;

  }

  MAX=distance[0];

    for(i=0;i

  {

     if(distance[i]>MAX)

    {

  MAX=distance[i];

   order=i;/*记录待替换得页面得位置*/

     }

     }

printf("Changethe page %d\n",order+1);

  i=0;

 p=head—〉next;

  while(p)/*页面替换*/

 {

    if(i==order)

    {

  p—>address=n;

    }

  i++;

     p=p->next;

 }

voidchangeFIFO(intn,intposition)

 inti=0;

 int flag=1;ﻩ//默认队列已满

  page*p,*delect;

  p=head—>next;

 while(p)

{

 if(p—〉address==-1)ﻩ//队列未满

    {

  flag=0;

      p—>address=n;

     printf("Change thepage%d\n”,i+1);

    break;

   }

 p=p-〉next;

   i++;

 }

 if(flag)ﻩ//队列已满

ﻩdelect=head—>next;

 delect->address=n;

  head->next=delect-〉next;

 printf(”Delectfrom thehead,andaddnewto the end.\n");

   rear—>next=delect;

   rear=delect;

   rear->next=NULL;

 }

voidchangeLRU(intn,intposition)

inti;

 int total=0;

  intflag=1;/*默认为已满*/

 int distance[num];

 intMAX;

 intorder=0;

 page*p,*q;

 p=head—〉next;

 q=head->next;

  for(i=0;i<num;i++)

  {

distance[i]=100;

 i=0;

 while(p)/*判断链表就是否已满*/

 {

   if(p-〉address==-1)

    {

  flag=0;

   break;

 }

  p=p->next;

  i++;

}

 if(!

flag)ﻩ/*链表没有满得情况*/

   {

p—>address=n;

   printf("Change thepage%d\n",i+1);

 }

else/*链表已满得情况*/

   {

  while(q)

  {

  for(i=position—1;i〉=0;i-—)/*向前计算距离*/

   {

      if(q—>address==A[i])

 {

      distance[total]=position—i;

      break;

   }

     }

     total++;

  q=q-〉next;

  }

 MAX=distance[0];

  for(i=0; i

   {

     if(distance[i]>MAX)

  {

    MAX=distance[i];

   order=i;

   }

  }

  printf(”Changethe page%d\n”,order+1);

 i=0;

   p=head->next;

   while(p)ﻩ/*页面替换*/

 {

   if(i==order)

     {

    p->address=n;

  }

  i++;

      p=p->next;

  }

floatOPT()

 inti;

  intlose=0;

   float losef;

 floatpercent;

 for(i=0;i〈N;i++)

 if(search(A[i])==0)

 {

      lose++;

changeOPT(A[i],i);

  }

print();

 }

losef=(float)lose;

 percent=1—(losef/N);

returnpercent;

floatLRU()

   inti;

int lose=0;

 floatlosef;

  float percent;

 for(i=0;i<N;i++)

  {

if(search(A[i])==0)

   {

  lose++;

   changeLRU(A[i],i);

 }

ﻩprint();

}

  losef=(float)lose;

  percent=1—(losef/N);

  return percent;

floatFIFO()

 int i;

  intlose=0;

  floatlosef;

  float percent;

ﻩpage *p;

 for(i=0;i〈N;i++)

   if(search(A[i])==0)

   {

  lose++;

    changeFIFO(A[i],i);

  }

ﻩelse

   {

   p=run—>next;

    run—>next=p->next;

 rear-〉next=p;

 rear=p;

   rear->next=NULL;

  printf("Moveitto endofqueue、\n");

  }

ﻩprint();

  }

  losef=(float)lose;

percent=1-(losef/N);

 returnpercent;

}

voidmain()/*主函数部分*/

{

float percent;

int choice;

 printf("Selectthearithmetic:

\n

(1)OPT\n

(2)LRU\n(3)FIFO\nyourchoiceis:

");

scanf("%d”,&choice);/*选择页面置换算法*/

initial();/*创建进程*/

if(choice==1)/*采用OPT算法置换*/

  {

     percent=OPT();/*计算OPT时得缺页率*/

   printf("ThepercentofOPTis %f\n",percent);

 elseif(choice==2)/*采用LRU算法置换*/

{

   percent=LRU();/*计算LRU时得缺页率*/

    printf("Thepercentof LRUis%f\n",percent);

 }

  else if(choice==3)/*采用FIFO算法置换*/

  {

   percent=FIFO();/*计算FIFO时得缺页率*/

  printf("Thepercentof FIFOis%f\n”,percent);

 }

  else

   printf("Yourchoiceis invalid、”);

5、

调试结果显示 

 

(1)OPT置换算法

(2)LRU置换算法

ﻩLRU

FIFO置换算法

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

当前位置:首页 > 高中教育 > 高考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1