操作系统 文件存储空间管理

2019-03-09 17:27

#include \ #include #include #include

int physic[100]; //文件地址缓冲区 int style=1; //文件的类型

char cur_dir[10]=\ //当前目录

struct command {

char com[10]; }cmd[13]; struct block {

int n; //空闲的盘快的个数

int free[50]; //存放空闲盘快的地址 int a; //模拟盘快是否被占用 }memory[20449]; struct block_super {

int n; //空闲的盘快的个数

int free[50]; //存放进入栈中的空闲块

int stack[50]; //存放下一组空闲盘快的地址 }super_block;

struct node //i结点信息 {

int file_style; //i结点 文件类型 int file_length; //i结点 文件长度

int file_address[100]; //i结点 文件的物理地址 } i_node[640];

struct dir //目录项信息 {

char file_name[10]; //文件名 int i_num; //文件的结点号

char dir_name[10]; //文件所在的目录 } root[640];

void format() //格式化 {

int i,j,k;

super_block.n=50;

for(i=0;i<50;i++) //超级块初始化 {

super_block.free[i]=i; //存放进入栈中的空闲块

super_block.stack[i]=50+i; //存放下一组的盘块 }

for(i=0;i<640;i++) //i结点信息初始化 {

for(j=0;j<100;j++) {

i_node[i].file_address[j]=-1;//文件地址 }

i_node[i].file_length=-1; //文件长度 i_node[i].file_style=-1; //文件类型 }

for(i=0;i<640;i++) //根目录区信息初始化 {

strcpy(root[i].file_name,\ root[i].i_num=-1;

strcpy(root[i].dir_name,\ }

for(i=0;i<20449;i++) //存储空间初始化 {

memory[i].n=0; //必须有这个 memory[i].a=0; for(j=0;j<50;j++) {

memory[i].free[j]=-1; } }

for(i=0;i<20449;i++) //将空闲块的信息用成组链接的方法写进每组的最后一个块中 { //存储空间初始化

if((i+1)P==0) {

k=i+1;

for(j=0;j<50;j++) {

if(k<20450) {

memory[i].free[j]=k;//下一组空闲地址

memory[i].n++; //下一组空闲个数 注意在memory[i].n++之前要给其赋初值 k++; } else {

memory[i].free[j]=-1; }

}

memory[i].a=0; //标记为没有使用

continue; //处理完用于存储下一组盘块信息的特殊盘块后,跳过本次循环 }

for(j=0;j<50;j++) {

memory[i].free[j]=-1; }

memory[i].n=0; }

printf(\已经初始化完毕\\n\

printf(\进入UNIX文件模拟............\\n\\n\

void write_file(FILE *fp) //将信息读入系统文件中 { int i;

fp=fopen(\ for(i=0;i<20449;i++) {

fwrite(&memory[i],sizeof(struct block),1,fp); }

fwrite(&super_block,sizeof(struct block_super),1,fp); for(i=0;i<640;i++) {

fwrite(&i_node[i],sizeof(struct node),1,fp); }

for(i=0;i<640;i++) {

fwrite(&root[i],sizeof(struct dir),1,fp); }

fclose(fp); }

void read_file(FILE *fp) //读出系统文件的信息 { int i;

fp=fopen(\ for(i=0;i<20449;i++) {

fread(&memory[i],sizeof(struct block),1,fp); }

fread(&super_block,sizeof(struct block_super),1,fp); for(i=0;i<640;i++) {

fread(&i_node[i],sizeof(struct node),1,fp);

}

for(i=0;i<640;i++) {

fread(&root[i],sizeof(struct dir),1,fp); }

fclose(fp); }

void callback(int length) //回收磁盘空间 {

int i,j,k,m,q=0;

for(i=length-1;i>=0;i--) {

k=physic[i]; //需要提供要回收的文件的地址 m=49-super_block.n; //回收到栈中的哪个位置

if(super_block.n==50) //注意 当super_block.n==50时 m=-1;的值 { //super_block.n==50的时候栈满了,要将这个栈中的所有地址信息写进下一个地址中

for(j=0;j<50;j++) {

memory[k].free[j]=super_block.free[j]; }

super_block.n=0; memory[k].n=50; }

memory[k].a=0; if(m==-1) {

m=49; //将下一个文件地址中的盘块号回收到栈底中,这个地址中存放着刚才满栈的地址的信息 }

super_block.free[m]=physic[i]; //将下一个文件地址中的盘块号回收到栈中 super_block.n++; } }

void allot(int length) //分配空间 {

int i,j,k,m,p;

for(i=0;i

k=50-super_block.n; //超级块中表示空闲块的指针 m=super_block.free[k]; //栈中的相应盘块的地址

p=super_block.free[49]; //栈中的最后一个盘块指向的地址 if(m==-1||memory[p].a==1) //检测是否还有下一组盘块 {

printf(\内存不足,不能够分配空间\\n\ callback(length); break; }

if(super_block.n==1) {

memory[m].a=1; //将最后一个盘块分配掉 physic[i]=m;

super_block.n=0;

for(j=0;j

super_block.free[j]=memory[m].free[j]; super_block.n++; }

continue; //要跳过这次循环,下面的语句在IF中已经执行过 }

physic[i]=m; //栈中的相应盘块的地址写进 文件地址缓冲区 memory[m].a=1; super_block.n--; } }

void create_file(char filename[],int length) //创建文件 {

int i,j;

for(i=0;i<640;i++) {

if(strcmp(filename,root[i].file_name)==0) {

printf(\文件已经存在,不允许建立重名的文件\\n\ return; } }

for(i=0;i<640;i++) {

if(root[i].i_num==-1) {

root[i].i_num=i;

strcpy(root[i].file_name,filename);

strcpy(root[i].dir_name,cur_dir); //把当前目录名 给新建立的文件 i_node[i].file_style=style; i_node[i].file_length=length; allot(length);

for(j=0;j


操作系统 文件存储空间管理.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2018年中国金属银市场调查及前景报告目录

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: