操作系统课程设计(LRU算法)完整版内含代码

操作系统课程设计(LRU算法)完整版内含代码
操作系统课程设计(LRU算法)完整版内含代码

操作系统课程设计LRU页面调度算法

学号:

姓名:

学院:

专业:

班级:

指导老师:

日期:

目录

一、实验题目 (1)

二、课程设计的目的 (1)

三、设计容 (1)

四、设计要求 (1)

五、设计思想 (1)

六、主要数据结构及其说明 (2)

七、硬件支持 (3)

八、源程序文件 (3)

九、程序运行结果 (7)

十、实验体会 (8)

一实验题目

LRU页面调度算法

二课程设计的目的

操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合一起,独立分析和解决实际问题的机会。

1.进一步巩固和复习操作系统的基础知识。

2. 培养学生结构化程序、模块化程序设计的方法和能力。

3.提高学生调试程序的技巧和软件设计的能力。

4.提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。

三设计容

程序应模拟实现LRU算法思想,对n个页面实现模拟调度。

四设计要求

1.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用接口要注释清楚。对程序其它部分也进行必要的注释。

2.对系统进行功能模块分析、画出总流程图和各模块流程图。

3.用户界面要求使用方便、简洁明了、美观大方、格式统一。所有功能可以反复使用,最好使用菜单。

4.通过命令行相应选项能直接进入某个相应菜单选项的功能模块。

5.所有程序需调试通过。

五设计思想

最近最久未使用(LRU)页调度算法是选择最近最久未使用的页面予以淘汰。

算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间,当所要访问的页面在存块中时,就不淘汰页面,否则,淘汰页面中时间最长的,即淘汰最近最久未使用的页面。

算法流程图

六主要数据结构及其说明

程序执行是稳定的,高效的。在LRU算法中,要找出最近最久未使用的页面的话,就必须设置有关的访问记录项,且每一次访问这些记录项,叶面都必须更新这些记录项。这个记录项在此程序中为:

typedef struct page

{

int num;/*记录页面号*/

int time;/*记录调入存时间*/

}Page;//页面逻辑结构,结构为方便算法实现设计

如此,显然要花费较大的系统开销(包括时间和空间上的),这也是实际系统中不采用LRU算法的直接原因,但由于其页面置换的优越性,实际系统中常使用LRU的近似算法。

七硬件支持

为了了解一个进程在存中的各个页面各有多少时间未被进程访问,以及如何快速的知道哪一页是最近最久未使用的页面,须有两类硬件之一的支持:寄存器或栈。

寄存器:为了记录某进程在存中各页的使用情况,须为每个在存中的页面配置一个移位寄存器。

栈:可利用一个特殊的栈来保存当前使用的各个页面的页面号。每当进程访问某页面时,便将该页面的页面号从战中移出,将它压入栈顶。因此,栈顶始终是最新被访问页面的编号,而栈底则是最近最久未使用页面的页面号。

八源程序文件

#include

#include

#include

#define M 3 //物理块数

#define N 10 //页面数

#define Myprintf1

printf("\t************************\t\t\n\n");//表格控制

#define Myprintf2

printf("******************************\n\n");//表格控制

typedef struct page

{

int num;/*记录页面号*/

int time;/*记录调入存时间*/

}Page;//页面逻辑结构,结构为方便算法实现设计

Page b[M];//存单元数

int c[M][N];//暂保存存当前的状态:缓冲区

int queue[100];//记录调入队列

int K;//调入队列计数变量

//初始化存单元、缓冲区

void Init(Page *b,int c[M][N])

{

int i,j;

for(i=0;i

{

b[i].num=-1;

b[i].time=N-i-1;

}

for(i=0;i

for(j=0;j

c[i][j]=-1;

}

//取得在存中停留最久的页面,默认状态下为最早调入的页面int GetMax(Page *b)

{

int i;

int max=-1;

int tag=0;

for(i=0;i

{

if(b[i].time>max)

{

max=b[i].time;

tag=i;

}

}

return tag;

}

//判断页面是否已在存中

int Equation(int fold,Page *b)

{

int i;

for(i=0;i

{

if(fold==b[i].num)

return i;

}

return -1;

}

//LRU核心部分

void Lru(int fold,Page *b)

{

int i;

int val;

val=Equation(fold,b);

if(val>=0)

{

b[val].time=0;

for(i=0;i

if(i!=val)

b[i].time++;

}

else

{

queue[++K]=fold;//记录调入页面

val=GetMax(b);

b[val].num=fold;

b[val].time=0;

for(i=0;i

if(i!=val)

b[i].time++;

}

}

//主程序

void main()

{

start:K=-1;

int i,j;

int a[N];

Myprintf1;

printf("\n\t\t\t欢迎使用LRU页面调度算法\n\n"); Myprintf1;

printf("请输入所要访问的各个页面号:\n");

for(i=0;i

scanf("%d",&a[i]);

Init(b,c); //调用

for(i=0;i

{

Lru(a[i],b);

c[0][i]=a[i];

//记录当前的存单元中的页面

相关主题
相关文档
最新文档