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