操作系统实习报告文件管理模拟.docx
- 文档编号:29831378
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:16
- 大小:141.32KB
操作系统实习报告文件管理模拟.docx
《操作系统实习报告文件管理模拟.docx》由会员分享,可在线阅读,更多相关《操作系统实习报告文件管理模拟.docx(16页珍藏版)》请在冰豆网上搜索。
操作系统实习报告文件管理模拟
操作系统小学期
----文件管理模拟
学院:
信息科学与技术
专业:
计算机科学与技术
年级:
班级:
姓名:
学号:
日期:
2011年9月
一.问题描述
文件管理是操作系统的五大职能之一,主要涉及文件的逻辑组织和物理组织,目录的结构和管理。
主要的磁盘调度算法有:
1.先来先服务算法(FCFS);2.最短寻道时间优先算法(SSTF);3.扫描算法(SCAN);4.循环扫描算法(CSCAN)等。
用程序模拟磁盘的调度过程,并计算各磁盘调度算法包括先来先服务算法、最短寻道时间优先算法、扫描算法和循环扫描算法的平均寻道长度。
二.问题分析
在多道程序设计的计算机系统中,各个进程可能会不断提出不同的对磁盘进行读/写操作的请求。
由于有时候这些进程的发送请求的速度比磁盘响应的还要快,因此我们有必要为每个磁盘设备建立一个等待队列。
先来先服务(FCFS:
afirst-come-first-served)的策略,即先来的请求先被响应。
FCFS策略看起来似乎是相当"公平"的,但是当请求的频率过高的时候FCFS策略的响应时间就会大大延长。
FCFS策略为我们建立起一个随机访问机制的模型,但是假如用这个策略反复响应从里到外的请求,那么将会消耗大量的时间。
为了尽量降低寻道时间,看来我们需要对等待着的请求进行适当的排序,而不是简单的使用FCFS策略。
这个过程就叫做磁盘调度管理。
有时候fcfs也被看作是最简单的磁盘调度算法。
最短时间优先算法(SSTF)选择这样的进程。
要求访问的磁道,与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。
扫描(SCAN)调度算法:
该算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。
例如,当磁头正在自里向外移动时,SCAN算法所考虑的下一个访问对象,应是其欲访问的磁道,既在当前磁道之外,又是距离最近的。
这样自里向外的访问,直至再无更外的磁道需要访问时,才将磁道换向自外向里移动。
这时,同样也是每次选择这样的进程来调度,也就是要访问的当前位置内距离最近者,这样,磁头又逐步地从外向里移动,直至再无更里面的磁道要访问,从而避免了出现“饥饿”现像。
循环扫描(CSCAN)算法:
当磁头刚从里向外移动而越过了某一磁道时,恰好又有一进程请求访问此磁道,这时,该里程就必须等待,为了减少这种延迟,CSCAN算法规定磁头单向移动,本实验已完全能演示循环扫描的全过程。
三.数据模型描述
intHand=10; //初始的磁道数
intlimit=10;//寻找的范围
intJage=0;
floatAver=0;
intNAll=0;
int[]Dis=newint[10];//存放寻道顺序
int[,]Best=newint[50,2];//Best[][1]存放移动磁道数,Best[][0]存放算法的序号
四.算法描述
(1)先来先服务算法(FCFS)
publicvoidFCFS(intHan,int[]DiscL)
{int[]RLine=newint[10];
inti,k,All,Temp;//Temp是算移动的磁道距离的临时量
All=0; //统计全部的磁道数变量
k=9; //限定10个的磁道数
CopyL(DiscL,RLine,9); //复制磁道号到临时数组RLine
All=Han-RLine[0];
for(i=0;i<=9;i++)
{
Temp=RLine[0]-RLine[1];
if(Temp<0)
Temp=(-Temp);//移动磁道数为负数时算出相反数作为移动磁道数
result.Text+=RLine[0]+"";
All=Temp+All;DelInq(RLine,0,k);k--;
}
Best[Jage,1]=All;//Best[][1]存放移动磁道数
Best[Jage,0]=1;//Best[][0]存放算法的序号为:
1
Jage++;Aver=((float)All)/10;//求平均寻道次数
label7.Text=All.ToString();label9.Text=Aver.ToString();
}
流程图如下:
(2)最短时间优先算法(SSTF)
publicvoidSSTF(intHan,int[]DiscL)
{
inti,j,k,h,All;
intTemp; //Temp是计算移动的磁道距离的临时变量
int[]RLine=newint[10]; //将随机生成的磁道数数组Discl[]复制给数组RLine[]
intMin;
h=0;
All=0; //统计全部的磁道数变量
k=9; //限定10个的磁道数
CopyL(DiscL,RLine,9); //复制磁道号到临时数组RLine
for(i=0;i<=9;i++)
{
Min=64000;
for(j=0;j<=k;j++)//内循环寻找与当前磁道号最短寻道的时间的磁道号
{
if(RLine[j]>Han)//如果第一个随机生成的磁道号大于当前的磁道号执行下一句
Temp=RLine[j]-Han; //求出临时À的移动距离
else
Temp=Han-RLine[j]; //求出临时的移动距离
if(Temp { Min=Temp; //Temp临时值赋予Min h=j; //把最近当前磁道号的数组下标赋予h } } All=All+Min; //统计一共移动的距离 result.Text+=RLine[h]+""; Han=RLine[h]; DelInq(RLine,h,k); //每个磁道数向前移动一位 k--; } Best[Jage,1]=All;//Best[][1]存放移动磁道数 Best[Jage,0]=2;//Best[][0]存放算法的序? 为a: 2 Jage++;//排序序号加 Aver=((float)All)/10;//求平均寻道次数 label7.Text=All.ToString(); label9.Text=Aver.ToString(); } 流程图如下: (3)扫描算法(SCAN) publicintSCAN(intHan,int[]DiscL,intx,inty) { intj,n,k,h=0,m,All;intt=0;intTemp;intMin; int[]RLine=newint[10];//将随机生成的磁道数数Discl[]复制给数组RLine[] intOrder;Order=1;k=y; m=2; //控制while语句的执行 All=0; //统计全部的磁道数变量 CopyL(DiscL,RLine,9); //复制磁道号到临时数组RLine Min=64000; for(j=x;j<=y;j++) //寻找与当前磁道号最短寻道的时间的磁道号 { if(RLine[j]>Han) //如果第一个磁道号大于当前的磁道号执行下一句 Temp=RLine[j]-Han; //求出临时的移动距离 else Temp=Han-RLine[j]; //求出临时的移动距离 if(Temp { Min=Temp; //Temp临时值赋予Min h=j; //把最近当前磁道号的数组下标赋予 } } All=All+Min; result.Text+=RLine[h]+""; if(RLine[h]>=Han) { //判断磁道的移动方向,即是由里向外还是由外向里 Order=0;t=1; } Han=RLine[h]; DelInq(RLine,h,k); //每个磁道数向前移动一位 k--; while(m>0) { if(Order==1) //order是判断磁盘扫描的方向标签,order是1的话磁道向内移动 { for(j=x;j<=y;j++) { h=-1; Min=64000; for(n=x;n<=k;n++) //判断离当前磁道最近的磁道号? { if(RLine[n]<=Han) { Temp=Han-RLine[n]; if(Temp { Min=Temp; //Temp临时值赋予Min h=n; //把最近当前磁道号的数组下标赋予 } } } if(h! =-1) { All=All+Min; //叠加移动距离 result.Text+=RLine[h]+""; Han=RLine[h];//最近磁道号作为当前磁道 DelInq(RLine,h,k); k--; } } Order=0; //当完成向内的移动order赋予0执行Delse语句,使磁道向外移动 m--; //向内完成一次,m减一次,保证while循-环执行两次 } else //order是0的话,磁道向外移动 { for(j=x;j<=y;j++) {h=-1;Min=64000; for(n=x;n<=k;n++) //判断离当前磁道最近的磁道号? { if(RLine[n]>=Han) { Temp=RLine[n]-Han; if(Temp { Min=Temp; //Temp临时值赋予Min h=n; //把最近当前磁道号的数组下标赋予 } } } if(h! =-1) { All=All+Min; //叠加移动距离 result.Text+=RLine[h]+""; Han=RLine[h]; //最近的磁道号作为当前磁道 DelInq(RLine,h,k);k--; } } Order=1;//当完成向内的移动order赋予0执行Delse语句使磁道向外移 m--; //向内完成一次减一次,保证while循-环执行两次 } } NAll=NAll+All; if((y-x)>5) { Best[Jage,1]=All;//Best[][1]存放移动磁道数 Best[Jage,0]=3;//Best[][0]存放算法的序号为: 3 Jage++;//排序序号加1 Aver=((float)All)/10;//求平均寻道次数 label7.Text=All.ToString(); label9.Text=Aver.ToString(); } return(Han); } 流程图如下: (4)循环扫描算法(CSCAN) publicvoidCSCAN(intHan,int[]DiscL) { intj,h,n,Temp,m,k,All,Last,i; int[]RLine=newint[10]; //将磁道数数组Discl[]复制给数组RLine[] intMin;inttmp=0;m=2;k=9; All=0; //统计全部的磁道数变量 Last=Han; CopyL(DiscL,RLine,9); //复制磁道号到临时数组RLine while(k>=0) { for(j=0;j<=9;j++) //从当前磁道号开始由内向外搜索离当前磁道最近¨磁道号 {h=-1; Min=64000; for(n=0;n<=k;n++) { if(RLine[n]>=Han) { Temp=RLine[n]-Han; if(Temp { Min=Temp;h=n; } } } if(h! =-1) { All=All+Min; //统计一共移动的距离 result.Text+=RLine[h]+""; Han=RLine[h]; Last=RLine[h]; DelInq(RLine,h,k); k--; } } if(k>=0) {tmp=RLine[0]; for(i=0;i { if(tmp>RLine[i])tmp=RLine[i];} Han=tmp;//把最小的磁道号赋给Han Temp=Last-tmp;//求出最大磁道号和最小磁道号的距离差 All=All+Temp; } }//endwhlie Best[Jage,1]=All;//Best[][1]存放移动磁道数 Best[Jage,0]=4;//Best[][0]存放算法的序号为: 4 Jage++;//排序序号加1 Aver=((float)All)/10;//求平均寻道次数 label7.Text=All.ToString(); label9.Text=Aver.ToString(); } 流程图如下: 五.实习心得 此次设计基本完成了所规定的功能,但由于这次设计的时间比较仓促,其中不免会有些纰漏,比如在程序的实现上还不够严谨,出错处理不够完善等多方面问题,这些都有进一步改善。 由于平时上课不是很认真许多概念没有理解清楚,导致在做设计时有点无从下手的感觉,只好边实验边看书直到弄懂概念后才开始做设计导致时间有点紧张,最终在同学和老师的指导下我完成了设计,此设计基本能够实现规定的要求但是还是不够完善,很多东西做的不够好,程序不够完善和严谨。 此次课程设计中我学到了很多东西,无论在理论上还是实践中,都得到不少的提高,这对于我以后的工作和学习都有一种巨大的帮助。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实习 报告 文件 管理 模拟