操作系统文件管理系统模拟实验

操作系统文件管理系统模拟实验
操作系统文件管理系统模拟实验

操作系统文件管理系统模拟实验

文件管理系统模拟

1.实验目的

通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现 2.实验内容

为Linux系统设计一个简单的二级文件系统。要求做到以下几点:

(1)可以实现下列几条命令(至少4条)

login 用户登录

dir 列文件目录

create 创建文件

delete 删除文件

open 打开文件

close 关闭文件

read 读文件

write 写文件

(2)列目录时要列出文件名、物理地址、保护码和文件长度;

(3)源文件可以进行读写保护。

3.实验提示

(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。

(2)用户创建的文件,可以编号存储于磁盘上。入file0,file1,file2…并以编号作为物理地址,在目录中进行登记。

4.源代码

#include DISK_NUM*sizeof(struct fatitem)

#include //FAT表大小

#include #define ROOT_DISK_NO

FATSIZE/DISKSIZE+1 #define MEM_D_SIZE 1024*1024 //根目录起始盘块号//总磁盘空间为1M #define ROOT_DISK_SIZE #define DISKSIZE 1024

sizeof(struct direct) //根

//磁盘块的大小1K 目录大小

#define DISK_NUM 1024 #define DIR_MAXSIZE 1024

//磁盘块数目1K //路径最大长度为1KB #define FATSIZE #define MSD 5 //最大子目录数5 }openitem[MOFN]; #define MOFN 5 int cur_size; /*当前打文件的

//最大文件深度为5 数目*/

#define MAX_WRITE 1024*128 };

//最大写入文字长度128KB

struct fatitem *fat; /*FAT表*/ struct fatitem /* size 8*/ struct direct *root; /*根目录*/ { struct direct *cur_dir; /*当前int item; /*存放文件下一个磁目录*/

盘的指针*/ struct opentable u_opentable; /*

char em_disk; /*磁盘块是否空闲文件打开表*/

标志位 0 空闲*/ int fd=-1; /*文件打开表的序}; 号*/

char *bufferdir; /*记录当前路struct direct 径的名称*/

{ char *fdisk; /*虚拟磁盘起始地

/*-----文件控制快信息-----*/ 址*/

struct FCB

{ void initfile();

char name[9]; /*文件/目录void format();

8位*/ void enter(); 名

char property; /*属性 1位void halt(); 目录 0位普通文件*/ int create(char *name);

int size; /*文件/目录字int open(char *name); 节数、盘块数)*/ int close(char *name);

int firstdisk; /*文件/目int write(int fd,char *buf,int 录起始盘块号*/ len);

int next; /*子目录起始盘int read(int fd,char *buf); 块号*/ int

del(char *name);

int sign; /*1是根目录 0int mkdir(char *name); 不是根目录*/ int rmdir(char *name);

void dir();

}directitem[MSD+2]; int cd(char *name);

void print();

}; void show();

struct opentable void initfile() { {

struct openttableitem fdisk = (char

{ *)malloc(MEM_D_SIZE*sizeof(char)

char name[9]; /*文件名*/ ); /*申请 1M空间*/

int firstdisk; /*起始盘块 format();

号*/

int size; /*文件的大小*/ }

me,".");

void format() root->directitem[0].next = { root-

>directitem[0].firstdisk;

int i; root->directitem[0].property

FILE *fp; = '1';

root->directitem[0].size =

fat = (struct fatitem ROOT_DISK_SIZE;

*)(fdisk+DISKSIZE); /*计算FAT表-------指向上一级目录的目录 /*

地址,引导区向后偏移 1k)*/ 项---------*/

/*-----初始化FAT表 root->directitem[1].sign = 1; ------------*/ root->directitem[1].firstdisk

fat[0].item=-1; /*引导块*/ = ROOT_DISK_NO;

fat[0].em_disk='1'; strcpy(root->directitem[1].na

me,"..");

for(i=1;idirectitem[1].next = /*存放 FAT 表的磁盘块号*/ root->directitem[0].firstdisk;

{ root->directitem[1].property

fat[i].item=i+1; = '1';

fat[i].em_disk='1'; root->directitem[1].size =

} ROOT_DISK_SIZE;

if((fp =

fat[ROOT_DISK_NO].item=-1; fopen("disk.dat","wb"))==NULL) /*存放根目录的磁盘块号*/ {

fat[ROOT_DISK_NO].em_disk='1' printf("Error:\n Cannot ; open file \n");

return;

for(i=ROOT_DISK_NO+1;i

UM;i++) for(i=2;i

{ 录初始化为空-*/

fat[i].item = -1; {

fat[i].em_disk = '0'; root->directitem[i].sign =

} 0;

/*---------------------------

--------------------*/ root->directitem[i].firstdisk

root = (struct direct = -1;

*)(fdisk+DISKSIZE+FATSIZE); /*根

目录的地址*/ strcpy(root->directitem[i].na

/*初始化目录*/ me,"");

/*---------指向当前目录的目录 root->directitem[i].next = 项---------*/ -1;

root->directitem[0].sign = 1;

root->directitem[0].firstdisk root->directitem[i].property =

ROOT_DISK_NO; = '0';

strcpy(root->directitem[0].na root->directitem[i].size =

0; }

} fat = (struct fatitem

*)(fdisk+DISKSIZE); /*找到FAT表

地址*/

root = (struct direct if((fp =

fopen("disk.dat","wb"))==NULL) *)(fdisk+DISKSIZE+FATSIZE);/*找

{ 到根目录地址*/

printf("Error:\n Cannot fclose(fp);

open file \n"); /*--------------初始化用户打

return; 开表------------------*/

} for(i=0;i

if(fwrite(fdisk,MEM_D_SIZE,1, {

fp)!=1) /*把虚拟磁盘空间保存到磁

盘文件中*/ strcpy(u_opentable.openitem[i

{ ].name,"");

printf("Error:\n File

u_opentable.openitem[i].firstwrite error! \n");

disk = -1; }

fclose(fp); u_opentable.openitem[i].size

= 0; } }

void enter() u_opentable.cur_size = 0; {

FILE *fp; cur_dir = root; /*当前目录为根

int i; 目录*/

bufferdir = (char

fdisk = (char

*)malloc(DIR_MAXSIZE*sizeof(char*)malloc(MEM_D_SIZE*sizeof(char)));

); /*申请 1M空间*/ strcpy(bufferdir,"Root:");

if((fp=fopen("disk.dat","rb")}

)==NULL)

{ void halt()

printf("Error:\nCannot {

open file\n"); FILE *fp;

return; int i;

}

if(!fread(fdisk,MEM_D_SIZE,1, if((fp=fopen("disk.dat","wb")fp)) /*把磁盘文件disk.dat 读入)==NULL)

虚拟磁盘空间(内存)*/ {

{ printf("Error:\nCannot

printf("Error:\nCannot open file\n");

read file\n"); return;

exit(0); }

if(!fwrite(fdisk,MEM_D_SIZE,1 return(-2);

,fp)) /*把虚拟磁盘空间(内存)内容

读入磁盘文件disk.dat */ if(u_opentable.cur_size>=MOFN) /*

{ 打开文件太多*/

printf("Error:\nFile write return(-3);

error!\n");

}

fclose(fp);

for(j=ROOT_DISK_NO+1;j

free(fdisk); j++) /*找到空闲盘块 j 后退出*/

free(bufferdir); {

return; if(fat[j].em_disk=='0') } break;

}

int create(char *name) if(j>=DISK_NUM)

{ return(-5);

fat[j].em_disk = '1'; /*将空

int i,j; 闲块置为已经分配*/

/*-----------填写目录项

if(strlen(name)>8) /*文件名大-----------------*/

于 8位*/

return(-1); strcpy(cur_dir->directitem[i].na

me,name);

for(j=2;j

建文件是否与已存在的文件重名*/ cur_dir->directitem[i].firstdisk

{ = j;

cur_dir->directitem[i].size =

if(!strcmp(cur_dir->directite0;

m[j].name,name)) cur_dir->directitem[i].next =

break; j;

}

if(jdirectitem[i].property = 在*/ '0'; return(-4);

/*------------------------------

for(i=2;i

一个空闲子目录*/ fd = open(name);

{ return 0;

if(cur_dir->directitem[i].fir}

stdisk==-1)

break; int open(char *name)

} {

if(i>=MSD+2) /*无空目录项*/ int i, j;

/*--------------填写表项的相

for(i=2;i

{ u_opentable.openitem[j].firstdis

k =

if(!strcmp(cur_dir->directitecur_dir-

>directitem[i].firstdiskm[i].name,name)) ;

break;

} strcpy(u_opentable.openitem[j].n

if(i>=MSD+2) ame,name);

return(-1); u_opentable.openitem[j].size

/*--------是文件还是目录= cur_dir->directitem[i].size; -----------------------*/ u_opentable.cur_size++;

if(cur_dir->directitem[i].pro /*----------返回用户打开表表

perty=='1') 项的序号

return(-4); --------------------------*/

return(j);

件是否打开 /*--------文}

-----------------------*/

for(j=0;j

{ {

int i;

if(!strcmp(u_opentable.openit

em[j].name,name)) for(i=0;i

break; {

}

if(j

return(-2); em[i].name,name))

break;

}

if(i>=MOFN)

if(u_opentable.cur_size>=MOFN) /* return(-1);

文件打开太多*/ /*-----------清空该文件的用

return(-3); 户打开表项的内容

---------------------*/

/*--------查找一个空闲用户打

开表项-----------------------*/ strcpy(u_opentable.openitem[i].n for(j=0;j

{

u_opentable.openitem[i].firstdis

if(u_opentable.openitem[j].fik = -1;

rstdisk==-1) u_opentable.openitem[i].size

break; = 0;

} u_opentable.cur_size--;

下标-*/

/*------找到的item 是该文件的

return 0; 最后一块磁盘块

} -------------------*/

while(fat[item].item!=-1) int write(int fd, char *buf, int { len) item =fat[item].item; /*-

*/ { 查找该文件的下一盘块--

} char *first;

int item, i, j, k;

int ilen1, ilen2, modlen, temp; /*-----计算出该文件的最末地址/*----------用 $ 字符作为空格 -------*/

# 字符作为换行符 first =

-----------------------*/ fdisk+item*DISKSIZE+u_opentable. char Space = 32; openitem[fd].size%DISKSIZE;

char Endter= '\n';

/* -----如果最后磁盘块剩余的大

for(i=0;i

{ -------*/

if(buf[i] == '$') if(DISKSIZE-u_opentable.openi

buf[i] = Space; tem[fd].size%DISKSIZE>len)

else if(buf[i] == '#') {

buf[i] = Endter; strcpy(first,buf);

}

u_opentable.openitem[fd].size

/*----------读取用户打开表对=

应表项第一个盘块号u_opentable.openitem[fd].size+le-----------------------*/ n;

item = cur_dir-

>directitem[temp].sizu_opentable.openitem[fd].firstdie = sk; cur_dir->directitem[temp].size+l

en;

/*-------------找到当前目录所 }

对应表项的序号 else

-------------------------*/ {

for(i=2;i

{ for(i=0;i<(DISKSIZE-u_opentab

le.openitem[fd].size%DISKSIZE);i

if(cur_dir->directitem[i].fir++)

stdisk==item) {/*写一部分内容到最后一块

break; 磁盘块的剩余空间(字节)*/

} first[i] = buf [i];

temp = i; /*-存放当前目录项的 }

/*-----计算分配完最后一块=buf[k];

磁盘的剩余空间(字节) 还剩下多少 }

字节未存储-------*/

ilen1 = fat[item].item = i; len-(DISKSIZE-u_opentable.openit--找到一块后将它的序号存放在上/*

em[fd].size%DISKSIZE); 一块的指针中-*/

ilen2 = ilen1/DISKSIZE; fat[i].em_disk = '1';

modlen = ilen1%DISKSIZE; --置找到的磁盘快的空闲标志位为/*

if(modlen>0) 已分配-*/

ilen2 = ilen2+1; /*-- fat[i].item = -1; /*--还需要多少块磁盘块-*/ 它的指针为 -1 (即没有下一块)-*/

}

for(j=0;j

{

u_opentable.openitem[fd].size

for(i=ROOT_DISK_NO+1;i

UM;i++)/*寻找空闲磁盘块*/ u_opentable.openitem[fd].size+le

n; {

cur_dir->directitem[temp].siz if(fat[i].em_disk=='0')

break; e =

} cur_dir->directitem[temp].size+l

if(i>=DISK_NUM) /*--如en;

果磁盘块已经分配完了-*/ }

return(-1); return 0;

first = }

fdisk+i*DISKSIZE; /*--找到的那块

空闲磁盘块的起始地址-*/ int read(int fd, char *buf)

if(j==ilen2-1) /*--如{

果是最后要分配的一块-*/ int len =

{ u_opentable.openitem[fd].size;

char *first;

for(k=0;k

ntable.openitem[fd].size%DISKSIZ int ilen1, modlen; E)-j*DISKSIZE;k++) first[k] = item =

buf[k]; u_opentable.openitem[fd].firstdi

} sk;

else/*-如果不是要最后

分配的一块--*/

{ ilen1 = len/DISKSIZE;

modlen = len%DISKSIZE;

for(k=0;k

first[k] ilen1 = ilen1+1; /*--计算

文件所占磁盘的块数-*/ 项的序号,供释放目录中-*/

first = fdisk+item*DISKSIZE; if(i>=MSD+2) /*--如果不在当前

/*--计算文件的起始位置-*/ 目录中-*/

return(-1);

for(i=0;i

{ if(cur_dir->directitem[cur_it

if(i==ilen1-1) /*--如果在em].property!='0') /*--如果删除的

最后一个磁盘块-*/ (不)是目录-*/

{ return(-3);

for(j=0;j

buf[i*DISKSIZE+j] = 文件打开,则不能删除,退出-*/

first[j]; {

}

else /*--不在最后一块磁盘 if(!strcmp(u_opentable.openit块-*/ em[i].name,name))

{ return(-2);

}

for(j=0;j

cur_dir->directitem[cur_item].fi buf[i*DISKSIZE+j] =

first[j]; rstdisk;/*--该文件的起始盘块号

item = fat[item].item; -*/

/*-查找下一盘块-*/ while(item!=-1) /*--释放空间,

first = 将FAT表对应项进行修改-*/

fdisk+item*DISKSIZE; {

} temp = fat[item].item;

} fat[item].item = -1;

return 0; fat[item].em_disk = '0'; } item = temp;

}

int del(char *name) /*-----------------释放目录项

{ -----------------------*/

int i,cur_item,item,temp; cur_dir->directitem[cur_item]

.sign = 0;

for(i=2;idirectitem[cur_item]要删除文件是否在当前目录中-*/ .firstdisk = -1;

{ strcpy(u_opentable.openitem[c

ur_item].name,"");

if(!strcmp(cur_dir->directite

m[i].name,name)) cur_dir->directitem[cur_item].ne

break; xt = -1;

}

cur_item = i; /*--用来保存目录cur_dir->directitem[cur_item].pr operty = '0'; {

cur_dir->directitem[cur_item] if(fat[j].em_disk=='0') .size = 0; break;

}

if(j>=DISK_NUM) return 0;

} return(-5);

fat[j].em_disk='1'; /*-将该空

int mkdir(char *name) 闲块设置为已分配-*/

{

int i,j; /*-------------填写目录项

struct direct *cur_mkdir; ----------*/

strcpy(cur_dir->directitem[i]

if(!strcmp(name,".")) .name,name);

return(-4); cur_dir->directitem[i].firstd

if(!strcmp(name,"..")) isk=j;

return(-4); cur_dir->directitem[i].size=R

if(strlen(name)>8) /*-如果目OOT_DISK_SIZE;

8位-*/ 录名长度大于 cur_dir->directitem[i].next=j

return(-1); ;

cur_dir->directitem[i].proper

for(i=2;i

有空闲目录项退出-*/

{

/*-所创目录在虚拟磁盘上的地址

if(cur_dir->directitem[i].fir(内存物理地址)-*/

stdisk==-1) cur_mkdir=(struct direct

break; *)(fdisk+cur_dir->directitem[i].

} firstdisk*DISKSIZE);

if(i>=MSD+2) /*-目录/文件已

满-*/ /*-初始化目录-*/

return(-2); /*-指向当前目录的目录项-*/

for(j=2;jdirectitem[0].sign是否有重名-*/ =0;

{ cur_mkdir->directitem[0].firs

tdisk=cur_dir->directitem[i].fir

if(!strcmp(cur_dir->directitestdisk;

m[j].name,name)) strcpy(cur_mkdir->directitem[

break; 0].name,".");

} cur_mkdir->directitem[0].next

if(jdirectitem[0].firstd

return(-3); isk;

for(j=ROOT_DISK_NO+1;jdirectitem[0].propUM;j++) /*-找到空闲磁盘块 j 后退erty='1';

出-*/ cur_mkdir->directitem[0].size

=ROOT_DISK_SIZE; int i,j,item;

struct direct *temp_dir;

/*-指向上一级目录的目录项-*/ /*-检查当前目录项中有无该目录

cur_mkdir->directitem[1].sign-*/

=cur_dir->directitem[0].sign; for(i=2;i

cur_mkdir->directitem[1].firs {

tdisk=cur_dir->directitem[0].fir

stdisk; if(!strcmp(cur_dir->directite

strcpy(cur_mkdir->directitem[m[i].name,name))

1].name,".."); break;

cur_mkdir->directitem[1].next }

=cur_mkdir->directitem[1].firstd if(i>=MSD+2) /*-没有这个文件

isk; 或目录-*/

cur_mkdir->directitem[1].prop return(-1);

erty='1'; if(cur_dir->directitem[i].pro

cur_mkdir->directitem[1].sizeperty!='1')/*-删除的不是目录-*/

=ROOT_DISK_SIZE; return(-3);

for(i=2;i

录都初始化为空-*/ /*-判断要删除的目录有无子目录

{ -*/

cur_mkdir->directitem[i].sign temp_dir=(struct direct =0;

*)(fdisk+cur_dir->directitem[i].

next*DISKSIZE);

cur_mkdir->directitem[i].firs for(j=2;jdirectitem[ if(temp_dir-

>directitem[j].nei].name,""); xt!=-1)

break;

cur_mkdir->directitem[i].next }

=-1; if(j

件-*/

cur_mkdir->directitem[i].prop return(-2);

erty='0'; /*------------找到起始盘块号,

并将其释放----------------*/

cur_mkdir->directitem[i].size item=cur_dir->directitem[i].f=0; irstdisk;

} fat[item].em_disk='0';

return 0; /*-修改目录项-*/

} cur_dir->directitem[i].sign=0

;

int rmdir(char *name) cur_dir->directitem[i].firstd{ isk=-1;

strcpy(cur_dir->directitem[i] str=name;

.name,"");

cur_dir->directitem[i].next=- if(!strcmp("\\",name)) 1; {

cur_dir->directitem[i].proper cur_dir = root; ty='0';

cur_dir->directitem[i].size=0 strcpy(bufferdir,"Root:"); ; return 0;

}

return 0;

} temp = (char

*)malloc(DIR_MAXSIZE*sizeof(charvoid dir() ));/*-最长路径名字分配空

间-*/ {

int i; for(i=0;i<(int)strlen(str);i+

for(i=2;i

{ temp[i]=str[i];

temp[i]='\0';

if(cur_dir->directitem[i].fir

for(j=0;j

该子目录是否在当前目录中-*/ {

{

printf("%s\t",cur_dir->direct

item[i].name); if(!strcmp(temp_dir->directit

em[j].name,temp))

if(cur_dir->directitem[i].pro break;

perty=='0') /*-文件-*/ }

printf("%d\t\t\n",cur_dir->di free(temp);/*释放申请的临时空

rectitem[i].size); 间*/

else //if(temp_dir->directitem[j].

printf("\t<目property!='1') /*-打开的不是目录

操作系统模拟文件管理

操作系统课程设计报告 模拟文件管理 目) 院系:计算机科学技术学院计算机科学与技术系班级:计07--2 班 姓名:刘德庆 学号:12 指导教师:鲁静轩 2009 年6 月15 日

操作系统课程设计任务书 一、设计题目:模拟文件管理 二、设计目的 《操作系统原理》课程设计是软件工程专业实践性环节之一,是学习完《操作系统原理》课程后进行的一次较全面的综合练习。其目的在于加深对操作系统的理论、方法和基础知识的理解,掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。 三、设计要求 (1)选择课程设计题目中的一个课题,合作完成。 (2)良好的沟通和合作能力 (3)充分运用前序课所学的软件工程、程序设计等相关知识 (4)充分运用调试和排错技术 (5)简单测试驱动模块和桩模块的编写 (6)查阅相关资料,自学具体课题中涉及到的新知识。 (7)课题完成后必须按要求提交课程设计报告,格式规范,内容详实 四、设计内容及步骤 1.根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么。 2.根据实现的功能,划分出合理的模块,明确模块间的关系。 3.编程实现所设计的模块。 4.程序调试与测试。采用自底向上,分模块进行,即先调试低层函数。能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果; 5.结果分析。程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。

6.编写课程设计报告; 设计报告要求:A4纸,详细设计部分主要叙述本人的工作内容 五、课程设计工作计划 设计在学期的第15、16周进行,时间安排如下: 序号内容时间(天) 1 预习、讲课 1 2 设计 3 3 编码、测试 5 4 验收 1 合计10 。 六、成绩评定办法 成绩分为优(A)、良(B)、中(C)、及格(D)、不及格(E)五个等级。其中设计表现占30%,验收40%,设计报告占30%。 1.设计表现:教师可依据学生使用实验环境的能力、观察和分析实验现象的能力、实验结果和数据的正确性以及学生的课堂纪律、实验态度、保持实验室卫生等方面的表现进行综合考核。 2.验收:要求学生演示设计的程序,讲解设计思路、方法、解决的主要问题,教师根据具体情况向每个学生提问2至3个问题。 3.设计报告:学生设计后应按时完成设计报告。要求:内容充实、写作规范、项目填写正确完整、书面整洁等。

操作系统文件管理实验报告

操作系统实验报告实验名称:文件管理 专业班级:网络工程1301 学号: 姓名: 2015 年6 月16 日

实验一文件管理 一、实验目的 文件管理是操作系统的一个非常重要的组成部分。学生应独立用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。 二、预备知识 1.VS2010的使用 2.C#的学习 3.文件主目录与子目录的理解 三、实验容与步骤 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。要求设计一个10 个用户的文件系统,每次用户可保存10 个文件,一次运行用户可以打开5 个文件。系统能够检查打入命令的正确性,出错时能显示出错原因。对文件必须设置保护措施,例如只能执行,允许读等。在每次打开文件时,根据本次打开的要求,在此设置保护级别,即有二级保护。文件的操作至少有Create、delete、open、close、read、write 等命令。 所编写的程序应采用二级文件目录,即设置主文件目录和用户文件目录。前者应包含文件主及它们的目录区指针;后者应给出每个文件占有的文件目录,即文件名,保护码,文件长度以及它们存放的位置等。另外为打开文件设置运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。 程序流程图:

逻辑设计: 使用线性数组表表示MFD,泛型数组表示UFD,每个元素包括用户ID、保存的文件数、再使用线性表表示文件信息,每个元素包括文件名,文件属性(保护码),文件的状态等信息。 物理设计: //主目录 private FileUser[] mfd; //当前用户 private FileUser currentuser; ///

/// 文件 /// public class FileObject { public string filename; public int size=20; public int read=0; public int write = 0; public string author; } /// /// 文件系统用户 /// public class FileUser { public string username;

操作系统实验5文件系统:Linux文件管理

实验5 文件系统:Linux文件管理 1.实验目的 (1)掌握Linux提供的文件系统调用的使用方法; (2)熟悉文件和目录操作的系统调用用户接口; (3)了解操作系统文件系统的工作原理和工作方式。 2.实验内容 (1)利用Linux有关系统调用函数编写一个文件工具filetools,要求具有下列功能:*********** 0. 退出 1. 创建新文件 2. 写文件 3. 读文件 4. 复制文件 5. 修改文件权限 6. 查看文件权限 7. 创建子目录 8. 删除子目录 9. 改变当前目录到指定目录 10. 链接操作 *********** 代码: #include #include #include #include #include #include #include #include void menu(void); void openfile(void); void writefile(void); void readfile(void); void copyfile(void); void chmd(void); void ckqx(void); void cjml(void); void scml(void); void ggml(void); void ylj(void); int main() { int choose; int suliangjin=1;

menu(); scanf("%d",&choose); while(choose!=0) { switch(choose) { case 1:openfile();break; case 2:writefile();break; case 3:readfile();break; case 4:copyfile();break; case 5:chmd();break; case 6:ckqx();break; case 7:cjml();break; case 8:scml();break; case 9:ggml();break; case 10:ylj();break; } menu(); scanf("%d",&choose); } return 0; } void menu(void) { printf("文件系统\n"); printf("1.创建新文件\n"); printf("2.写文件\n"); printf("3.读文件\n"); printf("4.复制文件\n"); printf("5.修改文件权限\n"); printf("6.查看文件权限\n"); printf("7.创建子目录\n"); printf("8.删除子目录\n"); printf("9.改变目前目录到指定目录\n"); printf("10.链接操作\n"); printf("0.退出\n"); printf("请输入您的选择...\n"); } void openfile(void) { int fd; if((fd=open("/tmp/hello.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0) perror("open");

2014-2015(1)操作系统实验

实验项目名称:进程的同步(实验一) 1、实验目的 (1) 掌握进程和线程基本概念和属性; (2) 掌握用PV操作解决并发进程的同步问题; (3) 掌握用于同步的信号量初值的设置; (4) 掌握如何处理共享资源的直接制约关系。 2、实验内容 (1) 设计一个模拟若干售票网点的售票程序。界面可以参考图1。还应设计多个后台售票线程并发运行。 图1售票 (2) 模拟:桌上有一只盘子,每次只能放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放桔子,一个女儿专等吃盘子里的苹果,一个儿子专等吃盘子里的桔子。只要盘子空则爸爸或妈妈都可以向盘子放一个水果,仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。放-取水果的几种情况如图2(a)~(f)所示,可以参照进行设计。 (a)盘子空时取水果 (b)父亲放入苹果

(c) 儿子取水果 (d) 女儿取水果 (e)儿子取走桔子 (f)盘子满时放水果 图2 放-取水果 (3) 自选其它能反映进程互斥问题的应用。 实验项目名称:处理机调度(实验二) 1、实验目的 (1) 掌握几种处理机调度算法的基本思想和特点; (2) 理解并发与并行的区别; (3) 比较几种算法的特点。 2、实验内容 编写程序模拟处理机调度,参照图3。 (1) 时间片轮转 (2) 动态优先权调度 (3) 高响应比优先调度

图3 模拟处理机调度 实验项目名称:银行家算法(实验三) 1、实验目的 银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 2、实验内容 (1) 设计进程对各类资源最大申请表示及初值确定。 (2) 设定系统提供资源初始状况。 (3) 设定每次某个进程对各类资源的申请表示。 (4) 编制程序,依据银行家算法,决定其申请是否得到满足。 具体设计可参照图4(a)~(c) 进行。

操作系统课程试验

第3章处理机管理 7.1实验内容 处理机管理是操作系统中非常重要的部分。为深入理解进程管理部分的功能,设计几个调度算法,模拟实现处理机的调度。 7.2实验目的 在多道程序或多任务系统中,系统同时处于就绪状态的进程有若干个。也就是说能运行的进程数远远大于处理机个数。为了使系统中的各进程能有条不紊地运行,必须选择某种调度策略,以选择一进程占用处理机。要求学生设计一个模拟单处理机调度的算法,以巩固和加深处理机调度的概念。 7.3实验题目 7.3.1设计一个按先来先服务调度的算法 提示 (1)假设系统中有5个进程,每个进程由一个进程控制块(PCB)来标识。进程控制块内容如图7-1所示。 进程名即进程标识。 链接指针:按照进程到达系统的时间将处于就绪状态的进程连接成一个就绪队列。指针指出下一个到达进程的进程控制块首地址。最后一个进程的链指针为NULL。 估计运行时间:可由设计者指定一个时间值。 达到时间:进程创建时的系统时间或由用户指定。调度时,总是选择到达时间最早的进程。 进程状态:为简单起见,这里假定进程有两种状态:就绪和完成。并假定进程一创建就处于就绪状态,用R表示。当一个进程运行结束时,就将其置成完成状态,用C表示。 (2)设置一个队首指针head,用来指出最先进入系统的进程。各就绪进程通过链接指针连在一起。 (3)处理机调度时总是选择队首指针指向的进程投入运行。由于本实验是模拟实验,所以对被选中进程并不实际启动运行,而只是执行: 估计运行时间减1 用这个操作来模拟进程的一次运行,而且省去进程的现场保护和现场恢复工作。 (4)在所设计的程序中应有显示或打印语句,能显示或打印正运行进程的进程名,已运行是、还剩时间,就绪队列中的进程等。所有进程运行完成是,给出各进程的周转时间和平均周转时间。 先来先服务(FCFS)调度算法 /*源程序1.cpp,采用先来先无法法在Visual C++ 6.0下调试运行*/ /*数据结构定义及符号说明*/ #include #include

操作系统文件管理系统模拟实验

文件管理系统模拟 1.实验目的 通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现 2.实验内容 为Linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条) login 用户登录 dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 (2)列目录时要列出文件名、物理地址、保护码和文件长度; (3)源文件可以进行读写保护。 3.实验提示 (1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。 (2)用户创建的文件,可以编号存储于磁盘上。入file0,file1,file2…并以编号作为物理地址,在目录中进行登记。 4.源代码 #include #include #include #define MEM_D_SIZE 1024*1024 //总磁盘空间为1M #define DISKSIZE 1024 //磁盘块的大小1K #define DISK_NUM 1024 //磁盘块数目1K #define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT 表大小

#define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目录起始盘块号 #define ROOT_DISK_SIZE sizeof(struct direct) //根目录大小#define DIR_MAXSIZE 1024 //路径最大长度为1KB #define MSD 5 //最大子目录数5 #define MOFN 5 //最大文件深度为5 #define MAX_WRITE 1024*128 //最大写入文字长度128KB struct fatitem /* size 8*/ { int item; /*存放文件下一个磁盘的指针*/ char em_disk; /*磁盘块是否空闲标志位0 空闲*/ }; struct direct { /*-----文件控制快信息-----*/ struct FCB { char name[9]; /*文件/目录名8位*/ char property; /*属性1位目录0位普通文件*/ int size; /*文件/目录字节数、盘块数)*/ int firstdisk; /*文件/目录起始盘块号*/ int next; /*子目录起始盘块号*/ int sign; /*1是根目录0不是根目录*/ }directitem[MSD+2]; }; struct opentable { struct openttableitem { char name[9]; /*文件名*/ int firstdisk; /*起始盘块号*/ int size; /*文件的大小*/ }openitem[MOFN]; int cur_size; /*当前打文件的数目*/ }; struct fatitem *fat; /*FAT表*/ struct direct *root; /*根目录*/ struct direct *cur_dir; /*当前目录*/ struct opentable u_opentable; /*文件打开表*/ int fd=-1; /*文件打开表的

操作系统实验报告

操作系统实验报告 集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-

实验二进程调度1.目的和要求 通过这次实验,理解进程调度的过程,进一步掌握进程状态的转变、进程调度的策略,进一步体会多道程序并发执行的特点,并分析具体的调度算法的特点,掌握对系统性能的评价方法。 2.实验内容 阅读教材《计算机操作系统》第二章和第三章,掌握进程管理及调度相关概念和原理。 编写程序模拟实现进程的轮转法调度过程,模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。假设初始状态为:有n个进程处于就绪状态,有m个进程处于阻塞状态。采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过t个时间片系统释放资源,唤醒处于阻塞队列队首的进程。 程序要求如下: 1)输出系统中进程的调度次序; 2)计算CPU利用率。 3.实验环境 Windows操作系统、VC++6.0 C语言 4设计思想: (1)程序中进程可用PCB表示,其类型描述如下:

structPCB_type { intpid;//进程名 intstate;//进程状态 2——表示“执行”状态 1——表示“就绪”状态 0——表示“阻塞”状态 intcpu_time;//运行需要的CPU时间(需运行的时间片个数) } 用PCB来模拟进程; (2)设置两个队列,将处于“就绪”状态的进程PCB挂在队列ready中;将处于“阻塞”状态的进程PCB挂在队列blocked中。队列类型描述如下: structQueueNode{ structPCB_typePCB; StructQueueNode*next; } 并设全程量: structQueueNode*ready_head=NULL,//ready队列队首指针 *ready_tail=NULL,//ready队列队尾指 针

操作系统文件管理_答案

第六部分文件管理 1、文件系统的主要目的就是( )。 A、实现对文件的按名存取 B、实现虚拟存储 C、提供外存的读写速度 D、用于存储系统文件 2、文件系统就是指( )。 A、文件的集合 B、文件的目录集合 C、实现文件管理的一组软件 D、文件、管理文件的软件及数据结构的总体 3、文件管理实际上就是管理( )。 A、主存空间 B、辅助存储空间 C、逻辑地址空间 D、物理地址空间 4、下列文件的物理结构中,不利于文件长度动态增长的文件物理结构就是( )。 A、顺序文件 B、链接文件 C、索引文件 D、系统文件 5、下列描述不就是文件系统功能的就是( )。 A、建立文件目录 B、提供一组文件操作 C、实现对磁盘的驱动调度 D、实现从逻辑文件到物理文件间的转换 6、文件系统在创建一个文件时,为它建立一个( )。 A、文件目录 B、目录文件 C、逻辑结构 D、逻辑空间 7、索引式(随机)文件组织的一个主要优点就是( )。 A、不需要链接指针 B、能实现物理块的动态分配 C、回收实现比较简单 D、用户存取方便 8、面向用户的文件组织机构属于( )。 A、虚拟结构 B、实际结构 C、逻辑结构 D、物理结构 9、按文件用途来分,编译程序就是( )。 A、用户文件 B、档案文件 C、系统文件 D、库文件 10、将信息加工形成具有保留价值的文件就是( )。 A、库文件 B、档案文件 C、系统文件 D、临时文件 11、文件目录的主要作用就是( )。 A、按名存取 B、提高速度 C、节省空间 D、提高外存利用率 12、如果文件系统中有两个文件重名,不应采用( )。 A、一级目录结构 B、树型目录结构 C、二级目录结构 D、A与C 13、文件系统采用树型目录结构后,对于不同用户的文件,其文件名( )。 A、应该相同 B、应该不同 C、可以不同,也可以相同 D、受系统约束 14、文件系统采用二级文件目录可以( )。 A、缩短访问存储器的时间 B、实现文件共享 C、节省内存空间 D、解决不同用户间的文件命名冲突

模拟一个简单二级文件管理系统

模拟一个简单二级文件管理系统 设计目的:通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。 设计内容:模拟一个简单二级文件管理系统 一、实验内容描述 1 实验目标 本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现. 2 实验要求 为DOS系统设计一个简单的二级文件系统.要求做到以下几点: ①可以实现下列命令: login 用户登录 dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 ②列目录时要列出文件名、物理地址、保护码和文件长度. ③源文件可以进行读写保护. 二、程序主要内容 1设计思路 程序中要求每个用户在登陆后才可对其拥有的文件进行操作,用户对于其他用户的文件无操作权.文件操作包括浏览、创建、删除、打开、关闭、阅读、写入、修改模式.其他操作包括新建用户、帮助、用户登入、用户登出、退出系统. 在程序文件夹下有个名为“file”的系统根目录,此目录下包括:一个名为“mfd”的文件,记录所有注册过的帐号及密码;用户文件,以用户名作为文件名,内容为其拥有的文件名及属性;一个名为“keiji”的文件夹.“keiji”文件夹中包括:“”指针文件,记录所有已用的物理地址;一些以物理地址为名的文件,内容为文件内容. 2 数据结构 file结构体系统文件数据结构: fpaddrint,文件的物理地址、flengthint,文件长度、fmodeint,文件模式 0.只读;1.可写;2.可读写;3.保护、 fname[]char,文件名; filemode结构体文件状态数据结构: isopenint,文件当前状态,0.关闭;1.打开、modeint,文件模式 0.只读;1.可写;2.可

操作系统实验文件管理C 代码

#include #include #include #include #include using namespace std; #define BLKSIZE 512 // 数据块的大小 #define BLKNUM 512 // 数据块的块数 #define INODESIZE 32 // i节点的大小 #define INODENUM 32 // i节点的数目 #define FILENUM 8 // 打开文件表的数目//用户 typedef struct { char user_name[10]; // 用户名 char password[10]; // 密码 } User; //i节点 typedef struct { short inum; // 文件i节点号 char file_name[10]; // 文件名

char type; // 文件类型 char user_name[10]; // 文件所有者 short iparent; // 父目录的i节点号 short length; // 文件长度 short address[2]; // 存放文件的地址 } Inode; //打开文件表 typedef struct { short inum; // i节点号 char file_name[10]; // 文件名 short mode; // 读写模式(1:read, 2:write, // 3:read and write) } File_table; // 申明函数 void login(void); void init(void); int analyse(char *); void save_inode(int); int get_blknum(void); void read_blk(int); void write_blk(int);

计算机操作系统实验-文件管理

哈尔滨工业大学计算机科学与技术学院 实验报告 课程名称:操作系统 课程类型:必修 实验项目名称:文件管理 实验题目:设计一个多用户的文件系统 班级:实验学院一班 学号:6040310110 姓名:张元竞 设计成绩报告成绩指导老师

一、实验目的 随着社会信息量的极大增长,要求计算机处理的信息与日俱增,涉及到社会生活的各个方面。因此,文件管理是操作系统的一个非常重要的组成部分。学生应独立用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。 二、实验要求及实验环境 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。要求设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。系统能够检查打入命令的正确性,出错时能显示出错原因。对文件必须设置保护措施,例如只能执行,允许读等。在每次打开文件时,根据本次打开的要求,在此设置保护级别,即有二级保护。文件的操作至少有Create、delete、open、close、read、write等命令。 所编写的程序应采用二级文件目录,即设置主文件目录和用户文件目录。前者应包含文件主及它们的目录区指针;后者应给出每个文件占有的文件目录,即文件名,保护码,文件长度以及它们存放的位置等。另外为打开文件设置运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。 三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)

操作系统实验一模拟进程状态转换

实验一模拟进程状态转换及其PCB的变化一、实验目的: 自行编制模拟程序,通过形象化的状态显示,使学生理解进程的概念、进程之间的状态转换及其所带来的PCB内容、组织的变化,理解进程与其PCB间的一一对应关系。 二、实验内容及要求: (1)、设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。 (2)、独立编写、调试程序。进程的数目、进程的状态模型(三状态、五状态、七状态或其它)以及PCB的组织形式可自行选择。(3)、合理设计与进程PCB相对应的数据结构。PCB的内容要涵盖进程的基本信息、控制信息、资源需求及现场信息。 (4)、设计出可视性较好的界面,应能反映出进程状态的变化引起的对应PCB内容、组织结构的变化。 (5)、代码书写要规范,要适当地加入注释。 (6)、鼓励在实验中加入新的观点或想法,并加以实现。 (7)、认真进行预习,完成预习报告。 (8)、实验完成后,要认真总结,完成实验报告。 三、实现: 数据结构 struct PCB{

char name; int priority; int needtime; bool operator < (const PCB &b) const{ return priority>b.priority; } }; 五状态进程模型 最高优先数优先调度算法流程图 四、运行结果: 图1 创建2个进程,因为这时cpu空闲所以内核调度,b优先级高先执行 图2 超时,因为这时cpu空闲所以内核调度,b优先级还是比a高所以先执行图3 2个进程均被阻塞,其中一旦进程被阻塞就会引发调度 图4 唤醒1个进程,从阻塞队列取队首放到就绪队列队尾,由于这时cpu空闲所以内核调 度 五、源代码: #include #include using namespace std; int Ready_len=0; int Blocked_len=0; int CPU_state=0; struct PCB{ char name; int priority;

兰州大学操作系统实验七存储管理题目和答案

实验七实验报告 实验名称:7 存储管理 实验目的: 1.观察系统存储器使用情况 2.观察进程使用存储器的情况 3.掌握通过内存映像文件提高性能的方法 4.掌握动态内存分配技术 实验时间 3学时 预备知识: 1.存储相关的命令 free 显示系统使用和未被使用的内存数量(可以实时执行) 输出包含的标题有 3 行信息: Mem。此行包含了有关物理内存的信息。包括以下详细内容: total。该项显示可用的物理内存总量,单位为KB。该数字小于安装的物理内存的 容量,是因为内核本身也要使用一小部分的内存。 used。该项显示了用于应用程序超速缓存数据的内存容量。 free。该项显示了此时未使用且有效的内存容量。 Shared/buffers 缓冲区/cached。这些列显示了有关内存如何使用的更为详细的信息。 -/+ buffers/cache。Linux 系统中的部分内存用来为应用程序或设备高速缓存数据。这部分内存在需要用于其他目的时可以释放。 free列显示了调整的缓冲区行,显示释放缓冲区或高速缓存时可以使用的内存容量。 Swap。该行显示有关交换内存利用率的信息。该信息包含全部、已使用和释放的可用内存容量。 vmstat 报告进程、内存、分页、IO等多类信息(使用手册页) size 列出目标文件段大小和总大小(使用手册页)

2./proc文件系统(使用手册页man 5 proc) /proc/meminfo 内存状态信息 /proc/stat 包含内存页、内存对换等信息。 /proc/$pid/stat 某个进程的信息(包含内存使用信息) /proc/$pid/maps某个进程的内存映射区信息,包括地址范围、权限、偏移量以及主次设备号和映射文件的索引节点。 /proc/$pid/statm 某个进程的内存使用信息,包括内存总大小、驻留集大小、共享页面数、文本页面数、堆栈页面数和脏页面数。 3.内存映像文件 内存映像文件是指把一个磁盘文件映像到内存中,二者存在逐字节的对应关系。这样做可以加速I/O操作,并可以共享数据。 3.1 mmap(建立内存映射) 表头文件#include #include 定义函数void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize); 函数说明mmap()用来将某个文件内容映射到内存中,对该内存区域的存取即是直接对该文件内容的读写。参数start指向欲对应的内存起始地址,通常设为NULL,代表让系统自动选定地址,对应成功后该地址会返回。参数length代表将文件中多大的部分对应到内存。 参数prot代表映射区域的保护方式有下列组合 PROT_EXEC 映射区域可被执行 PROT_READ 映射区域可被读取 PROT_WRITE 映射区域可被写入 PROT_NONE 映射区域不能存取 参数flags会影响映射区域的各种特性 MAP_FIXED 如果参数start所指的地址无法成功建立映射时,则放弃映射,不 对地址做修正。通常不鼓励用此旗标。 MAP_SHARED对映射区域的写入数据会复制回文件内,而且允许其他映射该 文件的进程共享。 MAP_PRIV A TE 对映射区域的写入操作会产生一个映射文件的复制,即私人的

操作系统实验一

攀枝花学院实验报告 实验课程:操作系统实验项目:模拟实现进程调度算法实验日期:2010.05.07 系:计算机班级:07级计本2班姓名:朱江学号:200710801086 指导教师:赖国勇成绩: 实验目的: 1、进程调度是处理机管理的核心内容。观察、体会操作系统的进程调度方法,并通过一个简单的进程调度模拟程序的实现,加深对进程控制块、进程队列、进程调度算法,进程切换的理解,并体会和了解各种调度算法的具体实施办法。 2、提高实际动手编程能力,为日后从事软件开发工作打下坚实基础。 实验设备: 1.装有windows2000/xp以上的操作系统。 2.装有LGY_VC++ 6.0集成开发环境。 实验要求: 1、使用模块化设计思想来设计。 2、给出主函数和各个算法函数的流程图。 3、学生可按照自身条件,随意选择采用的算法,(例如:采用冒泡法编写程序,实现短进程优先调度的算法)。 4、进程调度程序模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。 实验内容及步骤: 一、实验内容 1、设计进程控制块PCB表结构,模拟实现进程调度算法:FIFO,静态优先级调度,时间片轮转调度,短进程优先调度算法,多级反馈队列调度。(实现其中之一个以上)。 2、编写一个进程调度程序模拟程序。模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。 3、程序经visual c++ 6.0编译后运行,通过文件1.txt和2.txt读入进程名、进程状态、进程运行时间和进程优先级等数据。然后分别选择先进先出调度,静态优先级调度,时间片轮转调度,短进程优先调度算法对进程进行调度,并输出进程的调度模拟操作排序结果。

操作系统 实验报告 文件管理

昆明理工大学信息工程与自动化学院学生实验报告 (201 —201 学年第二学期) 课程名称:操作系统开课实验室:年月日 一、实验目的 用C或C++语言编写和调试一个简单的文件系统,模拟文件管理的基本功能。从而 对各种文件操作命令的实质内容和执行过程有比较深入的了解。 二、实验原理及基本技术路线图(方框原理图) 用C模拟实现文件系统的管理;要求设计一个多级目录结构的文件系统,能正确描述文件控制块,采用合理的外存分配方式,能实现基本的目录及文件的操作,包括创建、删除、重命名、复制、移动等功能,并对文件有一定的存取权限控制。 功能设计: Help 显示命令帮助 dir 显示当前目录下的文件和文件夹 exit 退出系统 create [文件名] 创建文本文件 cdir [目录名] 创建文件夹 read [文件名] 读取一个文件最多可同时读取五个 close[文件名] 关闭一个文件 edit [文件名] 编辑一个文件 cd [目录名] 进子目录或者上级目录 attr [文件名] 显示该文件的属性 del [文件名] 删除文件 rename [文件名] 重命名

编辑功能流程图

删除文件流程图创建文件流程图 核心算法: bool Format(void); //格式化 bool install(void); //装载虚拟硬盘的数据 void login(void); /用户登陆

void showMenu(void);//显示功能菜单 bool onAction(void);//用户选择功能并执行 void createFile(string str);//创建文件 bool read(string str);//读取文件 void editFile(string str);//编辑文件 void Delete(string str);//删除一个文件 数据结构: /*---------常变量------*/ const unsigned int BLOCK_SIZE=512; //块长 const unsigned int DATA_BLOCK_NUM=512; //数据块数量 const unsigned int DINODE_START=4*BLOCK_SIZE; //inode起始位置 const unsigned int DINODE_SIZE=512; //inode大小 const unsigned int DINODE_NUM=32; //inode数量 const unsigned int DATASTART=(2+DINODE_NUM)*BLOCK_SIZE; //数据区的开始地址 const unsigned int ACCOUNT_NUM=10; //用户数量 /*inode结构体*/ struct inode{ unsigned short di_tag; /*inode标识*/ unsigned short di_number; /*关联文件数,当为0时表示删除文件,如一个目录至少 包含两个文件:"."和".."*/ unsigned short di_mode; /*存取模式:0为目录,1为文件*/ unsigned short di_userID; /*当前inode所属用户0为根目录ID,一次下去是管理员目

操作系统文件管理系统模拟实验

操作系统文件管理系统模拟实验 文件管理系统模拟 1.实验目的 通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现 2.实验内容 为Linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条) login 用户登录 dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 (2)列目录时要列出文件名、物理地址、保护码和文件长度; (3)源文件可以进行读写保护。 3.实验提示 (1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。 (2)用户创建的文件,可以编号存储于磁盘上。入file0,file1,file2…并以编号作为物理地址,在目录中进行登记。 4.源代码

#include DISK_NUM*sizeof(struct fatitem) #include //FAT表大小 #include #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 #define MEM_D_SIZE 1024*1024 //根目录起始盘块号//总磁盘空间为1M #define ROOT_DISK_SIZE #define DISKSIZE 1024 sizeof(struct direct) //根 //磁盘块的大小1K 目录大小 #define DISK_NUM 1024 #define DIR_MAXSIZE 1024 //磁盘块数目1K //路径最大长度为1KB #define FATSIZE #define MSD 5 //最大子目录数5 }openitem[MOFN]; #define MOFN 5 int cur_size; /*当前打文件的 //最大文件深度为5 数目*/ #define MAX_WRITE 1024*128 }; //最大写入文字长度128KB struct fatitem *fat; /*FAT表*/ struct fatitem /* size 8*/ struct direct *root; /*根目录*/ { struct direct *cur_dir; /*当前int item; /*存放文件下一个磁目录*/ 盘的指针*/ struct opentable u_opentable; /* char em_disk; /*磁盘块是否空闲文件打开表*/ 标志位 0 空闲*/ int fd=-1; /*文件打开表的序}; 号*/ char *bufferdir; /*记录当前路struct direct 径的名称*/ { char *fdisk; /*虚拟磁盘起始地 /*-----文件控制快信息-----*/ 址*/ struct FCB

操作系统-实验六虚拟存储器实验报告

计算机与信息工程学院实验报告 一、实验内容 实验一:模拟分页式存储管理中硬件的地址转换和产生缺页中断。 [提示] (1)分页式虚拟存储系统是把作业信息的副本存放在磁盘上,当作业被选中时,可把作业的开始几页先装入主存且启动执行。为此,在为作业建立页表时,应说明哪些页 其中,标志----用来表示对应页是否已经装入主存,标志位=1,则表示该页已经在主存,标志位=0,则表示该页尚未装入主存。 主存块号----用来表示已经装入主存的页所占的块号。 在磁盘上的位置----用来指出作业副本的每一页被存放在磁盘上的位置。 (2)作业执行时,指令中的逻辑地址指出了参加运算的操作存放的页号和单元号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式: 绝对地址=块号×块长+单元号 计算出欲访问的主存单元地址。如果块长为2的幂次,则可把块号作为高地址部分, 把单元号作为低地址部分,两者拼接而成绝对地址。若访问的页对应标志为“0”,则表示该页不在主存,这时硬件发“缺页中断”信号,有操作系统按该页在磁盘上 的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。

(3)设计一个“地址转换”程序来模拟硬件的地址转换工作。当访问的页在主存时,则形成绝对地址,但不去模拟指令的执行,而用输出转换后的地址来代替一条指令的执行。当访问的页不在主存时,则输出“* 该页页号”,表示产生了一次缺页中断。 该模拟程序的算法 (4)假定主存的每块长度为128个字节;现有一个共七页的作业,其中第0页至第3页已经装入主存,其余三页尚未装入主存;该作业的页表为: (5)运行设计的地址转换程序,显示或打印运行结果。因仅模拟地址转换,并不模拟指令的执行,故可不考虑上述指令序列中的操作。 实验二:用先进先出(FIFO)页面调度算法处理缺页中断。 [提示]: (1)在分页式虚拟存储系统中,当硬件发出“缺页中断”后,引出操作系统来处理这个中断事件。如果主存中已经没有空闲块,则可用FIFO页面调度算法把该作业中最先进入主存的一页调出,存放到磁盘上,然后再把当前要访问的页装入该块。调出和装入后都要修改页表页表中对应页的标志。 (2)FIFO页面调度算法总是淘汰该作业中最先进入主存的那一页,因此可以用一个数组来表示该作业已在主存的页面。假定作业被选中时,把开始的m个页面装入主存,则数组的元素可定为m个。例如: P[0],P[1],….,P[m-1] 其中每一个P[i](i=0,1,….,m-1)表示一个在主存中的页面号。它们的初值为:P[0]:=0,P[1]:=1,….,P[m-1]:=m-1 用一指针k指示当要装入新页时,应淘汰的页在数组中的位置,k的初值为“0”。 当产生缺页中断后,操作系统选择P[k]所指出的页面调出,然后执行: P[k]:=要装入页的页号 k:=(k+1) mod m 再由装入程序把要访问的一页信息装入到主存中。重新启动刚才那条指令执行。

计算机操作系统第七章-文件管理资料

第七章文件管理 第一节文件和文件系统 一、文件系统的引入 1、用户在使用计算机的过程中遇到的有关软件资源的两个基本问题: ●产生了新的资源时:怎样长期存放; ●使用系统中现有资源时:怎样检索,如何使用; 解决的方法:把信息以一种单元--文件--的形式存储在磁盘或其他外部存储介质上。文件由操作系统来统一管理,包括:文件的结构,命名,存取,使用,保护,以及实现方法。 2、现代OS中引入文件系统的目的 ●管理系统和用户的软件资源,让用户实现对信息的“按名存取”; ●提供信息的存储、检索、更新、共享和文件保护等一系列文件操作,使用户能方便有效地使用和操作文件; ●文件系统给用户带来的好处是:使用方便、数据安全、接口统一 3、文件系统的功能 ●统一管理文件的存储空间(外存空间),实施存储空间的分配与回收●实现文件的按名存取:名字空间映射存储空间 ●实现文件信息的共享,并提供文件的保护和保密措施 ●向用户提供一个方便使用的接口 ●系统维护及向用户提供有关信息 ●提供与I/O的统一接口 文件系统在操作系统接口中占的比例最大,用户使用操作系统的

感觉在很大程度上取决于对文件系统的使用效果。 二、文件系统中的相关概念 1、数据项:构成文件内容的基本单位 ●基本数据项。这是用于描述一个对象的某种属性的字符集,是数据组织中可以命名的最小逻辑数据单位,即原子数据,又称为数据元素或字段。它的命名往往与其属性一致。 ●组合数据项。它是由若干个基本数据项组成的,简称组项。 2、记录:是一组相关数据项的集合,用于描述一个对象在某方面的一组属性。 3、关键字:是能唯一标识一个记录的数据项。记录的关键字可以不止一个;关键字可以是一个基本数据项,也可以是一个组合数据项。 4、文件:是指由创建者所定义的、具有文件名的一组相关信息的集合,可分为有结构文件和无结构文件两种。 在有结构的文件中,文件由若干个相关记录组成(是记录的序列);而无结构文件则被看成是一个字符(字节)流。 文件是文件系统中一个最大的数据单位,它描述了一个对象集。 图7-1文件、记录和数据项之间的层次关系

相关文档
最新文档