操作系统课程设计报告 5Word文件下载.docx
《操作系统课程设计报告 5Word文件下载.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计报告 5Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
N-Step-SCAN磁盘调度中涉及的数据结构包括N个队列、队列缓冲区、表示空缓冲区的信号量、表示满缓冲区的信号量…等。
用伪代码表示如下:
#include"
stdio.h"
stdlib.h"
//#include"
iostream.h"
#definemaxsize100//定义最大数组域
intnow,s;
voidSSTF(intarray[],intm)
{
inttemp;
intk=1;
intnow,l,r;
//当前磁道号now;
找出的当前磁道左侧的磁道l,右侧的磁道r
inti,j,sum=0;
intavg;
for(i=0;
i<
m;
i++)
{
for(j=i+1;
j<
j++)//对磁道号进行从小到大排列
{
if(array[i]>
array[j])//两磁道号之间比较
{
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
for(i=0;
i++)//输出排序后的磁道号数组
printf("
%d"
array[i]);
printf("
\n请输入当前的磁道号:
"
);
scanf("
%d"
&
now);
\nSSTF调度结果:
"
if(array[m-1]<
=now)//判断整个数组里的数是否都小于当前磁道号
{
for(i=m-1;
i>
=0;
i--)//将数组磁道号从大到小输出
sum=now-array[0];
//计算移动距离
elseif(array[0]>
=now)//判断整个数组里的数是否都大于当前磁道号
for(i=0;
i++)//将磁道号从小到大输出
sum=array[m-1]-now;
else
while(array[k]<
now)//逐一比较以确定K值
k++;
l=k-1;
r=k;
//确定当前磁道在已排的序列中的位置
while((l>
=0)&
&
(r<
m))
if((now-array[l])<
=(array[r]-now))//判断最短距离
{
printf("
array[l]);
sum+=now-array[l];
now=array[l];
l=l-1;
else
array[r]);
sum+=array[r]-now;
now=array[r];
r=r+1;
if(l==-1)
{
for(j=r;
j++)
array[j]);
sum+=array[m-1]-array[0];
else
for(j=l;
j>
j--)
avg=sum/m;
\n移动的总道数:
%d\n"
sum);
平均寻道长度:
avg);
voidSCAN(intarray[],intm,intd)//先要给出当前磁道号和移动臂的移动方向
intl,r;
//用于排序的临时参数
intq;
array[j])//对磁道号进行从小到大排列
\nSCAN调度结果:
i--)
printf("
//将数组磁道号从大到小输出
q=array[i];
sum=now-q;
s=s+sum;
now=q;
//将磁道号从小到大输出
s=s+sum;
if(d==0)
q=array[j];
sum=now-2*array[0]+array[m-1];
now=q;
}//磁道号减小方向
sum=-now-array[0]+2*array[m-1];
}//磁道号增加方向
\n该子队列移动的总道数:
该子队列平均寻道长度:
}
voidNStepSCAN(intarray[],intm)
{
intsn,N,d;
//sn标记每一子队列的长度,N记录子队列个数,now标记当前磁道号
intb[100],c[100];
//b[100]储存前几个子队列,c[100]储存最后一个子队列
inti=0,j=0,k=0,n=1;
intave;
请输入当前磁道号:
\n"
请输入子队列的个数:
N);
while(N<
1||N>
m)
超出范围,文件中的磁道数不够分组,请重新输入:
请输入当前移动臂的移动的方向(1磁道号增加方向,0磁道号减小方向):
d);
sn=m/N;
while(N!
=1)//当不是最后一个子队列时,循环进行SCAN调度
j=0;
for(i=k;
sn*n;
i=k,j++)
b[j]=array[i];
k=k+1;
\n第%d个队列的排序结果为:
n);
SCAN(b,sn,d);
N=N-1;
n=n+1;
if(N==1)//最后一个子队列时进行SCAN调度
for(i=k,j=0;
i++,j++)
c[j]=array[i];
\n最后一个队列的调度结果为:
SCAN(c,m-k,d);
ave=s/m;
\n该调度总的结果为:
s);
ave);
intmain()
intc;
intC=1;
FILE*fp;
//定义指针文件
intcidao[maxsize];
//定义磁道号数组
inti=0,count;
fp=fopen("
cidao.txt"
"
r+"
//读取cidao.txt文件
if(fp==NULL)//判断文件是否存在
\n请先设置磁道!
\n"
exit(0);
while(!
feof(fp))//如果磁道文件存在
fscanf(fp,"
cidao[i]);
//调入磁道号
i++;
count=i;
\n--------------------------------------------------\n"
磁盘调度算法模拟"
\n磁道读取结果:
count;
%5d"
cidao[i]);
//输出读取的磁道的磁道号
\n"
while(C==1)
║操作系统课程设计║\n"
╭═════┤磁盘调度算法├═════╮\n"
║1.返回║\n"
║2.N步扫描算法(NStepScan)║\n"
╰═┤请输入你的选择的算法(输入0离开)├═╯\n"
c);
if(c==0)exit(0);
while(c!
=1&
c!
=2)
输入数据超出范围,请重新输入您想进行的调度算法:
switch(c)
case1:
SSTF(cidao,count);
//最短寻道时间优先算法
break;
case2:
i=0;
if(fp==NULL)//判断文件是否存在
{
printf("
exit(0);
}
fscanf(fp,"
i++;
NStepSCAN(cidao,count);
//N步扫描算法
是否继续(按0结束,按1继续)?
scanf("
C);
return0;
1.3流程图
1.4实现技术
为实现上述设计,采用C++语言,VS2008开发环境。
运行结果如下:
1.5设计结论和心得
通过课程设计得到如下结论:
在N步扫描算法中,还出现了这样一个问题。
就是,在对磁道号进行分组时,最后一列的处理问题。
在开始时由于笼统地进行了平均分组,而没有考虑无法完全分尽的情况,进而导致最后一个甚至一些磁道号丢失的问题。
不过最后,在单列最后一组后(即将最后一组与前面各组分开后)问题得到了解决。
将余下的一个或一些磁道号全部加至最后一列末尾,很好地处理了数据丢失问题
有如下几点心得体会:
通过这次的课程设计使我认识到要将操作系统这门计算机专业的课学好不仅仅是要把书上的基本知识学好而且还要不断进行实践,将所学的跟实践操作结合起来才能更好地巩固所学,才能提高自己实践能力.通过这次的设计使我认识到只停留在表面理解问题是很难使问题得到很好的解决的,实践能力与理论知识同样重要。
可以说此课程设计的理论难度并不大,但是若要深入发掘其中的东西,并且实际去编程实现,就遇到了相当大的难度。
因为与之涉及的很多方面并没有学过,需要自己去自学和实践检验。
通过模拟磁盘调度及进程排队算法来加深对操作系统中各个磁臂调度算法概念的理解。
模拟磁盘调度算法(SSTF,NstepSCAN),实现各种不同调度算法的过程,并计算各算法的平均寻道长度,以便于我们判断各种算法的优劣以及各种算法使用的场合。
2Linux代码分析
为了进一步了解操作系统内核,学习了Linux操作系统的进程同步程序,主要程序源代码如下:
#!
/bin/sh
#Author:
GuoWenxue(guowenxue@)
#Date:
WenMar517:
56:
44CST2013
#Version:
1.0.0
#Description:
Thisshellscriptusedtoformatallthesourcecodeincurrentforlder
#andconvertsourcecodefileformatfromwindowstolinux
find-iname"
*.c"
-execdos2unix{}\;
*.h"
makefile"
Makefile"
#-npro不要读取indent的配置文件.indent.pro
#-kr使用Kernighan&
Ritchie的格式
#-i4设置缩排的格数为4
#-di28将声明区段的变量置于指定的栏位(28)
#-ts4设置tab的长度为4
#-bls定义结构,"
struct"
和"
{"
分行
#-blif(或是else,for等等)与后面执行区段的”{“不同行,且”}”自成一行。
#-bli0设置{}缩排的格数为0
#-cli2使用case时,switch缩排的格数
#-ss若for或whiile区段只有一行时,在分号前加上空格
#-bad在声明区段后加上空白行
#-bbb块注释前加空行
#-bap函数结束后加空行
#-sc在每行注释左侧加上星号(*)。
#-bc在声明区段中,若出现逗号即换行。
#-sob删除多余的空白行
#-l100非注释行最长100
#-ncs不要在类型转换后面加空格
#-nce不要将else置于”}”之后
#-nut不要使用tab来缩进
INDET_FORMAT="
-npro-kr-i4-ts4-bls-bl-bli0-cli2-ss-bap-sc-sob-l100-ncs-nce-nut"
-execindent$INDET_FORMAT{}\;
*.h~"
|xargsrm-rf{}\;
2.1功能说明
这一段程序的主要功能为:
(1)在/usr/sbin/目录下创建format_sg文件
(2)更改其属性为777
2.2接口说明
本程序的输入参数为:
INDET_FORMAT="
2.3局部数据结构
本程序共有6个局部变量及数据结构,其类型定义及语义如下:
-npro不要读取indent的配置文件.indent.pro
2.4流程图
本程序的流程图所示
图2 程序流程图
2.5实例说明:
format_sg
[root@ShiGuangsongjingbing]#format_sg
dos2unix:
convertingfile./tcp_process.ctoUNIXformat...
convertingfile./tcp_client.ctoUNIXformat...
convertingfile./tcp_server.ctoUNIXformat...
convertingfile./MakefiletoUNIXformat...
[root@ShiGuangsongjingbing]#