操作系统:文件系统

文件系统

一、 实验目的

通过设计一个基于索引结构的文件系统,
了解文件系统设计以及物理块分配的基本概念。

二、 实验工具

硬件环境:计算机一台,局域网环境;
软件环境: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;

}

猜你喜欢

转载自blog.csdn.net/qq_45056216/article/details/106904034