資源簡(jiǎn)介
實(shí)驗(yàn)二 UNIX磁盤空間管理算法
(一) 實(shí)驗(yàn)?zāi)康?掌握UNIX外存空間管理中的分組鏈接算法。
(二) 實(shí)驗(yàn)內(nèi)容
編寫C語(yǔ)言程序,模擬UNIX磁盤空間管理中使用的分組鏈接法。
1.定義一個(gè)記錄磁盤塊號(hào)的堆棧S—free[10],以及記錄棧中現(xiàn)有磁盤塊數(shù)的變量S—nfree。
2.定義一個(gè)由40個(gè)元素構(gòu)成的結(jié)構(gòu)數(shù)組block[40]用作磁盤塊存放。
struct size
{ int blocl[10];
}
struct blocd
{ struct size a[10];
//用于在空閑磁盤塊號(hào)鏈中存放磁盤塊號(hào)
}block[40];
3. 假設(shè)系統(tǒng)中文件的最大容量為100個(gè)磁
代碼片段和文件信息
/*??操作系統(tǒng)實(shí)驗(yàn)2?os-2.c?Version?5.1??*/
//較Version?debug略有提高?Version?1.1
//增加了文件別名系統(tǒng)、修正了塊號(hào)定位錯(cuò)誤?Version?2.1
//更改了文件名讀入問(wèn)題、無(wú)空閑空間時(shí)屏蔽創(chuàng)建文件功能問(wèn)題、修正了部分注釋和系統(tǒng)提示信息、增加了文件系統(tǒng)狀態(tài)標(biāo)志數(shù)組state[]?Version?3.1
//增加了未知塊標(biāo)記、修正了釋放子函數(shù)當(dāng)??諘r(shí)不能將首個(gè)回收塊隊(duì)列信息頭置為-1的問(wèn)題、標(biāo)志位處理更加完善、重新矯正了錯(cuò)誤處理?Version?4.1
//新增遞歸檢測(cè)文件重名函數(shù)?Version?5.1
//當(dāng)前最新版本(初步優(yōu)化)?Version?5.1
#include? //for?I/O
#include? //for?rand()
#include? //for?time()
#include? //for?strcmp()
#define?BLOCK_SIZE 10 //塊大小
#define?BLOCK_NUM 10 //成組塊數(shù)
#define?GROUP_NUM 40 //組數(shù)
#define?B_S BLOCK_SIZE //塊大小 簡(jiǎn)記
#define?B_N BLOCK_NUM //成組塊數(shù) 簡(jiǎn)記
#define?G_N GROUP_NUM //組數(shù) 簡(jiǎn)記
#define?GB (G_N?*?B_N) //最大空閑塊數(shù)
int?S_free[B_N?+?1]; //空閑塊管理?xiàng)?br/>#define?S_nfree?S_free[B_N] //空閑塊指針,位于管理?xiàng)?shù)組的最后一個(gè)元素
struct?s_block{
unsigned?int?array[B_S];
};//塊結(jié)構(gòu)體
struct?s_group{
struct?s_block?block[B_N];
}group[G_N];//組結(jié)構(gòu)體、組數(shù)組
#define?FILE_MAX_NUM_OF_BLOCK 100 //文件最大塊數(shù)
#define?FILE_MAX_NUM 5 //最大文件數(shù)
#define?FMNOB FILE_MAX_NUM_OF_BLOCK //文件最大塊數(shù) 簡(jiǎn)記
#define?FMN FILE_MAX_NUM //最大文件數(shù) 簡(jiǎn)記
struct?File{
unsigned?int?fileblock[FMNOB];
}file[FMN];//文件結(jié)構(gòu)體、文件數(shù)組
//系統(tǒng)維護(hù)變量
int?start; //系統(tǒng)初始化空閑塊數(shù)、剩余塊數(shù)
int?bn; //文件所需塊數(shù)
unsigned?int?buffer[GB];//緩沖區(qū)
//文件命名系統(tǒng)?for?Version?2.1
#define?NAME_MAX?100
struct?filenames{
char?name[NAME_MAX];
int?fileno;
int?blocks;
}filename[FMN];
int?init(int?free_num); //初始化子函數(shù)
int?allocfile(int?fileno?int?sumblock); //分配子函數(shù)
int?freefile(int?fileno); //釋放子函數(shù)
void?showinfo(void); //查詢系統(tǒng)信息子函數(shù)
//文件重名糾錯(cuò)函數(shù)?for?Version?5.1
int?re(char?*name?int?fn?int?*bn);
//初始化子函數(shù):接受空閑塊數(shù)(0-G_N*B_N),包括空閑塊隊(duì)列初始化、管理?xiàng)3跏蓟?、棧指針初始化、文件初始化、文件名初始?br/>int?init(int?free_num)
{
int?i?j?k;
int?num?=?free_num;
unsigned?int?temp;//當(dāng)S_nfree?==?1時(shí),存儲(chǔ)棧中最后一個(gè)塊的塊號(hào)
//檢查錯(cuò)誤
if(num?0?||?num?>?GB)//空閑塊數(shù)錯(cuò)誤
{
printf(“init:空閑塊數(shù)值非法!\n“);
return?1;
}
printf(“init:程序初始化開始!\n“);
//初始化
//num?==?0
if(num?==?0)
{
S_nfree?=?-1;
printf(“init:當(dāng)前無(wú)空閑空間,若想存儲(chǔ)文件,請(qǐng)釋放足夠的空間!\n“);
goto?initfile;
}
//num?!=?0
for(i?=?0;?i? buffer[i]?=?-1;
srand((unsigned)time(NULL));//隨機(jī)種子
for(i?=?0;?i? {
again:
temp?=?(unsigned?int)(rand()?%?GB);//0-(GB-1)
for(j?=?0;?j? {
if(buffer[j]?==?-1)
break;
else?if(buffer[j]?==?temp)
goto?again;
}
buffer[i]?=?temp;
}
for(i?=?B_N;?i? {
for(j?=?i?-?B_N?k?=?0;?j? {
if(buffer[j]?==?-1)
break;
group[buffer[i]?/?B_N].block[buffer[i]?%?B_N].array[k]?=?buffer[j];
}
}
group[buffer[0]?/?B_N].block[buffer[0]?%?B_N].array[0]?=?-1;//置空閑塊隊(duì)列結(jié)束標(biāo)志為-1
if(num?%?B_N?==?0)//空閑塊數(shù)為10的倍數(shù)
{
j?=?num?-?B_N;//確定隊(duì)頭組的位置
S_nfree?=?B_N;//設(shè)置管理?xiàng)V羔?br/> }
else//空閑塊數(shù)不是10的倍數(shù)
{
j?=?num?-?num?%?B_N;//確定隊(duì)頭組的位置
S_nfree?=?num?%?B_N;//設(shè)置管理?xiàng)V羔?br/> }
for(i?=?0;?i? {
if(buffer[j]?==?-1)
break;
S_free[i]?=?buffer[j];
}
initfile:
//文件號(hào)系統(tǒng)初始化為-1
for(i?=?0;?i?
評(píng)論
共有 條評(píng)論