模擬unix系統(tǒng)成組鏈接法實現(xiàn)磁盤存儲空間的管理_第1頁
模擬unix系統(tǒng)成組鏈接法實現(xiàn)磁盤存儲空間的管理_第2頁
模擬unix系統(tǒng)成組鏈接法實現(xiàn)磁盤存儲空間的管理_第3頁
模擬unix系統(tǒng)成組鏈接法實現(xiàn)磁盤存儲空間的管理_第4頁
模擬unix系統(tǒng)成組鏈接法實現(xiàn)磁盤存儲空間的管理_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

-.z.要求:模擬UNI*系統(tǒng)的空閑塊成組鏈接法,實現(xiàn)磁盤存儲空間的管理。[提示]:(1)假定磁盤存儲空間已被劃分成長度為n的等長塊,共有M塊可供使用。UNI*系統(tǒng)中采用空閑塊成組鏈接的方法來管理磁盤存儲空間,將磁盤中的每N個空閑塊〔N<M〕分成一組,最后一組可以缺乏N塊,每組的第一塊中登記了下一組空閑塊的塊數(shù)和塊號,第一組的塊數(shù)和塊號登記在專用塊中,登記的格式如下:0空閑塊數(shù)k1空閑塊號12空閑塊號2MMMMK空閑塊號kMMMM當(dāng)?shù)谝豁梼?nèi)容為"0〞時,則第二項起指出的空閑塊是最后一組。(2)現(xiàn)模擬UNI*系統(tǒng)的空閑塊成組鏈接,假定共有8塊可供使用,每3塊為一組,則空閑塊成組鏈接的初始狀態(tài)為:開場時,空閑塊號是順序排列的,但經(jīng)假設(shè)干次的分配和歸還操作后,空閑塊的鏈接就未必按序排列了。用二維數(shù)組A:array[0…M-1]ofarray[0…n-1]來模擬管理磁盤空間,用A[i]表示第I塊,第0塊A[0]作為專用塊。(3)成組鏈接的分組情況記錄在磁盤物理塊中,為了查找鏈接情況,必須把它們讀入主存,故當(dāng)磁盤初始化后,系統(tǒng)先將專用塊內(nèi)容復(fù)制到主存中。定義一個數(shù)組MA存放專用塊內(nèi)容,即MA:=A[0]。申請一塊磁盤空間時,查MA,從中找出空閑塊號,當(dāng)一組的空閑塊只剩第一塊時,則應(yīng)把該塊中指出的下一組的空閑塊數(shù)和塊號復(fù)制到專用塊中,然后把該塊分配給申請者。當(dāng)一組的空閑塊分配完后則把專用塊內(nèi)容〔下一組鏈接情況〕復(fù)制到主存,再為申請者分配。分配算法如下列圖。采用成組鏈接的分配算法(4)歸還一塊時給出歸還的塊號,假設(shè)當(dāng)前組不滿規(guī)定塊數(shù)時,將歸還塊登記入該組;假設(shè)當(dāng)前組已滿,則另建一新組,這時歸還塊作為新一組的第一塊,應(yīng)把主存中登記的一組鏈接情況MA復(fù)制到歸還塊中,然后在MA重新登記一個新組。歸還一塊的算法如下列圖。采用成組鏈接的回收算法(5)設(shè)計分配和歸還磁盤空間的程序,能顯示或打印分配的磁盤空間的塊號,在完成一次分配或歸還后能顯示或打印各空閑塊組的情況〔各組的空閑塊數(shù)和塊號〕。本實習(xí)省去了塊號與物理地址之間的轉(zhuǎn)換工作,而在實際的系統(tǒng)中必須進(jìn)展塊號與物理地址的轉(zhuǎn)換工作。(6)運行你所設(shè)計的程序,假定空閑塊鏈接的初始狀態(tài)如提示〔2〕,現(xiàn)先分配4塊,再依次歸還第2塊和第6塊。把執(zhí)行后分配到的塊號依次顯示或打印出來,且顯示或打印空閑塊組的情況。實驗報告設(shè)計者算法描述或流程圖1.根本思想:

首先定義磁盤分配數(shù)組并初始化,9個一維數(shù)組分別表示9個空閑塊,程序運行時,先將專用塊A〔0〕復(fù)制到內(nèi)存中,然后進(jìn)展功能選擇,分配時,查MA,從中找出空閑塊號,當(dāng)一組的空閑塊只剩第一塊時,應(yīng)把該塊中指出的下一組的空閑塊數(shù)和塊號復(fù)制到專用塊這,然后把該塊分配給申請者,當(dāng)一組的空閑塊分配完后則把專用塊內(nèi)容〔下一組鏈接情況〕復(fù)制到內(nèi)存,再為申請者分配。

回收時,輸入待回收的塊號,查找該塊是否已被分配,假設(shè)未分配,退出,否則,當(dāng)前組不滿規(guī)定塊數(shù)時,將歸還塊登記入該組,假設(shè)當(dāng)前組已滿,則另建一新組,這時歸還塊作為新一組的第一塊,應(yīng)把內(nèi)存中登記的一組鏈接情況MA復(fù)制到歸還塊中,然后在MA這重新登記一個新組。顯示分組情況。

2.程序流程:

建立磁盤分配并初始化

調(diào)用功能選擇函數(shù)進(jìn)展分配或回收操作。3.數(shù)據(jù)構(gòu)造及各子程序〔1〕intMA[4];

/*空閑塊數(shù)組*/〔2〕intA[9][4]={{3,1,2,3},{3,4,5,6},{0,0,0,0},{0,0,0,0},{3,0,7,8},

{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};

/*磁盤空間*/〔3〕intmark[9];

/*存放已分配的塊*/intNo=0;

/*已分配的塊數(shù)*/〔4〕voiddisplay():顯示分組情況

形參:無

返回參數(shù):無;〔5〕voidassign():分配空閑塊

形參:無

返回參數(shù):無;〔6〕voidcallback():回收空閑塊

形參:無

返回參數(shù):無;〔7〕voidmenu():功能選擇函數(shù)

形參:無

返回參數(shù):無;附:源程序

#include<stdio.h>intMA[4];

/*空閑塊數(shù)組*/

intA[9][4]={{3,1,2,3},{3,4,5,6},{0,0,0,0},{0,0,0,0},{3,0,7,8},

{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};

/*磁盤空間*/

intmark[9];

/*存放已分配的塊*/

intNo=0;

/*已分配的塊數(shù)*/voiddisplay1()

{

inti,j,temp,count;

No=0;

if(MA[1]!=0)

{

i=MA[0];

printf("\ngroup1:");

for(j=1;j<=i;j++)

{

printf("%d

",MA[j]);

mark[++No]=MA[j];

}

temp=MA[1];

count=2;

while(A[temp][1]!=0)

{

printf("\ngroup%d:",count);

i=A[temp][0];

for(j=1;j<=i;j++)

{

printf("%d

",A[temp][j]);

mark[++No]=A[temp][j];

}

count++;

temp=A[temp][1];

}

printf("\ngroup%d:",count);

i=A[temp][0];

for(j=2;j<=i+1;j++)

if(A[temp][j]>0)

{

printf("%d

",A[temp][j]);

mark[++No]=A[temp][j];

}

}

else

{

i=MA[0];

if(i==1)

printf("\nTheblocksareallassigned");

else

{

printf("\ngroup1:");

for(j=2;j<=i;j++)

{

printf("%d

",MA[j]);

mark[++No]=MA[j];

}

}

}

}voiddisplay()

/*顯示分組情況*/

{

inti,j;

if(MA[0]!=0)

display1();

else

{

i=MA[1];

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

MA[j]=A[i][j];

display1();

}

}voidassign()

/*分配空閑塊*/

{

ints,i;

if(MA[0]>1)

/*假設(shè)該組不止一個空閑塊*/

{

i=MA[0];

s=MA[i];

MA[0]--;

printf("\nnumberoftheblock:%d",s);

}

elseif(MA[0]==1)

/*只剩一個空閑塊*/

{

if(MA[1]!=0)

/*還有其它空閑塊組*/

{

s=MA[1];

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

A[0][i]=A[s][i];

MA[0]--;

printf("\nnumberoftheblock:%d",s);

}

else

/*沒有其它空閑塊組*/

{

printf("\nThereisn'tanyspace");

return;

}

}

else

/*當(dāng)前組已分配完*/

{

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

MA[i]=A[0][i];

assign();

}

display();

/*顯示分組情況*/

}voidcallback()

/*回收空閑塊*/

{

inti,j,temp;

printf("\ninputtheNo.oftheblockyouwanttocallback:");

scanf("%d",&j);

getchar();

/*得到待回收的空閑塊號*/

for(temp=1;temp<=No;temp++)

{

if(mark[temp]==j)

break;

}

if(temp<No+1)

/*假設(shè)該空閑塊已在,退出*/

{

printf("\nTheblockisinthedisk");

return;

}

if(MA[0]<3)

/*當(dāng)前組不滿3塊*/

{

i=MA[0];

MA[i+1]=j;

MA[0]++;

}

else

/*已有3塊*/

{

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

A[j][i]=MA[i];

MA[0]=1;

MA[1]=j;

}

display();

/*顯示*/

}voidmenu()

/*功能選擇函數(shù)*/

{

intchoice;

charjudge;

printf("\ninputyourchoice:(1--assign,2--callback):");

scanf("%d",&choice);

getchar();

if(choice==1)

assign();

elseif(choice==2)

callback();

else

printf("\ninvalidcommand!");

printf("\ncontinueornot"(y--Yes,n--Not):");

scanf("%c",&judge);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論