操作系统文件存储空间管理.docx
- 文档编号:4771198
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:24
- 大小:20.61KB
操作系统文件存储空间管理.docx
《操作系统文件存储空间管理.docx》由会员分享,可在线阅读,更多相关《操作系统文件存储空间管理.docx(24页珍藏版)》请在冰豆网上搜索。
操作系统文件存储空间管理
#include"stdio.h"
#include
#include
#include
intphysic[100];//文件地址缓冲区
intstyle=1;//文件的类型
charcur_dir[10]="root";//当前目录
structcommand
{
charcom[10];
}cmd[13];
structblock
{
intn;//空闲的盘快的个数
intfree[50];//存放空闲盘快的地址
inta;//模拟盘快是否被占用
}memory[20449];
structblock_super
{
intn;//空闲的盘快的个数
intfree[50];//存放进入栈中的空闲块
intstack[50];//存放下一组空闲盘快的地址
}super_block;
structnode//i结点信息
{
intfile_style;//i结点文件类型
intfile_length;//i结点文件长度
intfile_address[100];//i结点文件的物理地址
}i_node[640];
structdir//目录项信息
{
charfile_name[10];//文件名
inti_num;//文件的结点号
chardir_name[10];//文件所在的目录
}root[640];
voidformat()//格式化
{
inti,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)%50==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");}
voidwrite_file(FILE*fp)//将信息读入系统文件中
{
inti;
fp=fopen("system","wb");
for(i=0;i<20449;i++)
{
fwrite(&memory[i],sizeof(structblock),1,fp);
}
fwrite(&super_block,sizeof(structblock_super),1,fp);
for(i=0;i<640;i++)
{
fwrite(&i_node[i],sizeof(structnode),1,fp);
}
for(i=0;i<640;i++)
{
fwrite(&root[i],sizeof(structdir),1,fp);
}
fclose(fp);
}
voidread_file(FILE*fp)//读出系统文件的信息
{
inti;
fp=fopen("system","rb");
for(i=0;i<20449;i++)
{
fread(&memory[i],sizeof(structblock),1,fp);
}
fread(&super_block,sizeof(structblock_super),1,fp);
for(i=0;i<640;i++)
{
fread(&i_node[i],sizeof(structnode),1,fp);
}
for(i=0;i<640;i++)
{
fread(&root[i],sizeof(structdir),1,fp);
}
fclose(fp);
}
voidcallback(intlength)//回收磁盘空间
{
inti,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++;
}
}
voidallot(intlength)//分配空间
{
inti,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--; } } voidcreate_file(charfilename[],intlength)//创建文件 { inti,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 { i_node[i].file_address[j]=physic[j]; } break; } } } voidcreate_dir(charfilename[])//创建目录 { style=0;//0代表文件类型是目录文件 create_file(filename,4); style=1;//用完恢复初值,因为全局变量,否则 } voiddel_file(charfilename[])//删除文件 { inti,j,k; for(i=0;i<640;i++) { if(strcmp(filename,root[i].file_name)==0) { k=root[i].i_num; for(j=0;j { physic[j]=i_node[k].file_address[j]; } callback(i_node[k].file_length);//调用回收函数 for(j=0;j<100;j++)//删除文件后要将文件属性和目录项的各个值恢复初值 { i_node[k].file_address[j]=-1;//地址恢复初值 } strcpy(root[i].file_name,"");//文件名恢复初值 root[i].i_num=-1;//目录项的I结点信息恢复初值 strcpy(root[i].dir_name,"");//目录项的文件目录信息恢复初值 i_node[k].file_length=-1;//文件长度恢复 i_node[k].file_style=-1;//文件类型恢复初值 break; } } if(i==640) { printf("不存在这个文件\n"); } } voiddel_dir(charfilename[])//删除目录需要判断目录下时候为空,不为空就不删除 { inti,j,k; for(i=0;i<640;i++)//还要加条件判断要删除的目录是不是当前目录 { k=root[i].i_num;//找到目录名字 if(strcmp(root[i].file_name,filename)==0&&strcmp(cur_dir,filename)! =0&&(i_node[k].file_style)==0) { for(j=0;j<640;j++) { if(strcmp(filename,root[j].dir_name)==0) { printf("目录不为空不能直接删除\n"); break; } } if(j==640) { del_file(filename); break; } break; } } if(i==640) { printf("这个不是目录文件或者不存在这个目录,或者你要删除的是当前目录\n"); } } voiddisplay_curdir()//显示当前目录下的文件列表 { inti,k; printf("\t\t文件名字文件类型文件长度所属目录\n"); for(i=0;i<640;i++) { if(strcmp(cur_dir,root[i].dir_name)==0)//查询文件中所在目录信息和当前目录信息相同的数据 { k=root[i].i_num; printf("\t\t%s\t",root[i].file_name);//文件名 printf("\t%d\t",i_node[k].file_style);//文件的类型 printf("%d\t",i_node[k].file_length);//文件的长度 printf("%s\n",root[i].dir_name);//文件所在的目录 } } } voiddisplay_dir(charfilename[])//进入指定的目录 { inti,k; for(i=0;i<640;i++) { k=root[i].i_num;//判断文件类型是不是目录类型 if((strcmp(filename,root[i].file_name)==0)&&(i_node[k].file_style==0)) { strcpy(cur_dir,filename);//将要进入的指定目录设置为当前目录赋值不要反了strcpy(目的,源) break; } } if(i==640) { printf("没有这个目录\n"); } } voidopen_file(charfilename[])//打开文件 { inti,j,k; printf("\t\t文件名字文件类型文件长度所属目录\n"); for(i=0;i<640;i++) { k=root[i].i_num; if(strcmp(filename,root[i].file_name)==0&&(i_node[k].file_style==1)) { printf("\t\t%s\t",root[i].file_name);//文件名 printf("\t%d\t",i_node[k].file_style);//文件的类型 printf("%d\t",i_node[k].file_length);//文件的长度 printf("%s\n",root[i].dir_name);//文件所在的目录 printf("\t\t文件占用的物理地址\n"); for(j=0;j { printf("%d",i_node[k].file_address[j]);//文件具体占用的盘块号 } printf("\n"); break; } } if(i==640) { printf("没有这个文件或者这个文件不是正规文件\n"); } } voidback_dir()//返回上一级目录 { inti,k; for(i=0;i<640;i++)//查询和当前目录名相同的目录文件名 { k=root[i].i_num; if(strcmp(cur_dir,root[i].file_name)==0&&(i_node[k].file_style==0)) { strcpy(cur_dir,root[i].dir_name);//将查询到的目录文件名所在的目录赋值给当前目录 } } } voiddisplay_sys()//显示系统信息(磁盘使用情况) { inti,m,k=0; for(i=0;i<20449;i++) { if(memory[i].a==0) k++; } m=20449-k; printf("空闲的盘块数是: \t"); printf("%d\n",k); printf("使用的盘块数是: \t"); printf("%d\n",m); } voidhelp()//显示帮助信息 {printf("以下是文件管理已分配盘块-------------------------------! \n"); printf("注意: 创建的文件长度<100-----------------------------! \n");//说明文件 printf("1.初始化-----------------------------------------format! \n"); printf("2.查看当前目录文件列表------------------------------dir! \n"); printf("3.查看文件--------------cat-----(cat+空格+文件名)! \n"); printf("4.查看系统信息-----------------------------------ls! \n"); printf("5.创建目录--------------md------(md+空格+目录名)! \n"); printf("6.创建文件---vi------(vi+空格+文件名+文件长度)! \n"); printf("7.删除文件---------------del-----(del+空格+文件名)! \n"); printf("8.删除目录----------------deldir--(del+空格+目录名)! \n"); printf("9.进入当前目录下的指定目录-----cd--(cd+空格+目录名)! \n"); printf("10.返回上一级目录--------------------------------cd..! \n"); printf("11.显示帮助命令----------------------------------help! \n"); printf("12.退出文件模拟----------------------------------quit! \n"); printf("13,进入成组链接-----------------------------chengzu! \n"); } intMA[4];/*空闲块数组*/ intA[9][4]={{3,1,2,3},{3,4,5,6},{0,0,0,0},{0,0,0,0},{3,0,7,8}, {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};/*磁盘空间*/ intmark[9];/*存放已分配的块*/ intNo=0;/*已分配的块数*/ voiddisplay1() {inti,j,temp,count; No=0; if(MA[1]! =0) {i=MA[0]; printf("\ngroup1: "); for(j=1;j<=i;j++) {printf("%d",MA[j]); mark[++No]=MA[j]; } temp=MA[1]; count=2; while(A[temp][1]! =0) {printf("\ngroup%d: ",count); i=A[temp][0]; for(j=1;j<=i;j++) {printf("%d",A[temp][j]); mark[++No]=A[temp][j]; } count++; temp=A[temp][1]; } printf("\ngroup%d: ",count); i=A[temp][0]; for(j=2;j<=i+1;j++) if(A[temp][j]>0) {printf("%d",A[temp][j]); mark[++No]=A[temp][j]; } } else {i=MA[0]; if(i==1) printf("\nTheblocksareallassigned"); else {printf("\ngroup1: "); for(j=2;j<=i;j++) {printf("%d",MA[j]); mark[++No]=MA[j]; } } } } voiddisplay()/*显示分组情况*/ {inti,j; if(MA[0]! =0) display1(); else {i=MA[1]; for(j=0;j<=3;j++) MA[j]=A[i][j]; display1(); } } voidassign()/*分配空闲块*/ {ints,i; if(MA[0]>1)/*若该组不止一个空闲块*/ {i=MA[0]; s=MA[i]; MA[0]--; printf("\nnumberoftheblock: %d",s); } elseif(MA[0]==1)/*只剩一个空闲块*/ {if(MA[1]! =0)/*还有其它空闲块组*/ {s=MA[1]; for(i=0;i<=3;i++) A[0][i]=A[s][i]; MA[0]--; printf("\nnumberoftheblock: %d",s); } else/*没有其它空闲块组*/ {printf("\nThereisn'tanyspace"); return; } } else/*当前组已分配完*/ {for(i=0;i<=3;i++) MA[i]=A[0][i]; assign(); } display();/*显示分组情况*/ } voidcal
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 文件 存储空间 管理