当前位置:文档之家› 磁盘调度算法的实现

磁盘调度算法的实现

磁盘调度算法的实现
磁盘调度算法的实现

学号专业

实验项目实验三:磁盘调度算法的实现课程名称操作系统课程代码0668036

实验时间2011 年11月06日

2011 年11月09日

2011 年12月13日

2011 年12月16日

实验地点软件实验室7-215

批改意见成绩

教师签字:

【实验环境】Windows操作系统环境下的个人微机

【实验目的】

了解操作系统磁盘调度的基本概念,磁盘调度程序的功能,常用的磁盘调度算法。【实验要求】

学生应正确地设计有关的数据结构与各个功能模块,画出程序的流程图,编写程序,程序执行结果应正确。

【实验内容】

1)本实验是模拟操作系统的磁盘寻道方式,运用磁盘访问顺序的不同来设计磁盘的调度

算法。

2)实现的磁盘调度算法有FCFS,SSTF,SCAN,CSCAN和NStepSCAN算法。

3)设定开始磁道号寻道范围,依据起始扫描磁道号和最大磁道号数,随机产生要进行寻

道的磁道号序列。

4)选择磁盘调度算法,显示该算法的磁道访问顺序,计算出移动的磁道总数和平均寻道

总数。

按算法的寻道效率进行排序,并对各算法的性能进行分析比较。

【实验原理】

1)FCFS

这是一种最简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。2)SSTF

该算法选择这样的进程:其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。

3)SCAN

该算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。例如,当磁头正在自里向外移动时,SCAN算法所考虑的下一个访问对象,应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直至再无更外的磁道需要访问时,才将磁臂换向为自外向里移动。

4)CSCAN

CSCAN算法规定磁头单向移动,例如,只是自里向外移动,当磁头移到最外的磁道并访问后,磁头立即返回到最里的欲访问的磁道,亦即将最小磁道号紧接着最大磁道号构成循环,进行循环扫描。

5)NStepSCAN

N步SCAN算法是将磁盘请求队列分成若干个长度为N的子队列,磁盘调度将按FCFS 算法依次处理这些子队列。而每处理一个队列时又是按SCAN算法,对一个队列处理完后,再处理其他队列。

【实验步骤、过程】

1、程序主要流程

(1)手动输入当前的磁道号,该磁道号在0

(2)手动输入要寻找磁道的范围。

(3)主菜单,选择要进行磁道调度算法,此时会随机生成一个在第二步生成磁道范围以内的10个磁道数,由SetDI方法生成,再将生成的随机磁道号以数组形式作为参数被某个算法调用。

2、程序部分代码

1)函数声明及数据定义

#include "stdio.h"

#include "stdlib.h"

#include "iostream.h"

void CopyL(int Sour[],int Dist[] ,int x); //数组Sour复制到数组Dist,复制到x个数

void SetDI(int DiscL[]); //随机生成磁道数

void Print(int Pri[],int x); //打印输出数组Pri

void DelInq(int Sour[],int x,int y); //数组Sour把x位置的数删除,并把y前面的数向前移动,y后的数保持不变(即会出现2个y)

void FCFS(int Han,int DiscL[]); //先来先服务算法(FCFS)void SSTF(int Han,int DiscL[]); //最短寻道时间优先算法(SSTF)

int SCAN(int Han,int DiscL[],int x,int y); //扫描算法(SCAN)

void FCFS(int Han,int DiscL[]); //先来先服务算法(FCFS)

void SSTF(int Han,int DiscL[]); //最短寻道时间优先算法(SSTF)

int SCAN(int Han,int DiscL[],int x,int y); //扫描算法(SCAN)

void CSCAN(int Han,int DiscL[]); //循环扫描算法(CSCAN)

void N_Step_SCAN(int Han1,int DiscL[]); //N步扫描算法(NStepScan)

void PaiXu(); //寻道长度由低到高排序

void Pri();

int NAll=0;

int Best[5][2]; //用作寻道长度由低到高排序时存放的数组

int Limit=0; //输入寻找的范围磁道数i

int Jage;

float Aver=0;

2)随机生成磁道数

//随机生成磁道数

void SetDI(int DiscL[])

{

int i;

for(i=0;i<=9;i++)

{

DiscL[i]=rand()%Limit;//随机生成10个磁道号

}

printf("\n需要寻找的磁道号:");

Print(DiscL,9);

//输出随机生成的磁道号

printf(" ");

}

3)FCFS

//先来先服务算法(FCFS)

void FCFS(int Han,int DiscL[])

{

int RLine[10]; //将随机生成的磁道数数组Discl[]复制给数组RLine[]

int i,k,All,Temp; //Temp是计算移动的磁道距离的临时变量

All=0; //统计全部的磁道数变量

k=9; //限定10个的磁道数

CopyL(DiscL,RLine,9); //复制磁道号到临时数组RLine

printf("\n按照FCFS算法磁道的访问顺序为:");

All=Han-RLine[0];

for(i=0;i<=9;i++)

{

Temp=RLine[0]-RLine[1];//求出移动磁道数,前一个磁道数减去后一个磁道数得出临时的移动距离

if(Temp<0) Temp=(-Temp);//移动磁道数为负数时,算出相反数作为移动磁道数

printf("%5d",RLine[0]); All=Temp+All;//求全部磁道数的总和

DelInq(RLine,0,k);//每个磁道数向前移动一位

k--;

}

Best[Jage][1]=All;//Best[][1]存放移动磁道数

Best[Jage][0]=1; //Best[][0]存放算法的序号为:1

Jage++;//排序的序号加1

Aver=((float) All)/10;//求平均寻道次数

printf("\n移动磁道数:<%5d> ",All);

printf("\n平均寻道长度:*%0.2f* ",Aver);

}

4)SSTF

//最短寻道时间优先算法(SSTF)

void SSTF(int Han,int DiscL[])

{

int i,j,k,h,All;

int Temp; //Temp是计算移动的磁道距离的临时变量

int RLine[10]; //将随机生成的磁道数数组Discl[]复制给数组RLine[] int Min;

All=0; //统计全部的磁道数变量

k=9; //限定10个的磁道数

CopyL(DiscL,RLine,9); //复制磁道号到临时数组RLine

printf("\n按照SSTF算法磁道的访问顺序为:");

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; //统计一共移动的距离

printf("%5d",RLine[h]);

Han=RLine[h];

DelInq(RLine,h,k); //每个磁道数向前移动一位

k--;

}

Best[Jage][1]=All;//Best[][1]存放移动磁道数

Best[Jage][0]=2;//Best[][0]存放算法的序号为:2

Jage++;//排序序号加1

Aver=((float)All)/10;//求平均寻道次数

printf("\n移动磁道数:<%5d> ",All);

printf("\n平均寻道长度:*%0.2f* ",Aver);

}

5)SCAN

//扫描算法(SCAN)

int SCAN(int Han,int DiscL[],int x,int y)

{

int j,n,k,h,m,All;

int t=0;

int Temp;

int Min;

int RLine[10]; //将随机生成的磁道数数组Discl[]复制给数组RLine[]

int Order;

Order=1;

k=y;

m=2; //控制while语句的执行,即是一定要使当前磁道向内向外都要扫描到

All=0; //统计全部的磁道数变量

CopyL(DiscL,RLine,9); //复制磁道号到临时数组RLine

printf("\n按照SCAN算法磁道的访问顺序为:");

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; //把最近当前磁道号的数组下标赋予h

}

}

All=All+Min;

printf("%5d",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; //把最近当前磁道号的数组下标赋予h

}

}

}

if(h!=-1)

{

All=All+Min; //叠加移动距离

printf("%5d",RLine[h]);

Han=RLine[h]; //最近的磁道号作为当前磁道

DelInq(RLine,h,k);

k--;

}

}

Order=0; //当完成向内的移动,order赋予0,执行else语句,使磁道向外移动

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; //把最近当前磁道号的数组下标赋予h

}

}

}

if(h!=-1)

{

All=All+Min; //叠加移动距离

printf("%5d",RLine[h]);

Han=RLine[h]; //最近的磁道号作为当前磁道

DelInq(RLine,h,k);

k--;

}

}

Order=1; //当完成向外的移动,order赋予1,执行else语句,使磁道向内移动

m--; //向内完成一次,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;//求平均寻道次数

printf("\n移动磁道数:<%5d> ",All);

printf("\n平均寻道长度:*%0.2f* ",Aver);

}

if(t==1)

printf("\n磁道由内向外移动");

else

printf("\n磁道由外向内移动");

return(Han);

}

6)CSCAN

//循环扫描算法(CSCAN)

void CSCAN(int Han,int DiscL[])

{

int j,h,n,Temp,m,k,All,Last,i;

int RLine[10]; //将随机生成的磁道数数组Discl[]复制给数组RLine[]

int Min;

int tmp=0; m=2; k=9; All=0; //统计全部的磁道数变量

Last=Han;

CopyL(DiscL,RLine,9); //复制磁道号到临时数组RLine

printf("\n按照CSCAN算法磁道的访问顺序为:");

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; //统计一共移动的距离

printf("%5d",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;

}

}

Best[Jage][1]=All;//Best[][1]存放移动磁道数

Best[Jage][0]=4;//Best[][0]存放算法的序号为:4

Jage++;//排序序号加1

Aver=((float)All)/10;//求平均寻道次数

printf("\n移动磁道数:<%5d> ",All);

printf("\n平均寻道长度:*%0.2f* ",Aver);

}

7)NStepSCAN

//N步扫描算法(NStepScan)

void N_Step_SCAN(int Han1,int DiscL[])

{

int i,m,k;

int RLine1[10];

NAll=0; m=2; k=9; //限定10个磁道数

i=-1;

CopyL(DiscL,RLine1,9); //复制磁道号到临时数组RLine

printf("\n按照N_Step_SCAN算法磁道的访问顺序为:");

for(m=0;m<2;m++) //由于限定10磁道数,将10个磁道数分为两组,每组5个磁道数,每个组按照SCAN算法执行,该循环循环2次

{

Han1=SCAN(Han1,RLine1,i+1,i+5);

i=i+5;

}

Best[Jage][1]=NAll;//Best[][1]存放移动磁道数

Best[Jage][0]=5;//Best[][0]存放算法的序号为:5

Aver=((float)NAll)/10;//求平均寻道次数

printf("\n移动磁道数:<%5d> ",NAll);

printf("\n平均寻道长度:*%0.2f* ",Aver);

}

8)按算法的寻道效率进行排序

//寻道长度由低到高排序

void PaiXu()

{

int i,j,Temp;

for(i=0;i<5;i++)

{

for(j=0;j<4;j++)

{

if(Best[j][1]>Best[j+1][1]) //如果前一个算法的移动磁道距离大于后一个移动磁道数,执行下面语句

{

Temp=Best[j+1][1]; //从这起下三行执行冒泡法将移动距离大小排序,排完后则执行每个算法的排序

Best[j+1][1]=Best[j][1];

Best[j][1]=Temp;

Temp=Best[j+1][0]; //将每个算法的序号用冒泡法排序

Best[j+1][0]=Best[j][0];

Best[j][0]=Temp;

}

}

}

}

9)主函数

int main()

{

int i;

int DiscLine[10]; //声明准备要生成的随机磁道号的数组

int Hand; //磁道数

int Con=1;

int n;

while(Con==1)

{

Jage=0;

printf("\n请输入初始的磁道数(0

scanf("%d",&Hand);

printf("\n输入寻找的范围:");

scanf("%d",&Limit);

if(Limit>65536)

{

printf("超出范围!");

}

else{

printf(" ╭═══════════════╮\n");

printf(" ║操作系统课程设计║\n");

printf(" ╭═════┤磁盘调度算法├═════╮\n");

printf(" ║║║║\n");

printf(" ║╰═══════════════╯║\n");

printf("║ 1.先来先服务算法(FCFS)

║\n");

printf(" ║

║\n");

printf(" ║ 2.最短寻道时间优先算法(SSTF)

║\n");

printf(" ║

║\n");

printf(" ║ 3.扫描算法(SCAN)

║\n");

printf(" ║

║\n");

printf(" ║ 4.循环扫描算法(CSCAN)

║\n");

printf(" ║

║\n");

printf(" ║ 5.N步扫描算法(NStepScan)

║\n");

printf(" ║

║\n");

printf(" ║ 6.各类算法的比较

║\n");

printf(" ║

║\n");

printf(" ║

║\n");

printf(" ║╭───────────────────────╮║\n");

printf(" ╰═┤请输入你的选择的算法(输入0离开) ├═╯\n");

printf(" ╰───────────────────────╯\n");

scanf("%d",&n);

if(n==0)

exit(0);

printf(" ");

switch(n)

{

case 1:

SetDI(DiscLine); //随机生成磁道数

FCFS(Hand,DiscLine); //先来先服务算法(FCFS)

break;

case 2:

SetDI(DiscLine); //随机生成磁道数

SSTF(Hand,DiscLine); //最短寻道时间优先算法(SSTF)

break;

case 3:

SetDI(DiscLine); //随机生成磁道数

SCAN(Hand,DiscLine,0,9); //扫描算法(SCAN)

break;

case 4:

cout<<"注:规定磁头由内向外单方向移动。"<

SetDI(DiscLine); //随机生成磁道数

CSCAN(Hand,DiscLine); //循环扫描算法(CSCAN)

break;

case 5:

SetDI(DiscLine); //随机生成磁道数

N_Step_SCAN(Hand,DiscLine); //N步扫描算法(NStepScan)

break;

case 6:

SetDI(DiscLine); //随机生成磁道数

FCFS(Hand,DiscLine); //先来先服务算法(FCFS)

SSTF(Hand,DiscLine); //最短寻道时间优先算法(SSTF)

SCAN(Hand,DiscLine,0,9); //扫描算法(SCAN)

CSCAN(Hand,DiscLine); //循环扫描算法(CSCAN)

N_Step_SCAN(Hand,DiscLine); //N步扫描算法(NStepScan)

PaiXu(); //寻道长度由低到高排序

printf("\n寻道长度由低到高排序:");

for(i=0;i<5;i++)

{

printf("%4d ",Best[i][0]);

}

break;

}

printf("\n是否继续(按0结束,按1继续)?");

scanf("%5d",&Con);

}

}

return 0;

}

3、运行结果

1)输入初始磁道数及寻找范围

2)选择FCFS算法

3)重新随机生成磁道数,选择SSTF

4)重新随机生成磁道数,选择SCAN

5)重新随机生成磁道数,选择CSCAN

6)重新随机生成磁道数,选择NStepSCAN

7)对同一磁道序列,按算法的寻道效率进行排序

8)退出

操作系统实验六磁盘调度算法正确C代码

操作系统实验六磁盘调度算法正确C代码 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

《操作系统》实验报告 【实验题目】:磁盘调度算法 【实验目的】 通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法的实现方法。【实验内容】 问题描述: 设计程序模拟先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。 程序要求如下: 1)利用先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法模拟磁道访问过程。 2)模拟四种算法的磁道访问过程,给出每个磁道访问的磁头移动距离。 3)输入:磁道个数n和磁道访问序列,开始磁道号m和磁头移动方向(对SCAN和循环SCAN算法有效),算法选择1-FCFS,2-SSTF,3-SCAN,4-循环SCAN。 4)输出:每种算法的平均寻道长度。 实验要求:

1) 上机前认真复习磁盘调度算法,熟悉FCFS,SSTF,SCAN和循环SCAN算法的过程; 2) 上机时独立编程、调试程序; 3) 根据具体实验要求,完成好实验报告(包括实验的目的、内容、要求、源程序、实例运行结果截图)。 实验代码: #include #include #include<> using namespace std; const int MaxNumber=100; int TrackOrder[MaxNumber]; int MoveDistance[MaxNumber];//移动距离 int FindOrder[MaxNumber];//寻好序列 double AverageDistance;//平均寻道长度 bool direction;//方向 true时为向外,false为向里 int BeginNum;//开始磁道号 int M=500;//磁道数 int N;//提出磁盘I/O申请的进程数 int SortOrder[MaxNumber];//排序后的序列 bool Finished[MaxNumber]; void Inith() { cout<<"请输入提出磁盘I/O申请的进程数: "; cin>>N; cout<<"请依次输入要访问的磁道号: "; for(int i=0;i>TrackOrder[i]; for(int j=0;j

操作系统实验报告—磁盘调度算法

操作系统实验报告实验3 磁盘调度算法 报告日期:2016-6-17 姓名: 学号: 班级: 任课教师:

实验3 磁盘调度算法 一、实验内容 模拟电梯调度算法,实现对磁盘的驱动调度。 二、实验目的 磁盘是一种高速、大量旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,负担着繁重的输入输出任务,在多道程序设计系统中,往往同时会有若干个要求访问磁盘的输入输出请示等待处理。系统可采用一种策略,尽可能按最佳次序执行要求访问磁盘的诸输入输出请求,这就叫驱动调度,使用的算法称驱动调度算法。驱动调度能降低为若干个输入输出请求服务所须的总时间,从而提高系统效率。本实验要求学生模拟设计一个驱动调度程序,观察驱动调度程序的动态运行过程。 三、实验原理 模拟电梯调度算法,对磁盘调度。 磁盘是要供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。当有进程在访问某个磁盘时,其他想访问该磁盘的进程必须等待,直到磁盘一次工作结束。当有多个进程提出输入输出请求处于等待状态,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。当存取臂仅需移到一个方向最远的所请求的柱面后,如果没有访问请求了,存取臂就改变方向。 假设磁盘有200个磁道,用C语言随机函数随机生成一个磁道请求序列(不少于15个)放入模拟的磁盘请求队列中,假定当前磁头在100号磁道上,并向磁道号增加的方向上移动。请给出按电梯调度算法进行磁盘调度时满足请求的次序,并计算出它们的平均寻道长度。 四、实验过程 1.画出算法流程图。

2.源代码 #include #include #include int *Init(int arr[]) { int i = 0; srand((unsigned int)time(0)); for (i = 0; i < 15; i++) { arr[i] = rand() % 200 + 1; printf("%d ", arr[i]); } printf("\n"); return arr; } void two_part(int arr[]) { int i = 0; int j = 0;

实验一 模拟实现进程调度算法

实验一模拟实现进程调度算法(4学时) ①、实验目的 a、进程调度是处理机管理的核心内容。观察、体会操作系统的进程调度方法,并通过一个简单的进程调度模拟程序的实现,加深对进程控制块、进程队列、进程调度算法,进程切换的理解,并体会和了解各种调度算法的具体实施办法。 b、提高实际动手编程能力,为日后从事软件开发工作打下坚实基础。 ②、实验内容 a、设计进程控制块PCB表结构,模拟实现进程调度算法:FIFO,静态优先级调度,时间片轮转调度,短进程优先调度算法,多级反馈队列调度。(实现静态优先级调度算法、短进程优先调度算法)。 b、编写一个进程调度程序模拟程序。模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。 c、由用户输入(可通过文件输入)进程名、进程状态、进程运行时间和进程优先级等数据。 ③、实验要求 a、使用模块化设计思想来设计。 b、给出主函数和各个算法函数的流程图。 c、学生可按照自身条件,随意选择采用的算法,(例如:采用冒泡法编写程序,实现短进程优先调度的算法)。 d、进程调度程序模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。 ④、运行结果 a、给出进程的调度模拟操作排序结果。 ⑤、提示 a、每个进程可有三个状态,并假设初始状态为就绪状态。 b、为了便于处理,程序中的进程运行时间以纳秒为单位计算。 C、各进程的优先级或轮转时间数以及进程需运行的纳秒数的初始值均由用户给定。 d、在优先级算法中,采用静态优先级。在时间片轮转算法中,采用可变时间片,由用户给定。 e、对于遇到优先级一致的情况,采用FIFO策略解决。

f、输入:进程流文件(文本文件),其中存储的是一系列要执行的进程,每个进程包括四个数据项:进程名进程状态(1就绪2等待3运行) 所需时间优先级(0级最高)。 g、输出:进程执行流等待时间平均等待时间。 ⑥、分析与讨论 a、各种进程调度算法的异同? b、如何理解“算法+数据结构=程序设计”? c、如何理解“数据结构始终是为实现功能服务的”? ⑦、参考代码 参看:附录A1 考核方法: 1、实验报告占50%,程序设计30%,出勤占20%; 3、每次实验100分,2次实验的平均分为最终实验成绩。 注:无出勤只交实验报告者,以实验报告成绩×50%为最后成绩。 打游戏者发现一次本次实验扣10分。 早退者本次实验扣10分。 点名时未到者,后来补签到按照迟到时间长短扣分,点名后即来扣5分,1节课过后才来扣10分。

磁盘调度算法的模拟实现

磁盘调度算法的模拟实现 学院 专业 学号 学生姓名 指导教师姓名 2014年3月19日 目录

一、课设简介 (2) 1.1 课程设计题目 (2) 1.2 课程设计目的 (2) 1.3 课程设计要求 (2) 二、设计内容 (3) 2.1功能实现 (3) 2.2流程图 (3) 2.3具体内容 (3) 三、测试数据 (4) 3.3 测试用例及运行结果 (4) 四、源代码 (5) 五、总结 (12) 5.1 总结............................................ 一、课设简介 1.1课程设计题目

磁盘调度算法的模拟实现1 1.2程序设计目的 操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。 1)进一步巩固和复习操作系统的基础知识。 2)培养学生结构化程序、模块化程序设计的方法和能力。 3)提高学生调试程序的技巧和软件设计的能力。 4)提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。 1.3 设计要求 1)磁头初始磁道号,序列长度,磁道号序列等数据可从键盘输入,也可从文件读入。 2)最好能实现磁道号序列中磁道号的动态增加。 3)磁道访问序列以链表的形式存储 4)给出各磁盘调度算法的调度顺序和平均寻道长度 二、设计内容 2.1 功能实现 设计并实现一个本别利用下列磁盘调度算法进行磁盘调度的模拟

程序。 1) 先来先服务算法FCFS 2) 最短寻道时间优先算法 SSTF 2.2流程图 2.3具体内容 1)先来先服务算法FCFS 这是一种比较简单的磁盘调度算法。它根据进程请求访问磁盘 的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请 求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情 况。此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情开始 选择算法 F C F S S S T F 结束

进程调度算法的模拟实现

操作系统课程设计报告题目:进程调度算法的模拟实现_ 专业计算机科学与技术 学生姓名 班级 学号 指导教师 发放日期2015.1.30 信息工程学院

目录 1 概述 (1) 2 设计原理 (1) 2.1先来先服务算法 (1) 3 详细设计与编码 (2) 3.1 模块设计 (2) 3.2 系统流程图 (2) 3.3 系统详细设计 (2) 4 结果与分析 (6) 4.1 测试方案 (6) 4.2 测试结果 (6) 4.3 测试结果分析 (9) 5 设计小结 (10) 6 参考文献 (10) 附录程序代码 (12)

进程调度算法的模拟实现 进程调度算法的模拟实现 1 概述 选择一个调度算法,实现处理机调度,进程调度算法包括:先来先服务算法,短进程优先算法,时间片轮转算法,动态优先级算法。可选择进程数量,本程序包括四种算法,用C或C++语言实现,执行时在主界面选择算法(可用函数实现),进入子页面后输入进程数,(运行时间,优先数由随机函数产生),执行,显示结果。 2 设计原理 2.1先来先服务(FCFS)算法 每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源创建进程,然后放入就绪队列 2.2 时间片轮转法(RR)算法 系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。时间片的大小从几ms到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。 2.3短作业优先(SJF)算法 短作业优先调度算法是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。 2.4最高优先权优先(HRRN)算法 优先权调度算法是为了照顾紧迫型作业,使之在进入系统后便获得优先处理,引入最高优先权优先调度算法。动态优先权是指在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。

天津理工大学 操作系统实验3:磁盘调度算法地实现

实验报告学院(系)名称:计算机与通信工程学院

【实验过程记录(源程序、测试用例、测试结果及心得体会等)】 #include #include #include using namespace std; const int MaxNumber=100; int TrackOrder[MaxNumber]; int MoveDistance[MaxNumber]; //----移动距离; int FindOrder[MaxNumber]; //-----寻好序列。 double AverageDistance; //-----平均寻道长度 bool direction; //-----方向 true时为向外,false为向里 int BeginNum; //----开始磁道号。 int M; //----磁道数。 int N; //-----提出磁盘I/O申请的进程数 int SortOrder[MaxNumber]; //----排序后的序列 bool Finished[MaxNumber]; void Inith() { cout<<"请输入磁道数:"; cin>>M; cout<<"请输入提出磁盘I/O申请的进程数:"; cin>>N; cout<<"请依次输入要访问的磁道号:"; for(int i=0;i>TrackOrder[i]; for(int j=0;j>BeginNum; for(int k=0;k=0;i--) for(int j=0;jSortOrder[j+1])

操作系统实验 磁盘调度算法

操作系统 实验报告 哈尔滨工程大学 计算机科学与技术学院

第六讲磁盘调度算法 一、实验概述 1. 实验名称 磁盘调度算法 2. 实验目的 (1)通过学习EOS 实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机; (2)观察 EOS 实现的FCFS、SSTF和 SCAN磁盘调度算法,了解常用的磁盘调度算法; (3)编写 CSCAN和 N-Step-SCAN磁盘调度算法,加深对各种扫描算法的理解。 3. 实验类型 验证性+设计性实验 4. 实验内容 (1)验证先来先服务(FCFS)磁盘调度算法; (2)验证最短寻道时间优先(SSTF)磁盘调度算法; (3)验证SSTF算法造成的线程“饥饿”现象; (4)验证扫描(SCAN)磁盘调度算法; (5)改写SCAN算法。 二、实验环境 在OS Lab实验环境的基础上,利用EOS操作系统,由汇编语言及C语言编写代码,对需要的项目进行生成、调试、查看和修改,并通过EOS应用程序使内核从源代码变为可以在虚拟机上使用。 三、实验过程 1. 设计思路和流程图 (1)改写SCAN算法 在已有 SCAN 算法源代码的基础上进行改写,要求不再使用双重循环,而是只遍历一次请求队列中的请求,就可以选中下一个要处理的请求。算法流程图如下图所示。 图 3.1.1 SCAN算法IopDiskSchedule函数流程图(2)编写循环扫描(CSCAN)磁盘调度算法 在已经完成的SCAN算法源代码的基础上进行改写,不再使用全局变量ScanInside 确定磁头移动的方向,而是规定磁头只能从外向内移动。当磁头移动到最内的被访问磁道时,磁头立即移动到最外的被访问磁道,即将最大磁道号紧接着最小磁道号构成循环,进行扫描。算法流程图如下图所示。

进程模拟调度算法课程设计

一.课程概述 1.1.设计构想 程序能够完成以下操作:创建进程:先输入进程的数目,再一次输入每个进程的进程名、运行总时间和优先级,先到达的先输入;进程调度:进程创建完成后就选择进程调度算法,并单步执行,每次执行的结果都从屏幕上输出来。 1.2.需求分析 在多道程序环境下,主存中有着多个进程,其数目往往多于处理机数目,要使这多个进程能够并发地执行,这就要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程,使之执行。分配处理机的任务是由处理机调度程序完成的。由于处理机是最重要的计算机资源,提高处理机的利用率及改善系统必(吞吐量、响应时间),在很大程度上取决于处理机调度性能的好坏,因而,处理机调度便成为操作系统设计的中心问题之一。本次实验在VC++6.0环境下实现先来先服务调度算法,短作业优先调度算法,高优先权调度算法,时间片轮转调度算法和多级反馈队列调度算法。 1.3.理论依据 为了描述和管制进程的运行,系统为每个进程定义了一个数据结构——进程控制块PCB(Process Control Block),PCB中记录了操作系统所需的、用于描述进程的当前情况以及控制进程运行的全部信息,系统总是通过PCB对进程进行控制,亦即,系统是根据进程的PCB 而不是任何别的什么而感知进程的存在的,PCB是进程存在的惟一标志。本次课程设计用结构体Process代替PCB的功能。 1.4.课程任务 一、用C语言(或C++)编程实现操作模拟操作系统进程调度子系统的基本功能;运用多 种算法实现对进程的模拟调度。 二、通过编写程序实现进程或作业先来先服务、高优先权、按时间片轮转、短作业优先、多 级反馈队列调度算法,使学生进一步掌握进程调度的概念和算法,加深对处理机分配的理解。 三、实现用户界面的开发

磁盘调度算法文档

《操作系统原理及应用》课程设计报告 磁盘调度算法 学院(系):计算机科学与工程学院 班级:37-5 学号 学生姓名: 时间:从2013 年12 月16日到2013 年12月20日

1、课程设计的目的 本课程设计是学生学习完《操作系统原理及应用》课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。 2、课程设计的内容及要求 编程序实现下述磁盘调度算法,并求出每种算法的平均寻道长度: 要求设计主界面以灵活选择某算法,且以下算法都要实现 1、先来先服务算法(FCFS) 2、最短寻道时间优先算法(SSTF) 3、扫描算法(SCAN) 4、循环扫描算法(CSCAN) 3、实现原理 磁盘是可供多个进程共享的设备,当有多个进程都要求访问磁盘时,应采用一种最佳调度算法,以使各进程对磁盘的平均访问时间最小。由于在访问磁盘的时间中,主要是寻道时间,因此,磁盘调度的目标是使磁盘的平均寻道时间最少。目前常用的磁盘调度算法有先来先服务、最短寻道时间优先、扫描和循环扫描等算法。 其中,平均寻道长度(L)为所有磁道所需移动距离之和除以总的所需访问的磁道数(N),即:L=(M1+M2+……+Mi+……+MN)/N 其中Mi为磁头从上一各磁道到这个磁道所需移动的距离。 4、算法 1.先来先服务算法(FCFS) 这是一种最简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。此算法只考虑访问者提出访问请求的先后次序,按照先后次序依次访问磁道号。移动距离等于上一个被访问的磁道号减去当前访问的磁道号的绝对值,平均寻道长度等于所有移动距离之和除以磁道被访问的次数。 2.短寻道时间优先算法(SSTF) 该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,而不管访问者到来的先后次序。实现时可以先对磁道号进行从小到大排序保存在数组里,然后与当前磁道号比较,选择离自己最近的访问,每比较一次,当前磁道号也跟着变化,移动距离等于上一个被访问的

磁盘调度算法实验报告 (2)(推荐文档)

磁盘调度算法 学生姓名: 学生学号: 专业班级: 指导老师: 2013年6月20日

1、实验目的: 通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的实现方法。 2、问题描述: 设计程序模拟先来先服务FCFS、最短寻道时间优先SSTF、SCAN 和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。 3、需求分析 通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的实现方法。 通过已知开始磁道数、访问磁道总数、磁道号访问序列、访问方向及访问方式得到访问序列及移动距离和平均移动距离! (1)输入的形式; int TrackOrder[MaxNumber];//被访问的磁道号序列 int direction;//寻道方向 int Num;//访问的磁道号数目

int start;// (2)输出的形式; int MoveDistance[MaxNumber]={0};//移动距离 double AverageDistance=0;//平均寻道长度 移动的序列! (3)程序所能达到的功能; 模拟先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。 (4)测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。 开始磁道号:100 磁道号方向:内(0)和外(1) 磁道号数目:9 页面序列:55 58 39 18 90 160 150 38 184 4、概要设计 说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。

进程调度算法模拟程序设计C++

(1)用C语言(或其它语言,如Java)实现对N个进程采用某种进程调度算法(如动态优先权调度)的调度。 (2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:?进程标识数ID。 ?进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。 ?进程已占用CPU时间CPUTIME。 ?进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。 ?进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间 片后,进程将进入阻塞状态。 ?进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME 个时间片后,将转换成就绪状态。 ?进程状态STATE。 ?队列指针NEXT,用来将PCB排成队列。 (3)优先数改变的原则: ?进程在就绪队列中呆一个时间片,优先数增加1。 ?进程每运行一个时间片,优先数减3。 (4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。 (5)分析程序运行的结果,谈一下自己的认识。 实验代码 #include "iostream.h" #include "windows.h" //#define N 3 typedef struct{ int ID; int PRIORITY; int CPUTIME;

int ALLTIME; int STARTBLOCK; int BLOCKTIME; int STATE;//0-运行1-阻塞2-就绪3-结束4-未到达 int REACH; int TIME; }PROCESS; void textcolor (int color) { SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), color ); } void main(){ int i,time,max,l,l1,time1,flag=0,total=0,N,server[10],sum=0; PROCESS pro[10]; textcolor(13); cout<<"注意:本程序中状态代表如下"<>N; cout<<"请设置时间片长度:"; cin>>time; cout<<"请输入各进程初始状态:"<>pro[i].ID>>pro[i].PRIORITY>>pro[i].REACH;

模拟磁盘调度算法,操作系统课程设计

某某大学 课程设计报告课程名称:操作系统 设计题目:模拟磁盘调度算法 系别:计算机系 专业:计算机科学与技术 组别: 学生姓名: 学号: 起止日期: 指导教师:

目录 第一章需求分析 (1) 1.1课程设计的简介 (1) 1.2课程设计的目的 (1) 1.3磁盘调度主要思想 (1) 1.4课程设计内容 (2) 第二章概要设计 (3) 2.1设计思想 (3) 2.2 数据结构 (3) 2.3模块调用关系图 (3) 2.4子模块程序流程图 (5) 第三章详细设计 (6) 3.1模块划分 (6) 第四章代码测试 (9) 4.1先来先服务 (9) 4.1最短寻道时间优先 (11) 4.1扫描算法 (12) 第五章心得体会 (13) 第六章致谢 (13) 参考文献 (1) 附源代码 (2)

第一章需求分析 1.1课程设计的简介 这是一个用VC++6.0为工具、C++为编程语言而实现模拟先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)的一个磁盘调度程序。该程序设计系统主界面可以灵活选择某种算法并算出磁头移动的总磁道数以及平均磁道数。 1.2课程设计的目的 本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)等磁盘调度算法的理解。 1.3磁盘调度主要思想 设备的动态分配算法与进程调度相似,也是基于一定的分配策略的。常用的分配策略有先请求先分配、优先级高者先分配等策略。在多道程序系统中,低效率通常是由于磁盘类旋转设备使用不当造成的。操作系统中,对磁盘的访问要求来自多方面,常常需要排队。这时,对众多的访问要求按一定的次序响应,会直接影响磁盘的工作效率,进而影响系统的性能。访问磁盘的时间因子由3部分构成,它们是查找(查找磁道)时间、等待(旋转等待扇区)时间和数据传输时间,其中查找时间是决定因素。因此,磁盘调度算法先考虑优化查找策略,需要时再优化旋转等待策略。 平均寻道长度(L)为所有磁道所需移动距离之和除以总的所需访问的磁道数(N),即: L=(M1+M2+……+Mi+……+MN)/N。其中Mi为所需访问的磁道号所需移动的磁道数。 启动磁盘执行输入输出操作时,要把移动臂移动到指定的柱面,再等待指定扇区的旋转到磁头位置下,然后让指定的磁头进行读写,完成信息传送。因此,执行一次输入输出所花的时间有:

操作系统磁盘调度算法实验报告

操作系统磁盘调度算法实 验报告 Last revision on 21 December 2020

目录

1.课程设计目的 编写目的 本课程设计的目的是通过磁盘调度算法设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法的理解。 2.课程设计内容 设计内容 系统主界面可以灵活选择某种算法,算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)。 1、先来先服务算法(FCFS) 这是一种比较简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进

程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。 2、最短寻道时间优先算法(SSTF) 该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。 3、扫描算法(SCAN) 扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直到

磁盘调度算法的实现

题目4 磁盘调度算法的实现 4.1 题目的主要研究内容及预期达到的目标 (1)设计磁盘调度请求队列(请求数≥10) (2)设定单位寻道时间; (3)可动态修改磁盘请求时间和磁道; (4)分别实现四种磁盘调度算法; A、先来先服务算法(FCFS)。 B、最短寻道时间优先算法(SSTF)。 C、扫描算法(SCAN)。 D、循环扫描算法(CSCAN)。 (5)实现动态调度并输出调度序列。 (6)理解磁盘调度相关理论; (7)掌握多种磁盘调度算法。 4.2 题目研究的工作基础或实验条件 (1)硬件环境:装有Linux操作系统(虚拟机)的计算机一台。 (2)软件环境:vim编辑器、Visual C++。 4.3 设计思 (1)磁盘调度 磁盘可供多个进程共享,当有多个进程要求访问磁盘时,应采用一种调度算法,以使各进程对磁盘的平均访问时间最小,由于在访问磁盘的时间中,主要是寻道时间,因此磁盘调度的目标就是使磁盘的平均寻道时间最短。 (2)系统主界面可以灵活选择某种算法,算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)。 A、先来先服务算法(FCFS) 这是一种比较简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平

均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。因为每个请求都会按照到达先后顺序得到处理,不会出现某个进程的请求长期得不到处理的情况,算法具有一定的公平性。 B、最短寻道时间优先算法(SSTF) 该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。此算法会导致与当前磁道距离较远的访问请求长期等待得不到服务,发生进程“饥饿”现象。 C、扫描算法(SCAN) 扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。此算法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道。此算法与自然界中电梯的工作方式极为相像,故也称“电梯调度”算法。 D、循环扫描算法(CSCAN) 循环扫描算法是对扫描算法的改进。如果对磁道的访问请求是均匀分布的,当磁头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少。这是由于这些磁道刚被处理,而磁盘另一端的请求密度相当高,且这些访问请求等待的时间较长,为了解决这种情况,循环扫描算法规定磁头单向移动。例如,只自里向外移动,当磁头移到最外的被访问磁道时,磁头立即返回到最里的欲访磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。

模拟磁盘调度算法操作系统课程设计

模拟磁盘调度算法操作系 统课程设计 Final approval draft on November 22, 2020

某某大学 课程设计报告课程名称:操作系统 设计题目:模拟磁盘调度算法 系别:计算机系 专业:计算机科学与技术 组别: 学生姓名: 学号: 起止日期: 指导教师: 目录

第一章需求分析 课程设计的简介 这是一个用VC++为工具、C++为编程语言而实现模拟先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)的一个磁盘调度程序。该程序设计系统主界面可以灵活选择某种算法并算出磁头移动的总磁道数以及平均磁道数。 课程设计的目的 本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)等磁盘调度算法的理解。 磁盘调度主要思想 设备的动态分配算法与进程调度相似,也是基于一定的分配策略的。常用的分配策略有先请求先分配、优先级高者先分配等策略。在多道程序系统中,低效率通常是由于磁盘类旋转设备使用不当造成的。操作系统中,对磁盘的访问要求来自多方面,常常需要排队。这时,对众多的访问要求按一定的次序响应,会直接影响磁盘的工作效率,进而影响系统的性能。访问磁盘的时间因子由3部分构成,它们是查找(查找磁道)时间、等待(旋转等待扇区)时间和数据传输时间,其中查找时间是决定因素。因此,磁盘调度算法先考虑优化查找策略,需要时再优化旋转等待策略。 平均寻道长度(L)为所有磁道所需移动距离之和除以总的所需访问的磁道数(N),即: L=(M1+M2+……+Mi+……+MN)/N。其中Mi为所需访问的磁道号所需移动的磁道数。 启动磁盘执行输入输出操作时,要把移动臂移动到指定的柱面,再等待指定扇区的旋转到磁头位置下,然后让指定的磁头进行读写,完成信息传送。因此,执行一次输入输出所花的时间有: 寻找时间——磁头在移动臂带动下移动到指定柱面所花的时间。 延迟时间——指定扇区旋转到磁头下所需的时间。 传送时间——由磁头进程读写完成信息传送的时间。

操作系统模拟进程调度算法

操作系统 ——项目文档报告 进程调度算法 专业: 班级: 指导教师: 姓名: 学号:

一、核心算法思想 1.先来先服务调度算法 先来先服务调度算法是一种最简单的调度算法,该算法既可以用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将他们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。 2.短作业(进程)优先调度算法 短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。它们可以分别用于作业调度和进程调度。短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机再重新调度。SJ(P)F调度算法能有效地降低作业(进程)的平均等待时间,提高系统吞吐量。该算法对长作业不利,完全未考虑作业的紧迫程度。 3.高响应比优先调度算法 在批处理系统中,短作业优先算法是一种比较好的算法,其主要不足之处是长作业的运行得不到保证。如果我们能为每个作业引人动态优先权,并使作业的优先级随着等待时间的增加而以速率a提高,则长作业在等待一定的时间后,必然有机会分配到处理机。该优先权的变化规律可描述为: 优先权=(等待时间+要求服务时间)/要求服务时间 即优先权=响应时间/要求服务时间 如果作业的等待时间相同,则要求服务的时间越短,其优先权越高,因而该算法有利于短作业。 当要球服务的时间相同时,作业的优先权决定于其等待时间,等待时间越长,优先权越高,因而它实现的是先来先服务 对于长作业,作业的优先级可以随着等待时间的增加而提高,当其等待时间足够长时,其优先级便可以升到很高,从而也可获得处理机。 4.时间片轮转算法 在时间片轮转算法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。当执行的时间片用完时,由一个计数器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。换言之,系统能在给定的时间内响应所有用户的请求。 二、核心算法流程图

(第五讲磁盘调度算法)

实用标准文案 操作系统 实验报告

哈尔滨工程大学计算机科学与技术学院

一、实验概述 1. 实验名称磁盘调度算法 2. 实验目的 (1)通过学习EOS 实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机。 (2)观察EOS实现的FCFS、SSTF和SCAN磁盘调度算法,了解常用的磁盘调度算法。 ( 3)编写CSCAN 和N-Step-SCAN 磁盘调度算法,加深对各种扫描算法的理解。 3. 实验类型验证,设计 4. 实验内容 ( 1)准备实验 (2)验证先来先服务(FCFS)磁盘调度算法 (3)验证最短寻道时间优先(SSTF)磁盘调度算法 (4)验证SSTF 算法造成的线程“饥饿”现象 (5.1)验证扫描(SCAN)磁盘调度算法 (5.2)验证SCAN 算法能够解决“饥饿”现象 ( 6 ) 改写SCAN 调度算法 二、实验环境

EOS 操作系统与IDE 环境组成的“操作系统集成实验环境OS Lab ”。 三、实验过程 (一)实验问题及解答 1. 实验指导P176-3.2验证先来先服务(FCFS)磁盘调度算法,要求请给出在“输出”窗口中的结果。 答:输出结果复制如下: 制作软盘镜像... 正在启动Virtual PC... 开始调试... ****** Disk schedule start working ****** Start Cylinder: 10 TID: 31 Cylinder: 8 Offset: 2 - TID: 32 Cylinder: 21 Offset: 13 + TID: 33 Cylinder: 9 Offset: 12 - TID: 34 Cylinder: 78 Offset: 69 + TID: 35 Cylinder: 0 Offset: 78 - TID: 36 Cylinder: 41 Offset: 41 + TID: 37 Cylinder: 10 Offset: 31 -

模拟一种处理机调度算法

课程设计报告 设计名称:模拟实现一种处理机调度算法 学生姓名: xxx 专业:计算机科学与技术 班别: xxxxxxxx 学号: xxxxxx 指导老师: xxxxx 日期: 2014 年 6 月 20 日

初始条件: 1.预备内容:阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。 2.实践准备:掌握一种计算机高级语言的使用。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 1.模拟进程调度,能够处理以下的情形: ⑴能够选择不同的调度算法(要求中给出的调度算法); ⑵能够输入进程的基本信息,如进程名、优先级、到达 时间和运行时间等; ⑶根据选择的调度算法显示进程调度队列; ⑷根据选择的调度算法计算平均周转时间和平均带权周 转时间。 2.设计报告内容应说明: ⑴需求分析; ⑵功能设计(数据结构及模块说明); ⑶开发平台及源程序的主要部分; ⑷测试用例,运行结果与运行情况分析; ⑸自我评价与总结: i)你认为你完成的设计哪些地方做得比较好或比较出 色; ii)什么地方做得不太好,以后如何改正;

iii)从本设计得到的收获(在编写,调试,执行过程中 的经验和教训); iv)完成本题是否有其他方法(如果有,简要说明该方 法); 进程调度模拟设计——先来先服务、优先级法1、背景: 当计算机系统是多道程序设计系统时,通常会有多个进程或线程同时竞争CPU。只要有两个或更多的进程处于就绪状态,这种情形就会发生。如果只有一个CPU可用,那么就必须选择下一个要运行的进程。在操作系统中,完成选择工作的这一部分称为调度程序,该程序使用的算法成为调度算法。 进程调度的核心问题是采用什么样的算法把处理机分配给进程,好的算法将提高资源利用率,减少处理机的空闲时间,避免有些作业长期得不到相应的情况发生等,从而设计出受欢迎的操作系统。较常见的几种进程调度算法有:先来先服务调度算法;短作业优先调度算法;时间片轮转调度算法;优先级调度算法;高响应比优先算法和多级反馈队列调度算法等。 2.1设计目的 无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机

操作系统磁盘调度算法源代码

1.主界面 void display(){ cout<<"\n\n\n\n Operating Systems Curriculum Design\n"; cout<<"\n ╔———————————————————————————————╗"; cout<<"\n ││"; cout<<"\n │名称: 磁盘调度│"; cout<<"\n ││"; cout<<"\n │工具: Visual Studio 2010 │"; cout<<"\n ││"; cout<<"\n │班级:1205 │"; cout<<"\n ││"; cout<<"\n │作者:xxxx │"; cout<<"\n ││"; cout<<"\n │学号:1324256688 │"; cout<<"\n ││"; cout<<"\n ╚———————————————————————————————╝\n"; system("pause"); system("cls"); 2.前言提示用户此程序实现的算法 cout<<"【载入完成】"<

相关主题
文本预览
相关文档 最新文档