• 大小: 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 < 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 < GB; i++)//初始化buffer
buffer[i] = -1;
srand((unsigned)time(NULL));//随机种子
for(i = 0; i < num; i++)//生成num个空闲块号
{
again:
temp = (unsigned int)(rand() % GB);//0-(GB-1)
for(j = 0; j < GB; j++)//判断块号是否已存在,若存在则重新生成块号
{
if(buffer[j] == -1)
break;
else if(buffer[j] == temp)
goto again;
}
buffer[i] = temp;
}
for(i = B_N; i < num; i += B_N)//写入组数据到前组第一个块
{
for(j = i - B_N k = 0; j < i; j++ k++)
{
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 < B_N; i++ j++)//将队头组导入管理栈
{
if(buffer[j] == -1)
break;
S_free[i] = buffer[j];
}

initfile:
//文件号系统初始化为-1
for(i = 0; i < FMN; i

评论

共有 条评论