通过设计一个基于索引结构的文件系统,
了解文件系统设计以及物理块分配的基本概念。
硬件环境:计算机一台,局域网环境;
软件环境:Windows 操作系统、Visual studio2019
1、设计一个文件系统的索引结构,描述逻辑结构与物理索引结构之间的关系;
2、文件建立等基本功能;
代码段:
/*问1、这个头文件的作用是什么??*/
//作用:输入输出相关的函数声明,控制台或文件
/*问2、这个头文件的作用是什么??*/
//作用:里面定义了五种类型、一些宏和通用工具函数。
#include "stdio.h"
#include "stdlib.h"
//问3、以下是什么内容的定义?
//文件索引表的建立
struct index{
int lr[32];
/*问4、lr是什么?*/
//逻辑块号
int pr[32];
/*问5、pr是什么?*/
//物理块地址
char st[32];
}*wq;
#define JOBN 20
//问6、本句的作用是什么?
//将索引表设为JOBN 为20
//问7、以下是什么内容的定义?
//文件目录
struct list {
char names[32];
int size[32];
struct index* p[32]; //文件的索引表地址
}*HEAD;
//作业序列
struct que {
char name;
int size;
}job[JOBN];
int i, j, ly, li;
char bb;
int NFile = 0;//系统的总文件数,模拟开始时为0;
int N = 0;//工作变量,标记当前分配文件
int M = 32;//系统中空闲磁盘物理块数,开始为32块
int J[4][8]; //用位图表示这些磁盘物理块,J[j][i]为0时标记第j*8+i块空闲,为1标记该块已分配出去
FILE* e; //记录模拟中的相关数据
int jobs = 0; //作业数
/*问8、fenpei函数的作用是什么?根据以下代码和注释分析,请在实验报告中画出fenpei函数流程图*/
//如果当前空闲磁盘物理块数能够满足需要,则为文件进行分配空间
//将文件名以及大小,索引地址填写到文件目录
void fenpei() {
int x1, y, z;
if (job[N].size <= M)//如果当前空闲磁盘物理块数能够满足需要,则进行分配
{
ly = 0;
N = NFile;//标记当前分配文件
NFile++;//标记下次分配处理文件
M -= job[N].size;
HEAD->names[N] = job[N].name;
//将文件名以及大小,索引地址填写到文件目录
HEAD->size[N] = job[N].size;
wq = (struct index*)malloc(sizeof(struct index));
HEAD->p[N] = wq;
//对分配文件的索引表初始化
for (z = 0; z < 32; z++)
{
wq->lr[z] = z; //逻辑块号
wq->pr[z] = 0; //物理块地址
wq->st[z] = 'N';
}
//从位图中分配,分配出去的块其状态为1。一直到分配完成
for (j = 0; j < 4 && (ly < job[N].size); j++)
for (i = 0; i < 8 && (ly < job[N].size); i++)
{
if (J[j][i] == 0)
{
li = j * 8 + i;
wq->pr[ly] = li;
wq->st[ly] = 'Y';
ly++;
J[j][i] = 1;
} //找到一个空闲块,就分配出去
}
}
//如果当前空闲磁盘物理块数不能够满足需要,则出错处理
else {
fprintf(e, "\n There are no free blocks in the memory now! \n");
fprintf(e, "File %c must wait!\n", job[N].name);
}
//报告目前为止的分配情况,首先报告文件目录的部分信息
fprintf(e, "\n.........................................\n");
fprintf(e, "\n...This time ,the file directory: ----\n");
fprintf(e, "NAME INDEX_ADDRESS\n");
for (x1 = 0; x1 < N + 1; x1++)
fprintf(e, " %c %x\n", HEAD->names[x1], HEAD->p[x1]);
//其次报告文件索引表的部分信息
for (x1 = 0; x1 < N + 1; x1++)
{
fprintf(e, " //The index of FILE%c:/\n", HEAD->names[x1]);
fprintf(e, " LOGIC_NUMBER PHYSICAL_NUMBER FLAG\n");
for (y = 0; y < HEAD->size[x1]; y++)fprintf(e, " %d %d %c\n", HEAD->p[x1]->lr[y], HEAD->p[x1]->pr[y], HEAD->p[x1]->st[y]);
}
//第三,报告位图信息
fprintf(e, "This time the bit mapping graph: \n");
for (j = 0; j < 4; j++) {
fprintf(e, " ");
for (i = 0; i < 8; i++)
fprintf(e, "%d", J[j][i]);
fprintf(e, "\n");
}
}
/*9、请将程序运行结果截图*/
/*10、请问结果文件的名字以及保存位置?*/
//文件:results
//保存位置:c:/results.txt
/*11、请对照代码对结果文件的内容加以分析*/
//初始化位图和文件目录
void main() {
int k;
e = fopen("c:/results.txt", "w");
for (j = 0; j < 4; j++)
for (i = 0; i < 8; i++)
J[j][i] = 0;//初始化位图
HEAD = (struct list*)malloc(sizeof(struct list));
for (i = 0; i < 32; i++) {
HEAD->names[i] = ' '; HEAD->size[i] = 0; HEAD->p[i] = NULL; }//初始化文件目录
printf("Please input number of jobs:");
scanf("%d", &jobs);
scanf("%c", &bb);
printf("\n");
int kk = 0;
//问12、以下输入的是什么?请问这些信息保存在哪个数据结构中?
// 将输入的文件保存在job数组中
while (kk < jobs)
{
fprintf(e, "FILE %d: \n", kk);
printf("FILE %d: \n", kk);
printf("Name and Size");
scanf("%c,%d", &(job[kk].name), &(job[kk].size));
scanf("%c", &bb);
fprintf(e, "%c,%d\n", job[kk].name, job[kk].size);
kk++;
}
for (k = 1; k <= jobs; k++)
fenpei();//每个文件进行一次分配
//问13、以下4行代码的作用是什么?
//将内存回收,释放内存
fclose(e);
for (i = 0; i < 32; i++) {
free(HEAD->p[i]); HEAD->p[i] = NULL; }
free(HEAD);
HEAD = NULL;
}