資源簡介
磁盤初始化時把磁盤存儲空間分成許多塊(扇區),這些空間可以被多個用戶共享。用戶作業在執行期間常常要在磁盤上建立文件或把已經建立在磁盤上的文件刪去,這就涉及到磁盤存儲空間的分配和回收。一個文件存放到磁盤上,可以組織成順序文件(連續文件)、鏈接文件(串聯文件)、索引文件等,因此,磁盤存儲空間的分配有兩種方式,一種是分配連續的存儲空間,另一種是可以分配不連續的存儲空間。怎樣有效地管理磁盤存儲空間是操作系統應解決的一個重要問題,通過本實驗使學生掌握磁盤存儲空間的分配和回收算法。

代碼片段和文件信息
#include?
#include?
#include?
#include?
using?namespace?std;
const?int?cylinder=8track=2sector=4;
#define?SIZE?100
const?int?M=cylinderN=track*sector;
void?delay();/*延時效果*/
void?ReadMe();/*本程序的一些說明信息*/
int?bitmapisok();/*計算程序中的可分配物理塊數*/
void?Initbitmap();/*初始化位示圖*/
void?allocate(char?name[10]int?n);/*分配*/
void?reclaim(char?name[10]);/*回收*/
void?displaymap();/*顯示位示圖*/
struct?fbc/*描述FBC的數據結構*/
{
char?name[10];
int?c[SIZE]t[SIZE]s[SIZE];
int?n;
};
fbc?fbctable[SIZE];/*FBC表*/
int?bitmap[M][N];/*全局變量,位示圖矩陣*/
int?tablep=-1;/*全局變量,FBC掃描偽指針*/
void?delay()//延時2秒
{?
time_t?tm1tm2;
time(&tm1);
while?(time(&tm2))?
{
if?(tm2-tm1==2)
break;
}
}
void?ReadMe()/*程序相關說明信息*/
{
system(“color?0b“);
cout<<“\t\t**********************************************\n“;
cout<<“\t\t*\t\t操作系統綜合實驗\t?????*\n“;
cout<<“\t\t*\t位示圖法管理文件存儲空間的分配與回收?*\n“;
cout<<“\t\t* 實驗組成員\t\t\t?????*\n“;
cout<<“\t\t* 組長:葛加文\t\t\t?????*\n“;
cout<<“\t\t* 成員:周顏安???翟秋明 崔建奎\t?????*\n“;
cout<<“\t\t**********************************************\n“;
getch();
system(“cls“);
system(“color?0c“);
cout<<“\n說明:\n假設現在有一個盤組共8個柱面,每個柱面有2個磁道,每個磁道分成4個物理記錄\n“;
getch();
system(“cls“);
system(“color?0f“);
}
int?bitmapisok()/*統計空閑的物理塊*/
{
int?count=0;
for(int?i=0;i {
??for(int?j=0;j if(bitmap[i][j]==0)
count++;
}
return?count;
}
void?Initbitmap()
{
?int?ij;
?cout<<“==============================================\n“;
?cout<<“ 位示圖初始化\n“;
?cout<<“==============================================\n“;
?for(i=0;i for(j=0;j bitmap[i][j]=0;
?cout<<“\n\t初始化中……\n“;
?getchar();
?displaymap();
?getchar();
?system(“cls“);
}
?
void?allocate(char?name[10]int?n)//分配
{
??int?ij;
??int?count=0;/*計數器*/
??if(bitmapisok() ??{
cout<<“空間不足,找不到“< return;
??}
??tablep++;
??strcpy(fbctable[tablep].namename);
??fbctable[tablep].n=n;
??for(i=0;i ??{
??for(j=0;j if(bitmap[i][j]==0)?
{
fbctable[tablep].c[count]=i;/*柱面號*/
fbctable[tablep].t[count]=j/4;/*磁道號*/
fbctable[tablep].s[count]=j%4;/*物理記錄號*/
bitmap[i][j]=1;
count++;
if(count==n)
return;
}
??}
}
void?reclaim(char?name[10])//回收
{
int?ijflag=0;
for(i=0;i<=tablep;i++)
{
if(!strcmp(fbctable[i].namename))
{
for(j=0;j bitmap[fbctable[i].c[j]][4*fbctable[i].t[j]+fbctable[i].s[j]]=0;
for(int?k=i;k<=tablep-i;k++)//FBC表項移動
{
strcpy(fbctable[k].namefbctable[k+1].name);
fbctable[k].n=fbctable[k+1].n;
for(int?l=0;l {
fbctable[k].c[l]=fbctable[k+1].c[l];
fbctable[k].t[l]=fbctable[k+1].t[l];
fbctable[k].s[l]=fbctable[k+1].s[l];
}
}
tablep--;
flag=1;
delay();
cout<<“\n找到文件,回收完畢。\n“;
}
}
if(flag==0)
cout<<“\n未找到文件名為“< }
void?displaymap()//
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????4784??2009-11-24?23:18??綜合實驗(修訂終結版).cpp
?????文件?????154624??2009-11-25?00:19??操作系統綜合實驗(終結版版).doc
-----------?---------??----------?-----??----
???????????????159408????????????????????2
評論
共有 條評論