91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 14KB
    文件類型: .c
    金幣: 1
    下載: 0 次
    發布日期: 2021-05-21
  • 語言: C/C++
  • 標簽: C語言??UNIX??

資源簡介

實驗二 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??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?

評論

共有 條評論