オペレーティングシステム実験レポート-ディスクスケジューリングアルゴリズム
1.実験名:ディスクスケジューリングアルゴリズムの実装
2.実験要件:
(1)ディスクスケジューリングの概念を理解する、
(2)ディスクスケジューリングの3つのアルゴリズムを習得する、
(3)CまたはC ++言語を使用してアルゴリズムをプログラムする。
3.実験方法:コンピューターを介してプログラムをデバッグおよび実行します。
4.実験環境:
(1)ハードウェア環境:
(2)ソフトウェア環境:Windows 10オペレーティングシステム、CまたはC ++プログラミング言語。
5.実験プロセス:
(1)実験の説明:
共有機器の典型的な代表はディスクです。ディスクの物理ブロックのアドレスは、シリンダー番号、ヘッド番号、およびセクター番号によって指定されます。ディスクの特定の物理ブロックへのアクセスを完了するには、3つの段階があります。 :シーク時間Ts、回転遅延時間Tw、読み取りおよび書き込み時間Trw。
シーク時間Tsは、ヘッドが現在のトラックからターゲットトラックに移動するのに必要な時間です。回転遅延時間Twは、ヘッドがターゲットトラックに留まった後、ターゲットの物理ブロックが現在の位置からヘッドの位置に回転する時間です。読み取りおよび書き込み時間Trwがターゲットです。物理ブロックの内容が対応するメモリと交換される時間。ディスクスケジューリングの原則は公平性と高スループットです。測定指標はアクセス時間Tと平均アクセス時間Taです
。T= Ts + Tw + Trw
Ta = Tsa + Twa + Trwaシーク
時間と回転遅延時間がスケジューリングアルゴリズムの主な考慮事項になります。因子。アクセス時間を短縮することは、シーク時間とローテーション遅延時間を短縮することです。
FCFSアルゴリズム:プロセスがディスクへのアクセスを要求する順序に従ってスケジューリングします
。SSTFアルゴリズム:アクセスされるトラックは、現在のヘッドが配置されているトラックに最も近い必要があるため、シーク時間が最短になります
。SCANアルゴリズム:アクセスされるトラックを考慮するだけでなく、トラック間の現在の距離ほど、ヘッドの現在の移動方向が優先されます。
(2)ソースコード:
#include<stdio.h>
int num,sum,kai,max;
int m=0;
int n=0;
int s[100];
int s1[100];
int c1[50];
int c2[50];
void creat(){
printf("请输入从哪个磁道开始:");
scanf("%d",&kai);
printf("请输入最长磁道号:");
scanf("%d",&max);
printf("请输入磁道的个数:");
scanf("%d",&num);
for(int j=0;j<num;j++){
printf("请输入第%d个磁道:",j+1);
scanf("%d",&s[j]);
if(s[j]>max) {
printf("ERROR\n");
break;
}
for(int i=0;i<j;i++)
if(s[j]==s[i])
j--;
}
printf("被访问的下一个磁道\n");
for(int i=0;i<num;i++){
printf("\t%d\t\n",s[i]);
}
int su=kai;
int t;
for(int i=0;i<num;i++)
if(su>s[i])
c1[m++]=s[i];
else
c2[n++]=s[i];
for(int i=0;i<m;i++)
for(int j=i;j<m;j++)
if(c1[i]<c1[j])
{
t=c1[i];c1[i]=c1[j];c1[j]=t;}
for(int i=0;i<n;i++)
for(int j=i;j<n;j++)
if(c2[i]>c2[j])
{
t=c2[i];c2[i]=c2[j];c2[j]=t;}
}
void FCFS(){
printf("先来先服务 FCFS:\n");
printf("被访问的下一个磁道\t\t\t磁道号移动距离:\n");
int su=kai;
sum=0;
for(int i=0;i<num;i++){
if(su<s[i])
s1[i]=s[i]-su;
else
s1[i]=su-s[i];
su=s[i];
sum+=s1[i];
}
for(int i=0;i<num;i++){
printf("\t%d\t\t\t\t\t%d\t\t\n",s[i],s1[i]);
}
printf("寻道长度:%d\n",sum);
}
void SSTF(){
printf("最短寻道 SSTF:\n");
printf("被访问的下一个磁道\t\t\t磁道号移动距离\n");
int su=kai;
int s2[100];
sum=0;
for(int i=0;i<m;i++)
s2[i]=c1[i];
for(int i=0;i<n;i++)
s2[i+m]=c2[i];
for(int i=0;i<num;i++){
if(su<s2[i])
s1[i]=s2[i]-su;
else
s1[i]=su-s2[i];
su=s2[i];
sum+=s1[i];
}
for(int i=0;i<num;i++){
printf("\t%d\t\t\t\t\t%d\t\t\n",s2[i],s1[i]);
}
printf("寻道长度:%d\n",sum);
}
void SCAN(){
printf("扫描算法 SCAN:\n");
printf("被访问的下一个磁道:\t\t\t磁道号移动距离:\n");
int su=kai;
int s2[100];
sum=0;
for(int i=0;i<n;i++)
s2[i]=c2[i];
for(int i=0;i<m;i++)
s2[i+n]=c1[i];
for(int i=0;i<num;i++){
if(su<s2[i])
s1[i]=s2[i]-su;
else
s1[i]=su-s2[i];
su=s2[i];
sum+=s1[i];
}
for(int i=0;i<num;i++){
printf("\t%d\t\t\t\t\t%d\t\t\n",s2[i],s1[i]);
}
printf("寻道长度:%d\n",sum);
}
void MENU(){
printf("磁盘调度\n");
printf("------------------------------------------\n");
printf(" 1.创建磁道\n");
printf(" 2.先来先服务 FCFS\n");
printf(" 3.最短寻道 SSTF\n");
printf(" 4.扫描算法 SCAN\n");
printf(" 5.退出 EXIT\n");
printf("------------------------------------------\n");
int menuchoice;
scanf("%d",&menuchoice);
if(menuchoice!=1&&menuchoice!=6){
printf("请先创建磁道\n");
}
if(menuchoice==6){
printf("谢谢使用!");
}
else{
creat();
printf("磁盘调度\n");
P:printf("------------------------------------------\n");
printf(" 1.创建磁道\n");
printf(" 2.先来先服务 FCFS\n");
printf(" 3.最短寻道 SSTF\n");
printf(" 4.扫描算法 SCAN\n");
printf(" 5.退出 EXIT\n");
printf("------------------------------------------\n");
scanf("%d",&menuchoice);
if(menuchoice>6||menuchoice<1){
printf("没看到菜单只有1-5吗?搞事情啊!!!\n");
goto P;
}
switch(menuchoice){
case 2:
FCFS();
goto P;
case 3:
SSTF();
goto P;
case 4:
SCAN();
goto P;
case 5:
printf("谢谢使用!");
break;
}
}
}
int main(){
MENU();
return 0;
}