资源简介
实验二 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语言
- C语言经典算法大全(非常全的算法
- 谭浩强c语言程序设计 pdf
- 用C语言编写的电梯控制程序有界面显
- LeNet-5神经网络——C源代码
- 随机森林C语言
- C语言模拟Excel简单操作
- C语言写的UDP文件传输
- 哈工大 苏小红老师编的 C语言大学实
- c语言编程实现聊天程序设计
- C语言实现最低松弛度优先算法源代码
- 基于winpcap的网络嗅探器C语言源代码
- C语言版本2048游戏.rar
- 冲击-中国足球之路(dos).rar
- pic16的C语言例程
- c语言小游戏 雷霆战机ege图形库实现版
- Linux软件工程师(C语言)实用教程_
- C语言在vc下编写的Windows窗口小程序
- 数据结构课程设计图书管理系统c语言
- 郝斌C语言180课PPT及源码
- C语言编写的跨平台线程库
- C语言写的文件传输系统
- C语言读HZK16HZK24HZK32 显示
- 基于SIFT算法的图像拼接--C语言实现
- C语言实现图像的旋转缩放裁切
- 用C语言编写的经典小游戏
- 数字信号处理C语言各种算法实现
- 变频器源码 DSPIC30F5015电机控制专用芯
- 51单片机程序大全C语言写的150个程序
- 各大IT公司C语言面试笔试题目很全的
评论
共有 条评论