操作系统.docx

上传人:b****3 文档编号:26768510 上传时间:2023-06-22 格式:DOCX 页数:14 大小:238.56KB
下载 相关 举报
操作系统.docx_第1页
第1页 / 共14页
操作系统.docx_第2页
第2页 / 共14页
操作系统.docx_第3页
第3页 / 共14页
操作系统.docx_第4页
第4页 / 共14页
操作系统.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

操作系统.docx

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

操作系统.docx

操作系统

课程设计(大作业)报告

 

课程名称:

操作系统

设计题目:

Linux环境下FIFO、LRU内存调度算法模拟

院系:

信息技术学院

班级:

2009级本科一班

设计者:

罗芳薇

学号:

20091101143

指导教师:

段玻

设计时间:

2011.12.20———2011.12.23

 

昆明学院

昆明学院课程设计(大作业)任务书

姓名:

罗芳薇院(系):

信息技术学院

专业:

计算机科学与技术学号:

20091101143

任务起止日期:

2011.12.20———2011.12.23

课程设计题目:

Linux环境下FIFO、LRU内存调度算法模拟

课程设计要求及任务描述:

设计要求:

理解FIFO、LRU等常见内存调度算法的原理。

模拟实现其中FIFO、LRU两种调度算法。

采用这两种调度算法,对同一访问序列进行命中率计算和输出,并比较结果。

注:

命中率=1-缺页率。

能熟练运用操作环境实现命令,并能熟悉运用各种命令,并理解各种命令的功能和执行方式以及结果,并能熟练运用。

指导并了解FIFO、LRU命令的各种功能和作用等等。

实验环境及工具:

1.实验环境:

Linux

2.文本编辑工具:

Vi

3.编译器:

GCC

工作计划及安排:

2011年12月20日星期二下午:

老师安排实验要求,做相应的实验指导

2011年12月21日星期二上午:

图书馆查阅相关资料,了解实验目的

2011年12月21日星期二下午:

惟实楼3102机房进行命令的命令输入及查找

2011年12月22日星期三上午:

惟实楼3102机房进行命令的运行

2011年12月22日星期三下午:

跟老师同学交流本次课程设计的心得体会,做试验总结

2011年12月23日星期五:

交实验报告

 

指导教师签字

年月日

课程设计(大作业)成绩

学号:

20091101143姓名:

罗芳薇指导教师:

段玻

课程设计题目:

理解FIFO、OPT等常见内存调度算法的原理。

模拟实现其中FIFO、OPT两种调度算法。

采用这两种调度算法,对同一访问序列进行命中率计算和输出,并比较结果。

 

完成情况总结:

通过操作系统课程设计中我们理解FIFO、LRU等常见内存调度算法的原理。

模拟实现其中FIFO、LRU两种调度算法。

采用这两种调度算法,对同一访问序列进行命中率计算和输出,并比较结果。

并能熟悉运用各种命令,并理解各种命令的功能和执行方式以及结果,并能熟练运用。

指导并了解FIFO、LRU命令的各种功能和作用等等。

虽然在学习课本知识的时候感觉老师讲起来很好懂,但是一旦要运用到实际当中却不知道怎么转换,出现了对知识结构的空洞状态。

三种置换算法,特别是在FIFO算法与LRU算法的设计上出现了混乱状态,通过对运行结果的一次又一次的检查还有在老师的帮助下我才慢慢的洞察到自己到底哪里出现了问题,在设置置换标志与判断是否置换的条件设计上出现了考虑不周全的情况。

因为时间比较紧,实验内容比较复杂,实验过程中我们遇到了很多困难,比如在实验过程当中怎样熟练使用实验环境:

Linux,文本编辑工具:

Vi,编译器:

GCC等等.使用命令时不知道怎么操作,不知道怎么运行命令,但后来在老师的指导下,同学们的相互讨论交流中,还是解决了问题。

在进行命令调试时,一开始是不知道怎么操作等等,不知道怎么使用配置环境,后来在不断学习中,终于解决了问题,完成试验。

通过这次试验我深刻认识到团队合作的重要性,同学之间相互讨论学习的重要性,老师画龙点睛的作用,以及我们自己动手能力的重要等等。

指导教师评语:

 

成绩:

 

填表时间:

指导教师签名:

课程设计(大作业)报告

一、两种算法的原理分析

1.FIFO内存调度算法的原理

处理机要用到的指令或数据不在主存中时,会产生页面失效故障,应去辅存中将包含该指令或数据的一页调入主存。

通常虚拟空间比主存空间大得多,必然会出现主存页面位置已被全部占用后,又发生页面失效的情况,这时,将辅存的一页调入主存就会发生实页冲突。

只有强制腾出主存中某个页才能接纳由辅存中调来的新页。

选择主存中哪个页作为被替换的页,就是替换算法要解决的问题。

替换算法的确定主要是看按这种替换算法是否有高的主存命中率,其次是看算法是否便于实现,辅助软,硬件成本是否低。

先进先出算法FIFO选择最早装入主存的页作为被替换页。

这种算法实现起来方便,只需在操作系统为实现主存管理而设置的主存页面表中给每个实页配置一个计数字段即可。

每当一页装入主存时,让该页的计数器清零,其他已装入主存的那些页的计数器都加“1”。

需要替换时,找出计数器值最大的页,它就是最先进入主存而现在准备替换掉的页。

2.LRU内存调度算法的原理

LRU是LeastRecentlyUsed的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的。

关于操作系统的内存管理,如何节省利用容量不大的内存为最多的进程提供资源,一直是研究的重要方向。

而内存的虚拟存储管理,是现在最通用,最成功的方式——在内存有限的情况下,扩展一部分外存作为虚拟内存,真正的内存只存储当前运行时所用得到信息。

这无疑极大地扩充了内存的功能,极大地提高了计算机的并发度。

虚拟页式存储管理,则是将进程所需空间划分为多个页面,内存中只存放当前所需页面,其余页面放入外存的管理方式。

 

二、两种算法的流程图表示

1.FIFO算法的流程图

 

2.LRU内存调度算法的流程图

 

三、两种算法的实现代码

1.FIFO内存调度算法的代码

#defineTRUE1

#defineFALSE0

#defineINVALID-1

#defineNULL0

#definetotal_instruction320

#definetotal_vp32

#defineclear_period50

typedefstruct

{

intpn,pfn,counter,time;

}pl_type;

pltypepl[total_vp];

structpfc_struct

{

intpn,pfn;

structpfc_struct*next;

};

typedefstructpfc_structpfc_type;

pfc_typepfc[total_vp],*freepf_head,*busypf_head,*busypf_tail;

intdiseffect,a[total_instruction];

intpage[total_instruction],offset[total_instruction];

intinitialize(int);

intFIFO(int);

 

intmain()

{

ints,i,j;

srand(10*getpid());

s=(float)319*rand()/32767/32767/2+1;

for(i=0;i

{

if(s<0||s>319)

{

printf("Wheni==%d,Error,s==%d\n",i,s);

exit(0);

}

a[i]=s;

a[i+1]=a[i]+1;

a[i+2]=(float)a[i]*rand()/32767/32767/2;

a[i+3]=a[i+2]+1;

s=(float)(318-a[i+2])*rand()/32767/32767/2+a[i+2]+2;

if((a[i+2]>318||(s>319))

printf("a[%d+2],anumberwhichis:

%dands==%d\n",i,a[i+2],s);

}

for(i=0;i

{

page[i]=a[i]/10;

offset[i]=a[i]%10;

}

for(i=4;i<=32;i++)

{

printf("---%2dpageframes---\n",i);

FIFO(i);

}

return0;

}

intinitialize(total_pf)

inttotal_pf;

{

inti;

diseffect=0;

for(i=0;i

{

pl[i].pn=i;

pl[i].pfn=INVALID;

pl[i].counter=0;

pl[i].time=-1;

}

for(i=0;i

{

pfc[i].next=&pfc[i+1];

pfc[i].pfn=i;

}

pfc[total_pf-1].next=NULL;

pfc[total_pf-1].pfn=total_pf-1;

freepf_head=&pfc[0];

return0;

}

 

intFIFO(total_pf)

inttotal_pf;

{

inti,j;

pfc_type*p;

initialize(total_pf);

busypf_head=busypf_tail=NULL;

for(i=0;i

{

if(p1[page[i]].pfn==INVALID)

{

diseffect+=1;

if(freepf_head==NULL)

{

p=busypf_head->next;

p1[busypf_head->pn].pfn=INVALID;

freepf_head=busypf_head;

freepf_head->next=NULL;

busypf_head=p;

}

p=freepf_head->next;

freepf_head->next=NULL;

freepf_head_>pn=page[i];

p1[page[i]].pfn=freepf_head->pfn;

if(busypf_tail==NULL)

busypf_head=busypf_tail=freepf_head;

else

{

busypf_tail->next=freepf_head;

busypf_tail=freepf_head;

}

freepf_head=p;

}

}

printf("FIFO:

%6.4f\n",1-(float)diseffect/320);

return0;

}

2.LRU内存调度算法的代码

public class LRUCacheHelper {

    readonly Dictionary _dict;

    readonly LinkedList _queue = new LinkedList();

    readonly object _syncRoot = new object();

    private readonly int _max;

    public LRUCacheHelper(int capacity, int max) {

        _dict = new Dictionary(capacity);

        _max = max;

    }

 

    public void Add(K key, V value) {

        lock (_syncRoot) {

            checkAndTruncate();

            _queue.AddFirst(key);   //O

(1)

            _dict[key] = value;     //O

(1)

        }

    }

 

    private void checkAndTruncate() {

        lock (_syncRoot) {

            int count = _dict.Count;                        //O

(1)

            if (count >= _max) {

                int needRemoveCount = count / 10;

                for (int i = 0; i < needRemoveCount; i++) {

                    _dict.Remove(_queue.Last.Value);        //O

(1)

                    _queue.RemoveLast();                    //O

(1)

                }

            }

        }

    }

 

    public void Delete(K key) {

        lock (_syncRoot) {

            _dict.Remove(key); //

(1)

            _queue.Remove(key); // O(n)

        }

    }

    public V Get(K key) {

        lock (_syncRoot) {

            V ret;

            _dict.TryGetValue(key, out ret);    //O

(1)

            _queue.Remove(key);                 //O(n)

            _queue.AddFirst(key);               //

(1)

            return ret;

        }

    }

}

四、结果分析

1.分析设计结果是否达到预期目标

通过分析设计结果,虽然没有预期的目标好。

实验过程中也遇到了许多的问题,但是在我们的不断尝试下终于基本达到实验要求。

2.针对同一访问序列比较两种算法的命中率

1)运行结果

1.1FIFO算法与LRU算法命中率一样的情况

1.2FIFO算法命中率最低的情况

1.3FIFO算法比LRU算法命中率高的情况

2.运行结果分析

 三种结果告诉我们FIFO算法和LRU算法在不同的情况下略有不同,但是淘汰的页面却有很大不同。

在理论上来说,LRU算法优于FIFO算法。

五、实验总结及心得体会

通过这次课程设计,不仅让我了解了页面置换算法,而且使我对操作系统这门课程有了更进一步的认识和了解,要想学好它要重在实践。

在有充分的理论基础的情况下要通过不断的上级操作才能更好地学习它。

在编好程序后,我一开始就一味的进行调试,急切的想侥幸调试出来,但由于没有进行深入的考虑,我调试了很久都没有成功,我仔细的分析题目,分析材料,在原有基础上我进行了改正,经过了一番努力,最后还是调试成功了。

同时在编程阶段,我发现自己在逻辑思维的设计上还存在一定的缺陷,一些C语言的基础知识还未掌握到位,对于函数的形参与实参之间的转化还不是很清楚。

两种置换算法,特别是在FIFO算法与LRU算法的设计上出现了混乱状态,通过对运行结果的一次又一次的检查还有在老师的帮助下我才慢慢的洞察到自己到底哪里出现了问题,在设置置换标志与判断是否置换的条件设计上出现了考虑不周全的情况。

在找空闲物理块的时候,起初我比较物理块是否等于0,若为0,则直接把页面放入,后来发现不论什么时候都是把0替换出去,才恍然大悟,既然页面序列数有0就不能用0来表示空闲物理块,后来换成-1问题就解决了。

实验过程中我们遇到了很多困难,比如在实验过程当中怎样熟练使用实验环境:

Linux,文本编辑工具:

Vi,编译器:

GCC等等.使用命令时不知道怎么操作,不知道怎么运行命令,但后来在老师的指导下,同学们的相互讨论交流中,还是解决了问题。

在进行命令调试时,一开始是不知道怎么操作等等,不知道怎么使用配置环境,后来在不断学习中,终于解决了问题,完成试验。

通过这次试验我深刻认识到团队合作的重要性,同学之间相互讨论学习的重要性,老师画龙点睛的作用,以及我们自己动手能力的重要等等。

虽然在学习课本知识的时候感觉老师讲起来很好懂,但是一旦要运用到实际当中却不知道怎么转换,出现了对知识结构的空洞状态。

但运用到实际仍然有许多问题,所以我们应该吸取教训,争取做的更好。

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

当前位置:首页 > 自然科学 > 生物学

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

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