资源简介
实验二 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
- 上一篇:pos机收费管理程序
- 下一篇:操作系统实验-计算机进程管理和进程调度
相关资源
- 操作系统c语言模拟文件管理系统844
- C语言开发实战宝典
- C++中头文件与源文件的作用详解
- C语言代码高亮html输出工具
- 猜数字游戏 c语言代码
- C语言课程设计
- 数字电位器C语言程序
- CCS FFT c语言算法
- 使用C语言编写的病房管理系统
- 通信过程中的RS编译码程序(c语言)
- 计算机二级C语言上机填空,改错,编
- 用回溯法解决八皇后问题C语言实现
- 简易教务管理系统c语言开发文档
- 操作系统课设 读写者问题 c语言实现
- 小波变换算法 c语言版
- C流程图生成器,用C语言代码 生成C语
- 3des加密算法C语言实现
- 简单的C语言点对点聊天程序
- 单片机c语言源程序(51定时器 八个按
- 个人日常财务管理系统(C语言)
- c语言电子商务系统
- 小甲鱼C语言课件 源代码
- 将图片转换为C语言数组的程序
- C语言实现的一个内存泄漏检测程序
- DES加密算法C语言实现
- LINUX下命令行界面的C语言细胞游戏
- 用单片机控制蜂鸣器播放旋律程序(
- 学校超市选址问题(数据结构C语言版
- 电子时钟 有C语言程序,PROTEUS仿真图
- 尚观培训linux许巍老师关于c语言的课
评论
共有 条评论