操作系统页面置换算法

  • 格式:doc
  • 大小:240.00 KB
  • 文档页数:23

下载文档原格式

  / 23
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统课程设计报告

院(系):信息与数学学院

专业:信息与计算科学

姓名:张三

班级:_信计11402

学号:12 29 14

题目:页面置换算法

指导教师:孙庆生

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"

#define N 20

#define num 3

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

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

typedef struct page /*页表映像*/

{

int address; /*页面地址*/

struct page *next;

} page;

struct page *head,*run,*rear;

void initial() /*进程分配物理块*/

{

int i=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;

}

void print()

{

page *p=head->next;

while(p)

{

if(p->address!=-1) /*避免输出-1*/

printf("%d\t",p->address);

p=p->next;

}

printf("\n");

}

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

page *p;

int i=0;

p=head;

while(p->next)

{

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

{

printf("Get it at the page %d\n",i+1);

run=p;

return 1;

}

p=p->next;

i++;

}

return 0;

}

void changeOPT(int n,int position)

{

int i;

int total=0;

int flag=1; /*默认链表填满*/

int distance[num]; /*用于存放距离*/

int MAX;

int order=0;

page *p,*q;

p=head->next;

q=head->next;

for(i=0; i

{