驱动调度Word下载.docx
- 文档编号:22489554
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:26
- 大小:397.34KB
驱动调度Word下载.docx
《驱动调度Word下载.docx》由会员分享,可在线阅读,更多相关《驱动调度Word下载.docx(26页珍藏版)》请在冰豆网上搜索。
无
出口参数:
流程图:
如图2所示
4.2.2随机数函数:
floatRan_Num()
接收随机数
接收进来的随机数
4.2.3接收请求函数:
voidlist(intpro_count,intpro_num,processpro[M])
存放输入的进程信息,创建等待进程列表
初始化后的进程数组
如图3所示
4.2.4旋转调度函数:
voidcir_sec(processpro[M])
如果有请求与当前柱面号相同,进行旋转调度,选择旋转距离最小的进程
部分全局变量及进程数组
选择的数组元素编号
如图4所示
4.2.5移臂调度函数:
voidmov_sec(processpro[M])
没有与当前柱面号相同的访问请求时,进行移臂调度
进程数组
如图5所示
4.2.6驱动调度函数:
voiddri_sch(intpro_count,processpro[M])
进行进程调度,按照电梯调度算法选择进程
当前有效进程数、进程数组
如图6所示
5设计结果与分析
5.1运行结果如下
图7初始状态
图8输入5个进程的相关信息
图9第一次选择后结果
图10第二次选择后结果
图11第三次选择后结果
图12第四次选择后结果
图13第五次选择后,进程等待表为空
图14再输入3个进程及相关信息
图15再次输入后第一次选择
图16再次输入后第二次选择
图17第三次选择后等待表为空,选择退出
5.2结果分析
5.2.1初始状态,结果如图7所示
5.2.2输入0.4,输入进程数据并选择继续,结果如图8所示
5.2.3重复选择继续,输入0.6进行驱动调度直到等待进程表为空,结果如图9~图13所示
第一次选择P5
第二次选择P3
第三次选择P1
第四次选择P4
第五次选择P2,当前等待表为空
5.2.4选择继续,输入0.4,再输入3个进程,结果如图14所示
5.2.5重复选择继续进行驱动调度至等待进程表为空,然后选择退出,结果如图15~图17所示
第一次选择P8
第二次选择P6
第三次选择P7,当前等待表为空,选择退出
6课设总结
1、通过设计数据结构进程访问磁盘,我进一步了解了磁盘存储器的物理结构,对电梯算法有深入的了解。
2、刚刚开始进行实习设计时,对题目没有进行正确的理解就忙于写代码,算法设计考虑的很不全面,从而导致后来实验数据出错,通过再次审查题目及资料,我了解了题目要求,对算法进行了重新设计,最终完成了试验,得出了正确的运行结果。
3、在调试的过程中出现了很多的问题,从语法到算法中的错误,通过向老师和同学请教以及查阅资料,解决了这些问题,使我对编程语句及算法设计有了更深的认识。
编程是很严谨的事情,不容半点马虎,即使是一个括号也可能导致程序的错误。
7参考文献
[1]谢宋和,甘勇.单片机模糊控制系统设计与应用实例[M].北京:
电子工业出版社,1999.5:
20-25
[2]潘新民,王燕芳.微型计算机控制技术[M],第2版.北京:
电子工业出版社,2003.4:
305-350
[3]范立南,谢子殿.单片机原理及应用教程[M].北京:
北京大学出版社,2006.1:
123-130
[4]NewmanWM,SbroullRF.PrinciplesofInteractiveComputerGraphics[M].NewYork:
McGrawHill,1979.10:
10-25
[5]卜小明,龙全求.一种薄板弯曲问题的四边形位移单元[J].力学学报,1991,23
(1):
53-60
[6]MastriAR.Neuropathyofdiabeticneurogenicbladder[J].AnnInternMed,1980,92
(2):
316-318
[7]范立南,韩晓微,王忠石等.基于多结构元的噪声污染灰度图像边缘检测研究[J].武汉大学学报(工学版),2003,49(3):
45-49
[8]index.asp
8源程序代码
pro_struct.h
#ifndefPRO_STRUCT_H
#definePRO_STRUCT_H
#defineN10
typedefstructProcess
//进程名
//请求的柱面号
//请求的磁道号
//请求的物理记录号
//标记位
#endif
pro_list.h
#ifndefPRO_LIST_H
#definePRO_LIST_H
#include<
iostream>
string.h>
#include"
pro_struct.h"
usingnamespacestd;
#defineM100
voidlist(intpro_count,intpro_num,processpro[M])//创建等待进程表
cout<
<
"
等待的进程数:
;
cin>
>
pro_num;
if(pro_num>
0&
&
(pro_num+pro_count)<
=M)//判断要输入的进程数是否合法,输入后是否超出进程等待表所允许的最大值
{
cout<
开始输入"
endl;
inti,j=0,h;
for(i=0;
i<
M;
i++)
{
for(;
pro[i].signal==0&
j<
j++)
{
cin>
pro[i].name>
pro[i].cyl_num>
pro[i].tra_num>
pro[i].rec_num;
for(h=0;
h<
h++)
{
if(pro[h].signal==1)
{
while(strcmp(pro[h].name,pro[i].name)==0||strlen(pro[i].name)>
10)
{
cout<
进程名不合规定,超出指定长度或已存在,请重新输入进程名:
cin>
pro[i].name;
}
}
}
while(pro[i].cyl_num<
0||pro[i].cyl_num>
199)//判断柱面号是否越界
cout<
柱面号不合规定,请重新输入柱面号:
cin>
pro[i].cyl_num;
}
while(pro[i].tra_num<
0||pro[i].tra_num>
19)//判断磁道号是否越界
磁道号不合规定,请重新输入磁道号:
pro[i].tra_num;
while(pro[i].rec_num<
0||pro[i].rec_num>
7)//判断物理记录号是否越界
物理记录号不合规定,请重新输入物理记录号:
pro[i].signal=1;
}
}
}
else
if(pro_num<
=0)
cout<
要输入的进程个数必须为正整数"
else
进程数超出进程等待表所允许的最大量"
当前最多允许输入"
(M-pro_count)<
个进程"
}
Driver_Scheduling.h
iomanip>
pro_list.h"
intdir=0;
//0,up向里;
1,down向外
intcylinder=0;
intrecord=0;
intmin_rec=0;
//移动到当前进程扇区所要移动的距离
intmin_r=8;
//旋转调度中最小移动距离
intmax_min_cyl=200;
//大于当前柱面号的访问请求中的最小者
intmin_min_cyl=200;
//小于当前柱面号的访问请求中的最小者
intx;
intchoosen=0;
//被选中的进程
voidcir_sec(processpro[M])//旋转调度
if(pro[x].rec_num<
record)
min_rec=8-(record-pro[x].rec_num);
min_rec=pro[x].rec_num-record;
if(min_rec<
=min_r)//首选移动距离最小,再选磁盘号最小
min_r=min_rec;
//选择移动距离最小的请求
choosen=x;
voidmov_sec(processpro[M])//移臂调度
intcount_abo=0;
intcount_low=0;
if(dir==0)//如果方向向里up
for(x=0;
x<
x++)
if(pro[x].signal==1)
if(pro[x].cyl_num>
cylinder)
count_abo++;
if(count_abo>
0)//有进程柱面号大于当前柱面号
for(x=0;
if(pro[x].signal==1)
if(pro[x].cyl_num>
cylinder&
pro[x].cyl_num<
max_min_cyl)//从大于当前柱面号的访问请求中选择一个最小者
max_min_cyl=pro[x].cyl_num;
choosen=x;
if(pro[x].cyl_num==max_min_cyl)//从大于当前柱面号的访问请求中选择一个最小者
cir_sec(pro);
//旋转调度
dir=1;
//改方向为向外,down
if(pro[x].cyl_num<
min_min_cyl)//从小于当前柱面号的访问请求中选择一个最小者
min_min_cyl=pro[x].cyl_num;
if(pro[x].cyl_num==min_min_cyl)
if(pro[x].cyl_num<
count_low++;
if(count_low>
if(pro[x].cyl_num=min_min_cyl)
dir=0;
//改方向为向里up
voiddri_sch(intpro_count,processpro[M])//电梯调度
max_min_cyl=200;
min_min_cyl=200;
min_r=8;
choosen=0;
intcount_equ=0;
if(pro_count!
=0)//有等待访问的进程
当前请求I/O表为:
┌─────────────────┐"
│进程名│柱面号│磁道号│物理记录号│"
└─────────────────┙"
cout.setf(ios:
:
left);
cout<
"
setw(10)<
pro[x].name<
setw(8)<
pro[x].tra_num<
pro[x].rec_num<
cout.unsetf(ios:
if(pro[x].cyl_num==cylinder)//有进程柱面号等于当前柱面号
count_equ++;
if(count_equ>
0)
if(pro[x].cyl_num==cylinder)
cir_sec(pro);
mov_sec(pro);
//移臂调度
cylinder=pro[choosen].cyl_num;
record=pro[choosen].rec_num;
pro[choosen].signal=0;
if(dir==0)
选择的进程为:
┌────────────────┐"
│进程名│柱面号│物理记录号│方向│"
└────────────────┙"
cout.setf(ios:
pro[choosen].name<
pro[choosen].cyl_num<
pro[choosen].rec_num<
up"
cout.unsetf(ios:
down"
}
}
else
请求I/O表为空"
ran_num.h
stdlib.h>
floatran_num;
/*floati;
i=float(rand());
if(i==0||1)
ran_num=i;
ran_num=1/i;
*/
输入随机数[0,1]:
随机数>
0.5时转入电梯调度"
随机数<
=0.5时转入接收请求"
ran_num;
return(ran_num);
qddd.cpp
Driver_Scheduling.h"
ran_num.h"
***************************************************************************"
请按照如下顺序输入各进程信息,以空格分开,每条进程信息输入完成后按回车键结束:
进程名柱面号磁道号物理记录号"
注:
进程名不超过10个字符,柱面号为0-199,磁道号为0-19,物理记录号为0-7"
inti;
processpro[M];
//创建进程数组
for(i=0;
i++)//初始化进程数组中所有项的标记位为0,即该项未存入进程信息
pro[i].signal=0;
intpro_num=0;
charsignal='
Y'
intpro_count;
//进程等待表中进程数
while(signal=='
||signal=='
y'
)
if(Ran_Num()>
0.5)//如果随即数大于0.5,转到调度模块
{
pro_count=0;
for(i=0;
if(pro[i].signal==1)
pro_count++;
//统计进程等代表中有效进程数
dri_sch(pro_count,pro);
else//若随机数小于等于0.5,转到接受请求,即创建等待进程表
list(pro_count,pro_num,pro);
endl<
是否继续(Y/N)?
cin>
signal;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 驱动 调度
![提示](https://static.bdocx.com/images/bang_tan.gif)