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