一、實(shí)驗(yàn)?zāi)康?/h2>
掌握文件的存取方法;掌握文件的邏輯結(jié)構(gòu)和物理結(jié)構(gòu);掌握存儲空間的分配和回收;掌握磁盤管理與調(diào)度。
二、實(shí)驗(yàn)內(nèi)容
用程序模擬磁盤的調(diào)度過程,并計(jì)算各磁盤調(diào)度算法包括先來先服務(wù)算法、最短尋道時(shí)間優(yōu)先算法、掃描算法和循環(huán)掃描算法的平均尋道長度。
本實(shí)驗(yàn)是模擬操作系統(tǒng)的磁盤尋道方式,運(yùn)用磁盤訪問順序的不同來設(shè)計(jì)磁盤的調(diào)度算法。實(shí)現(xiàn)的磁盤調(diào)度算法有FCFS,SSTF,SCAN,CSCAN和 NStepSCAN算法。設(shè)定開始磁道號尋道范圍,依據(jù)起始掃描磁道號和最大磁道號數(shù),隨機(jī)產(chǎn)生要進(jìn)行尋道的磁道號序列。選擇磁盤調(diào)度算法,顯示該算法的磁道訪問順序,計(jì)算出移動的磁道總數(shù)和平均尋道總數(shù)。按算法的尋道效率進(jìn)行排序,并對各算法的性能進(jìn)行分析比較。
三、數(shù)據(jù)結(jié)構(gòu)
3.1 函數(shù)以及功能
函數(shù)名稱 | 功能描述 |
---|---|
void FCFS(int b[],int n,int init) | 先來先服務(wù)算法(FCFS) |
void SSTF(int b[],int n,int k) | 最短尋道時(shí)間優(yōu)先算法(SSTF) |
void SCAN1(int b[],int n,int k) | 掃描算法(SCAN)由外向里 |
void SCAN2(int b[],int n,int k) | 掃描算法(SCAN)由里向外 |
void FCFS(int b[],int n,int init) | 循環(huán)算法(C—SCAN) |
int main() | main函數(shù) |
四、程序流程圖
五、實(shí)驗(yàn)代碼
#include<stdio.h>
#include<math.h>
#define SYSINFO "文件管理" // 系統(tǒng)信息
#define AUTHOR "孤燈" //作者
void FCFS(int b[],int n,int init)
{
int i = 0;
int s = 0;
int sum = 0;
int a[20];
for(i = 0; i < n; i++)
{
a[i] = b[i];
}
s = init;
sum = 0;
for(i = 0; i < n; i++)
{
printf("第%d次訪問的磁道:%d\n", i+1, a[i]);
sum += abs(s - a[i]);
printf("sum=%d\n", sum);
s = a[i];
}
printf("平均尋道長度:%f\n", sum * 1.0 / n);
}
void SSTF(int b[],int n,int k)
{
int i = 0;
int j = 0;
int s = 0;
int sum = 0;
int p = 0;
int a[20];
for(i = 0; i < n; i++)
{
a[i] = b[i];
}
for(i = n-1; i >= 0; i--)
{
s = a[0];
p = 0;
for(j = 0; j <= i; j++)
if(abs(a[j] - k) < abs(s - k))
{
s = a[j];
p = j;
}
a[p] = a[i];
printf("第%d次訪問的磁道:%d\n", n-i, s);
sum += abs(s - k);
printf("sum=%d\n", sum);
k = s;
}
printf("平均尋道長度:%f\n",sum * 1.0 / n);
}
void SCAN1(int b[],int n,int k)
{
int i = 0;
int j = 0;
int s = 0;
int sum=0;
int p = 0;
int biaoji = 0;
int a[20];
for(i=0; i<n; i++)
{
a[i] = b[i];
}
for(i = n-1; i >= 0; i--)
{
biaoji = 0;
for(j = 0; j <= i; j++)
{
if(a[j] - k <= 0)
{
biaoji=1;
p=j;
break;
}
}
if(biaoji==1)
{
s=a[p];
for(j=0; j<=i; j++)
if(a[j]<k&&k-a[j]<k-s)
{
s=a[j];
p=j;
}
a[p]=a[i];
printf("第%d次訪問的磁道:%d\n",n-i,s);
sum+=k-s;
printf("sum=%d\n",sum);
k=s;
}
else
{
s=a[0];
for(j=0; j<=i; j++)
if(a[j]-k<=s-k)
{
s=a[j];
p=j;
}
a[p] = a[i];
printf("第%d次訪問的磁道:%d\n",n-i,s);
sum += abs(k-s);
printf("sum=%d\n",sum);
k = s;
}
}
printf("平均尋道長度:%f\n",sum * 1.0 / n);
}
void SCAN2(int b[],int n,int k)
{
int i = 0;
int j = 0;
int s = 0;
int sum=0;
int p = 0;
int biaoji = 0;
int a[20];
for(i = 0; i < n; i++)
{
a[i] = b[i];
}
for(i = n - 1; i >= 0; i--)
{
biaoji = 0;
for(j = 0; j <= i; j++)
{
if(a[j] - k >= 0)
{
biaoji = 1;
p = j;
break;
}
}
if(biaoji == 1)
{
s = a[p];
for(j = 0; j <= i; j++)
if(a[j]>k&&a[j]-k<s-k)
{
s=a[j];
p=j;
}
a[p]=a[i];
printf("第%d次訪問的磁道:%d\n",n-i,s);
sum += s-k;
printf("sum=%d\n", sum);
k = s;
}
else
{
s = a[0];
for(j = 0; j <= i; j ++)
{
if(k - a[j] <= k - s)
{
s = a[j];
p = j;
}
}
a[p] = a[i];
printf("第%d次訪問的磁道:%d\n", n - i, s);
sum += abs(k - s);
printf("sum=%d\n",sum);
k = s;
}
}
printf("平均尋道長度:%f\n",sum * 1.0 / n);
}
void C_SCAN(int b[],int n,int k)
{
int i = 0;
int j = 0;
int s = 0;
int sum=0;
int p = 0;
int biaoji = 0;
int a[20];
for(i = 0; i < n; i++)
{
a[i] = b[i];
}
for(i = n-1; i >= 0; i--)
{
biaoji=0;
for(j = 0; j <= i; j++)
{
if(a[j]-k <= 0)
{
biaoji=1;
p=j;
break;
}
}
if(biaoji == 1)
{
s = a[p];
for(j = 0; j <= i; j++)
{
if(a[j] < k && a[j] - k > s - k)
{
s = a[j];
p = j;
}
}
a[p] = a[i];
printf("第%d次訪問的磁道:%d\n", n-i, s);
sum += s - k;
printf("sum=%d\n", sum);
k = s;
}
if(biaoji==0)
break;
}
s = a[0];
for(j = 0; j <= i; j++)
{
if(a[j] >= s)
{
s = a[j];
p = j;
}
}
a[p] = a[i];
printf("第%d次訪問的磁道:%d\n", n - i, s);
sum += k - s;
printf("sum=%d\n", sum);
k = s;
i --;
for(i; i >= 0; i --)
{
s = a[0];
for(j = 0; j <= i; j ++)
{
if(a[j] - k >= s - k)
{
s = a[j];
p = j;
}
}
a[p] = a[i];
printf("第%d次訪問的磁道:%d\n", n-i, s);
sum += s - k;
printf("sum=%d\n", sum);
k=s;
}
printf("平均尋道長度:%f\n", sum * 1.0 / n);
}
int main()
{
int a[20] = {0};
int i = 0;
int n = 0;
int k = 0;
int k1 = 0;
int init = 0;
printf("請輸入需要訪問的磁道總數(shù):");
scanf("%d", &n);
printf("要輸入的訪問序列要有重復(fù)值和距離相等的值,例如:初始值為5,序列中必須含有5,4,6,這樣的序列。\n");
for(i = 0; i < n; i++)
{
printf("需要訪問的磁道%d:",i+1);
scanf("%d",&a[i]);
}
printf("請輸入指針?biāo)诖诺?");
scanf("%d",&init);
k = 1;
while(k)
{
printf("**********************************\n");
printf("%s\nDesigned By:%s\n", SYSINFO, AUTHOR);
printf("**1.先來先服務(wù)(FCFS)**\n");
printf("**2.最短尋道時(shí)間優(yōu)先(SSTF)**\n");
printf("**3.掃描算法(SCAN)**\n");
printf("**4.循環(huán)算法(C-SCAN)**\n");
printf("**0.退出**\n");
printf("**********************************\n");
printf("請?jiān)谙旅孑斎肽倪x擇:");
scanf("%d", &k);
switch(k)
{
case 1:
FCFS(a, n, init);
break;
case 2:
SSTF(a, n, init);
break;
case 3:
k1=1;
while(k1)
{
printf("**1.移動臂由里向外**\n");
printf("**2.移動臂由外向里**\n");
printf("**0.返回上一層**\n");
printf("**********************************\n");
printf("請?jiān)谙旅孑斎肽倪x擇:");
scanf("%d", &k1);
switch(k1)
{
case 1:
SCAN1(a, n, init);
break;
case 2:
SCAN2(a, n, init);
break;
}
}
case 4:
C_SCAN(a, n, init);
break;
}
}
return 0;
}
六、實(shí)驗(yàn)結(jié)果
1)輸入訪問的磁道數(shù)及需要訪問的磁道
2)輸入初始指針?biāo)诖诺牢恢?,選擇FCFS算法
3)最短尋道時(shí)間優(yōu)先算法(SSTF)
4)掃描算法(SCAN)由里向外
5)掃描算法(SCAN)由外向里
6)循環(huán)算法(C—SCAN)文章來源:http://www.zghlxwxcb.cn/news/detail-464527.html
七、實(shí)驗(yàn)體會總結(jié)
體會與總結(jié):文章來源地址http://www.zghlxwxcb.cn/news/detail-464527.html
- 此次實(shí)驗(yàn)思路簡單,目的明確,就是集中文件管理方法的算法的代碼實(shí)現(xiàn),分為幾種不同的算法,通過代碼加以實(shí)現(xiàn),從而實(shí)現(xiàn)文件管理。
- 此次實(shí)驗(yàn)設(shè)計(jì)到四個(gè)文件管理算法,分別是先來先服務(wù)算法(FCFS)、最短尋道時(shí)間優(yōu)先算法(SSTF)、SCAN掃描算法、循環(huán)算法(C—SCAN)。
- 先來先服務(wù)(FCFS):根據(jù)進(jìn)程請求訪問磁盤的先后次序進(jìn)行調(diào)度。
- 最短尋道時(shí)間優(yōu)先(SSTF):其要求訪問的磁道與當(dāng)前磁頭所在的磁道距離最近,以使每次的尋道時(shí)間最短,但這種調(diào)度算法卻不能保證平均尋道時(shí)間最短。
- 掃描算法(SCAN):當(dāng)磁頭正在由里向外移動時(shí),SCAN算法所選擇的下一個(gè)訪問對象應(yīng)是其欲訪問的磁道,既在當(dāng)前磁道之外,又是距離最近的。這樣由里向外地訪問,直至再無更外的磁道需要訪問時(shí),才將磁臂換向,由外向里移動。也叫電梯算法。
- 通過此次實(shí)驗(yàn)加深了我對這幾種算法的理解,以及熟悉了算法的流程,對這幾種磁盤調(diào)度算法有了更清晰的認(rèn)知。
- 此次實(shí)驗(yàn)已經(jīng)是操作系統(tǒng)這門課程的最后一次實(shí)驗(yàn)了,這次實(shí)驗(yàn)算是畫上一個(gè)圓滿的句號,這門課的句號,但是以后的逗號,行路并不止于此,路漫漫其修遠(yuǎn)兮,吾將上下而求索。
到了這里,關(guān)于操作系統(tǒng) | 實(shí)驗(yàn)八 文件管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!