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

上传人:b****2 文档编号:17765495 上传时间:2023-08-03 格式:DOCX 页数:28 大小:20.52KB
下载 相关 举报
操作系统 文件存储空间管理.docx_第1页
第1页 / 共28页
操作系统 文件存储空间管理.docx_第2页
第2页 / 共28页
操作系统 文件存储空间管理.docx_第3页
第3页 / 共28页
操作系统 文件存储空间管理.docx_第4页
第4页 / 共28页
操作系统 文件存储空间管理.docx_第5页
第5页 / 共28页
操作系统 文件存储空间管理.docx_第6页
第6页 / 共28页
操作系统 文件存储空间管理.docx_第7页
第7页 / 共28页
操作系统 文件存储空间管理.docx_第8页
第8页 / 共28页
操作系统 文件存储空间管理.docx_第9页
第9页 / 共28页
操作系统 文件存储空间管理.docx_第10页
第10页 / 共28页
操作系统 文件存储空间管理.docx_第11页
第11页 / 共28页
操作系统 文件存储空间管理.docx_第12页
第12页 / 共28页
操作系统 文件存储空间管理.docx_第13页
第13页 / 共28页
操作系统 文件存储空间管理.docx_第14页
第14页 / 共28页
操作系统 文件存储空间管理.docx_第15页
第15页 / 共28页
操作系统 文件存储空间管理.docx_第16页
第16页 / 共28页
操作系统 文件存储空间管理.docx_第17页
第17页 / 共28页
操作系统 文件存储空间管理.docx_第18页
第18页 / 共28页
操作系统 文件存储空间管理.docx_第19页
第19页 / 共28页
操作系统 文件存储空间管理.docx_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

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

《操作系统 文件存储空间管理.docx》由会员分享,可在线阅读,更多相关《操作系统 文件存储空间管理.docx(28页珍藏版)》请在冰点文库上搜索。

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

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

#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();/*显示分组情况*/

}

voidca

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2