操作系统实习报告(磁盘文件操作)(含5篇)

时间:2019-05-13 18:12:38下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《操作系统实习报告(磁盘文件操作)》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《操作系统实习报告(磁盘文件操作)》。

第一篇:操作系统实习报告(磁盘文件操作)

大学

操作系统课程综合实践

题目:

磁盘文件操作

班级:

姓名:

学号:

指导教师:

2011年 12 月 23日

磁盘文件操作

摘要:

为了正确地实现文件的存取,文件系统设计了一组与存取文件有关的功能模块,用户可以用“访问指令”调用这些功能模块,以实现文件的存取要求。我们把文件系统设计的这一组功能模块称为“文件操作“,实验就是要模拟实现一些文件操作。文件操作不是独立的,它和文件系统的其他部分密切相关,若要实现文件操作就离不开文件的目录结构、文件的组织结构和磁盘空间的管理。因此,这个实习虽然是文件操作的模拟实现,但还是必须模拟一部分文件的组织结构、目录结构和磁盘空间管理的实现。

关键字:磁盘、文件、目录、分配表。

一、实验内容:

设计一个简单的文件系统,用文件模拟磁盘,用数组模拟缓冲区,要求实现; 1. 2. 3. 4. 支持多级目录结构,支持文件的绝对路径;

文件的逻辑结构采用流式结构,物理结构采用链接结构中的显示链接方式;

采用文件分配表;

实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示文件内容、打开文件、读文件、写文件(追加方式)、关闭文件、改变文件属性。

最后编写主函数对所做工作进行测试。

二、实验目的:1、2、3、4、文件的操作。

文件的逻辑结构和物理结构 磁盘空间的管理 磁盘目录结构

三、实验环境: Windows XP、VC++

四、程序运行结果(详图):

程序运行的主界面:用户运行命令7-建立目录

用户运行命令1-建立文件:

显示目录内容:

打开文件:

写文件:

关闭文件:

再次显示目录内容:

以上为程序的运行的部分截图。

五、程序清单: #define false 0 #define true 1 #include “stdio.h” //#include #include //#param warning(disable:4996)FILE*x1,*x2;typedef struct {

char name[3];/*文件或目录名*/ char type[2];/*文件类型名*/ char attribute;/*属性*/ char address;/*文件或目录的起始盘块号*/ char length;/*文件长度,以盘块为单位*/ }content;/*目录结构*/ #define n 5 /*模拟实验中系统允许打开文件的最大数量*/ typedef struct { int dnum;/*磁盘盘块号*/ int bnum;/*盘块内第几项*/ }pointer;/*已打开文件表中读写指针的结构*/ typedef struct {

char name[20];/*文件绝对路径名*/ char attribute;/*文件的属性,用1个字节表示,所以用了char类型*/ int number;/*文件起始盘块号*/ int length;/*文件长度,文件占用的字节数*/ int flag;/*操作类型,用“0”表示以读操作方式开文件,用“1”表示写操作pointer read;/*读文件的位置,文件刚打开时dnum为文件起始盘块号,bnumpointer write;/*写文件的位置,文件建立时dnum为文件起始盘块号,bnum方式打开文件*/ 为“0”*/ 为“0”,打开时为文件末尾*/ }OFILE;/*已打开文件表项类型定义*/ struct {

char buffer1[64];/*模拟缓冲1*/ content buffer2[8];/*模拟缓冲2*/ FILE *fc;/*模拟磁盘的文件指针*/

void copen(OFILE *x1,OFILE *x2)//OFILE *x1,*x2;{

} strcpy(x1->name,x2->name);x1->attribute=x2->attribute;x1->number=x2->number;x1->length=x2->length;x1->flag=x2->flag;x1->read.dnum=x2->read.dnum;x1->read.bnum=x2->read.bnum;x1->write.dnum=x2->write.dnum;x1->write.bnum=x2->write.bnum;OFILE file[n];/*已打开文件表*/ int length;/*已打开文件表中登记的文件数量*/ }openfile;/*已打开文件表定义*/

int sopen(char *name)/*在已打

件//P172 //char *name;{

void dopen(char *name)/*在已打开文件表中删除文件name*/ //char *name;{

int iopen(content *x)/*在已打开文件表中插入文件name*/ //content *x;{ int i;i=sopen(name);if(i==-1){

} copen(&openfile.file[i],&openfile.file[openfile.length-1]);openfile.length--;printf(“文件未打开n”);else int i;i=0;while(i

name*/ 依次查找已打开文件表*/ if(i>=openfile.length)return(i);}/*查找sopen函数结束*/ }/*删除函数结束*/

int i;i=sopen(x->name);if(i!=-1){

} else if(openfile.length==n){

} else {

} //copen(&openfile.file[openfile.length],x);openfile.length++;return(true);printf(“已打开文件表已满n”);return(false);printf(“文件已经打开n”);return(false);}/*填写已打开文件表函数结束*/ int allocate()/*分配一个磁盘块,返回块号*/ {

*/

//P173 int i;fseek(fc,0,SEEK_SET);/*将模拟磁盘的文件指针移至模拟磁盘FAT表*/ fread(buffer1,64L,1,fc);/*将FAT表中第一个磁盘块读入模拟缓冲for(i=3;i<63;i++)if(buffer1[i]==0){ /*FAT中的第i项为0,分配第i块磁盘块,修改FAT表,并且写回磁盘buffer1中*/ buffer1[i]=255;

} fseek(fc,0,SEEK_SET);fwrite(buffer1,64L,1,fc);return(i);/*返回磁盘号*/ fread(buffer1,64L,1,fc);/*将FAT表中第二个磁盘块读入模拟缓冲for(i=0;i<63;i++)

if(buffer1[i]==0){/*FAT中的第i项为0,分配第i+64块磁盘块,修改FAT表,并且写

} printf(“已经没有磁盘空间n”);return(false);buffer1[i]=255;fseek(fc,-64L,SEEK_CUR);fwrite(buffer1,64L,1,fc);return(i+64);/*返回磁盘号*/ buffer1中*/ 回磁盘*/ }/*分配磁盘块函数结束*/ int read_file(char *name,int length)/*读文件函数,文件路径名name,读取长度length*/ //char *name;//int length;{

int i,t;//char ch;if((i=sopen(name))==-1){

} if(openfile.file[i].flag==1){ printf(“文件以写方式打开,不能读n”);printf(“文件没有打开或不存在n”);return(false);

} return 0;t=0;fseek(fc,openfile.file[i].read.dnum*64L,SEEK_SET);fread(buffer1,64,1,fc);while(t

openfile.file[i].read.dnum=buffer1[openfile.file[i].read.dnum%64]

}

} t++;openfile.file[i].read.bnum=0;fseek(fc,openfile.file[i].read.dnum*64L,SEEK_SET);fread(buffer1,64,1,fc);/*读取下一个*/ putchar(buffer1[openfile.file[i].read.bnum]);/*读出一个字符(这if((t+1)%64==0)putchar('n');/*修改读指针*/ openfile.file[i].read.bnum++;if(openfile.file[i].read.bnum>=64)/*一块读完,读取下一个盘块*/ { fseek(fc,openfile.file[i].read.dnum/64*64, SEEK_SET);fread(buffer1,64,1,fc);里是在屏幕上显示)*/;/*修改读指针*/ }/*读函数结束*/ int write_file(char *name,char *buff,int length)//P174 /*写文件函数*/ //char *name;/*文件路径名*/ //char *buff;/*存放准备写入磁盘的内容*/ //int length;/*写入内容的长度*/ {

int i,t,dd;if((i=sopen(name))==-1)/*文件不存在,无法写*/ {

} if(openfile.file[i].flag==0){

} t=0;fseek(fc,openfile.file[i].write.dnum*64L, SEEK_SET);fread(buffer1,64,1,fc);while(t

buffer1[openfile.file[i].write.bnum]=buff[t];openfile.file[i].write.bnum++;openfile.file[i].length++;if(openfile.file[i].write.bnum>=64){

fseek(fc, openfile.file[i].write.dnum*64L, SEEK_SET);fwrite(buffer1,64,1,fc);/*一块写完,写回磁盘*/ if((dd=allocate())==false){

openfile.file[i].write.bnum--;openfile.file[i].length--;printf(“无磁盘空间,部分信息丢失,写失败n”);return(false);printf(“文件以读方式打开,不能写n”);return(false);printf(“文件没有打开或不存在n”);return(false);}/*if*/ fseek(fc,openfile.file[i].write.dnum/64*64L, SEEK_SET);fread(buffer1,64,1,fc);buffer1[openfile.file[i].write.dnum%64]=dd;fseek(fc,openfile.file[i].write.dnum/64*64L, SEEK_SET);

fwrite(buffer1,64,1,fc);openfile.file[i].write.dnum=dd;openfile.file[i].write.bnum=0;}/*if*/ t++;}/*while*/ fseek(fc, openfile.file[i].write.dnum*64L, SEEK_SET);fwrite(buffer1,64,1,fc);/*一块写完,写回磁盘*/ }/*写函数结束*/ int search(char *name,int flag,int *dnum,int *bnum)/*查找路径名为name的文件或目录,返回该目录的起始盘块号 */ //char *name;//int flag;/*flag=8表示查找目录,否则为文件*/ //int *dnum,*bnum;/*返回找到文件或目录的目录项的位置:盘块dnum中第bnum项*/ {

for(s=0;name[k]!='.'&&name[k]!='/'&&s<3&&name[k]!='';s++,k++)

pna[s]=name[k];pna[s]=' ';for(;s<3;s++)/*用空格补全名字长度*/ int k,i,s,j,last=0;char pna[3],type[2];if((strcmp(name,“")==0)||(strcmp(name,”/“)==0))/* return(2);

目录

*/ //P175 k=0;if(name[0]=='/')k=1;i=2;/*i=根目录的起始盘块号*/ while(last!=1){ /*pna=从name中分离出”/“后一个目录名(或文件名)*/ */

&

while(name[k]!='.'&&name[k]!=''&&name[k]!='/')/*除去多余字符 k++;type[0]=type[1]=' ';if(name[k]=='.')/*取文件类型名type*/

if(flag==8){

} else {/*文件遇到类型名认为结束,后面的字符作废*/

} else

if(name[k]!='')k++;if(name[k]=='')last=1;/*查找目录且名字等于pna的目录项*/ fseek(fc,i*64L,SEEK_SET);fread(buffer2,64L,1,fc);j=0;if(last==1&&flag!=8)k++;if(name[k]!='')type[0]=name[k];k++;if(name[k]!='')type[1]=name[k];if(name[k]!=''&&name[k+1]!=''){

} last=1;printf(”文件名错误n“);return(false);printf(”目录不应该有有类型名,查找失败n“);return(false);while(j<8&&!(buffer2[j].attribute!=8&&buffer2[j].name[0]==pna[0]&

j++;buffer2[j].name[1]==pna[1]&&buffer2[j].name[2]==pna[2]&& buffer2[j].type[0]==type[0]&&buffer2[j].type[1]==type[1]))else while(j<8&&!(buffer2[j].attribute==8&&buffer2[j].name[0]==pna[0]&

&&buffer2[j].name[2]==pna[2]))j++;

if(last==1)/*查找结束*/ {

*dnum=i;*bnum=j;

return(buffer2[j].address);&buffer2[j].name[1]==pna[1]

if(j<8)/*找到该目录或文件*/

} else/*查找还未结束*/

i=buffer2[j].address;/*读取下一个盘块*/ return(false);else //P176 }/*while 查找结束*/ }/*search()结束*/ int create_file(char *name,int attribute)/*建立文件函数,路径名name,文件属性attribute*/ //char *name;//int attribute;{ int i,j,k,s,d,t,b,dd,dn,bn;char dname[3],tname[2],pathname[20];

OFILE x;if(attribute%2==1){

} if(openfile.length==n){

} /* 将name分成两部分,目录路径pathname和目录名dname*/ for(j=0;name[j]!='';j++)/*查找最后一个“/”*/

if(name[j]=='/')s=j;/*分离目录路径*/ for(j=0;j

} for(;k<3;k++)dname[k]=' ';k=0;if(name[j++]=='.')/*分离类型名*/ {

} for(;k<2;k++)for(;name[j]!=''&&k<2&&name[j]!='.';j++,k++)tname[k]=name[j];printf(”错误文件名或目录名n“);return(false);dname[k]=name[j];if(k==0)printf(”已打开表已满,不能建立n“);return(false);printf(”只读文件,无法写,不能建立n“);return(false);

tname[k]=' ';if((d=search(pathname,8,&dn,&bn))==false)/*找到目录路径,返回该{

} /*确认该目录不存在的同时查找空目录项*/ printf(”目录不存在,不能建立“);return(false);目录所在块号dn和项数bn*/ b=-1;fseek(fc,d*64L,SEEK_SET);fread(buffer2,64L,1,fc);/*读出dnum盘块的内容*/ for(t=0;t<8;t++){ //P177 if(buffer2[t].name[0]==dname[0]&&buffer2[t].name[1]==dname[1]&&bu

{/*找到名字dname的文件,建立失败*/

} if(buffer2[t].name[0]=='$'&&b==-1)b=t;printf(”文件已经存在,不能建立n“);return(false);ffer2[t].name[2]==dname[2] &&buffer2[t].type[0]==tname[0]&&buffer2[t].type[1]==tname[1])}/*for*/ if(b==-1)/*没有空目录项,建立失败*/ {

} if((dd=allocate())==false)/*分配给建立目录的磁盘盘块dd*/ { printf(”建立文件失败n“);return(false);printf(”目录无空间n“);return(false);

} /*填写目录项*/ for(i=0;i<3;i++)buffer2[b].name[i]=dname[i];buffer2[b].type[i]=tname[i];for(i=0;i<2;i++)buffer2[b].attribute=attribute;buffer2[b].address=dd;buffer2[b].length=0;fseek(fc,d*64L,SEEK_SET);fwrite(buffer2,64L,1,fc);/*填写已打开文件表*/ strcpy(x.name,name);x.attribute=attribute;x.number=dd;x.length=0;x.flag=1;x.read.dnum=x.write.dnum=dd;x.read.bnum=x.write.bnum=0;//iopen(&x);}/*建立文件结束*/ int open_file(char *name,int attribute)/*打开文件函数*/ //char *name;//int attribute;{

OFILE x;int dnum,bnum,last,i,d;if((d=search(name,4,&dnum,&bnum))==false){

} printf(”文件不存在,打开操作失败n“);return(false);

} fseek(fc,dnum*64L,SEEK_SET);/*fread(buffer2,64,1,fc);

读出对应目录项*/ //P178 if((buffer2[bnum].attribute%2==1)&& attribute==1)/*对只读文件要求{

} strcpy(x.name,name);x.attribute=buffer2[bnum].attribute;x.number=buffer2[bnum].address;x.read.dnum=x.write.dnum=buffer2[bnum].address;x.read.bnum=x.write.bnum=0;x.flag=attribute;if(attribute==1){

} iopen(&x);/*填写已打开文件表*/ while(d!='xff')/*寻找文件末尾*/ {

fseek(fc, d/64*64L, SEEK_SET);fread(buffer1,64L,1,fc);/*读出dnum项所在FAT*/ last=d;d=buffer1[d%64];/*读出dnum块下一块内容赋给dnum*/ printf(”文件不能写,打开失败“);return(false);写*/ }/*while*/ x.write.dnum=last;/*填写写指针*/ fseek(fc, last*64L, SEEK_SET);fread(buffer1,64L,1,fc);for(i=0;i<64&&buffer1[i]!='#';i++);x.write.bnum=i;x.length=(buffer2[bnum].length-1)*64+i;int close_file(char *name)/*关闭文件函数*/ //char *name;{

}

int Delete(char *name)/*删除文件*/ //char *name;int i,dnum,bnum;if((i=sopen(name))==-1){

} if(openfile.file[i].flag==1)/*写文件的追加文件结束符*/ {

} /*在已打开文件表中删除该文件的登记项*/ fseek(fc,openfile.file[i].write.dnum*64L, SEEK_SET);fread(buffer1,64,1,fc);buffer1[openfile.file[i].write.bnum]='#';fseek(fc,openfile.file[i].write.dnum*64L, SEEK_SET);fwrite(buffer1,64,1,fc);fputc('#',fc);search(name,4,&dnum,&bnum);/*查找该文件目录位置*/ /*修改目录中的文件长度*/ fseek(fc,dnum*64L, SEEK_SET);fread(buffer2,64,1,fc);buffer2[bnum].length=openfile.file[i].length/64+1;fseek(fc, dnum*64L, SEEK_SET);fwrite(buffer2,64,1,fc);printf(”打开的文件中没有该文件,关闭失败n“);return(false);if(openfile.length>1)copen(&openfile.file[i],&openfile.file[openfile.length-1]);//P179 openfile.length--;{

int md(char *name)/*建立目录函数,目录路径名name*/ //char *name;{ int i,j,k,s,d,t,b,dd,dn,bn;int dnum,bnum,t;if((t=search(name,4,&dnum,&bnum))==false){

} if(sopen(name)!=-1){

} fseek(fc,dnum*64L, SEEK_SET);fread(buffer2,64,1,fc);buffer2[bnum].name[0]='$';/*将该文件的目录置成空目录*/ fseek(fc,dnum*64L, SEEK_SET);fwrite(buffer2,64,1,fc);while(t!='xff')/*通过FAT查找每一个盘块号,并依次删除*/ {

} dnum=t;fseek(fc, dnum/64*64, SEEK_SET);fread(buffer1,64,1,fc);t=buffer1[dnum%64];buffer1[dnum%64]=0;fseek(fc, dnum/64*64L, SEEK_SET);fwrite(buffer1,64,1,fc);printf(”该文件打开,不能删除n“);return(false);printf(”文件不存在n“);return(false);}/*文件删除结束*/

char dname[3],pathname[20];i=2;/* i=根目录的起始盘块号*/ /* 将name分成两部分,目录路径pathname和目录名dname*/ for(j=0;name[j]!='';j++)/*查找最后一个“/”*/

if(buffer2[t].name[0]==dname[0]&&buffer2[t].name[1]==dname[1]

&&buffer2[t].name[2]==dname[2]&&buffer2[t].attribute==8)if(name[j]=='/')s=j;/*分离目录路径*/ for(j=0;j

} for(;k<3;k++){

} b=-1;/*确认该目录不存在的同时查找空目录项*/ fseek(fc,d*64L,SEEK_SET);fread(buffer2,64L,1,fc);/*读出d盘块的内容*/ for(t=0;t<8;t++){ printf(”目录不存在,不能建立n“);return(false);dname[k]=' ';if((d=search(pathname,8,&dn,&bn))==false)/*找到目录路径*/ printf(”错误文件名或目录名n“);dname[k]=name[j];if(k==0)return(false);//P180

{/*找到名字dname的目录,建立失败*/

} if(buffer2[t].name[0]=='$'&&b==-1)b=t;printf(”目录已经存在,不能建立n“);return(false);}/*for*/ if(b==-1)/*没有空目录项,不能建立*/ {

} if((dd=allocate())==false)/*分配给建立目录的磁盘盘块dd*/ {

} /*填写目录项*/ for(i=0;i<3;i++)buffer2[b].name[i]=dname[i];buffer2[b].type[0]=buffer2[b].type[1]=' ';buffer2[b].attribute=8;buffer2[b].address=dd;buffer2[b].length=0;fseek(fc,d*64L,SEEK_SET);fwrite(buffer2,64L,1,fc);/*分给新建目录的盘块初始化*/ for(t=0;t<8;t++)buffer2[t].name[0]='$';fseek(fc, dd*64L, SEEK_SET);fwrite(buffer2,64L,1,fc);printf(”目录不能建立n“);return(false);printf(”目录无空间n“);return(false);}/*建立目录结束*/ int dir(char *name)/*显示目录内容*/ //char *name;{

int t,dnum,dn,bn;if((dnum=search(name,8,&dn,&bn))==false)/*找到目录路径,返回该目录{

} printf(”目录不存在n“);return(false);所在块号dn和盘块内项数bn*/ printf(”名称 扩展名 起始盘块 长度n“);/*显示目录内容*/ fseek(fc,dnum*64L, SEEK_SET);fread(buffer2,64L,1,fc);for(t=0;t<8;t++)/*显示该盘块中目录项的内容*/

if(buffer2[t].name[0]!='$')printf(” %c%c%c %c%c %4d%7dn“, buffer2[t].name[0], buffer2[t].name[2],buffer2[t].type[0], //P181 buffer2[t].name[1], buffer2[t].type[1],buffer2[t].address, buffer2[t].length);}/*显示目录函数结束*/

char typefile(char *name)/*显示文件内容*/ //char *name;{

int dnum,dn,bn,t;if((dnum=search(name,1,&dn,&bn))==false){

} if(sopen(name)!=-1){ printf(”文件不存在n“);return(false);

} printf(”该文件打开,不能显示n“);return(false);while(dnum!='xff'){

} fseek(fc,dnum*64L,SEEK_SET);fread(buffer1,64,1,fc);/*读一个盘块到缓冲*/ for(t=0;t<64&&buffer1[t]!='#';t++)/*显示缓冲中内容*/ putchar(buffer1[t]);printf(”n“);/*获得下一个盘块*/ fseek(fc, dnum/64*64L, SEEK_SET);fread(buffer1,64,1,fc);dnum=buffer1[dnum%64];}/*显示文件函数结束*/ int change(char *name,int attribute)/*改变文件name的属性为attribute*/ //char *name;//int attribute;{

int dnum,bnum;if(search(name,1,&dnum,&bnum)==false)/*查找文件目录*/ {

} if(sopen(name)!=-1){

} fseek(fc,dnum*64L,SEEK_SET);printf(”该文件打开,不能改变文件属性n“);return(false);printf(”文件不存在n“);return(false);//P182

fread(buffer2,64,1,fc);/*读出该目录所在盘块*/ buffer2[bnum].attribute=attribute;/*修改属性*/ fseek(fc,dnum*64L,SEEK_SET);fwrite(buffer2,64,1,fc);/*写回磁盘*/ }/*改变文件属性函数结束*/ int main(){

char name[20];//FILE*x1,*x2;//errno_t err;//char err;int attribute,type,length,i,a,j;char buffer[64];/*建立文件,模拟磁盘*/ if((fc=fopen(”c:c“,”w+“))==NULL)// {

} /*初始化已打开文件表*/ openfile.length=0;/*初始化磁盘*/ /*初始化文件分配表*/ buffer1[0]=buffer1[1]=buffer1[2]=255;/*磁盘第0、1块存放FAT表,第for(i=3;i<64;i++)buffer1[i]=0;buffer1[13]=buffer1[49]=254;/*假定模拟磁盘中有两个坏盘块:第13块fwrite(buffer1,64L,1,fc);for(i=0;i<64;i++)buffer1[i]=0;printf(”无法打开文件n“);exit(0);2块存放跟目录*/ 和49块*/ //P183

fwrite(buffer1,64L,1,fc);/*初始化根目录*/ for(i=0;i<8;i++)buffer2[i].name[0]='$';/*若目录项的第一个字符为“$”表示该目录项为空*/ fwrite(buffer2,64L,1,fc);/*初始化已打开文件表*/

while(1){

printf(”n 0建立文件n“);printf(” 2读文件n“);printf(” 4关闭文件n“);printf(” 6建立目录n“);printf(” 8显示文件内容n“);printf(” 10-改变文件属性n“);printf(” 选择功能项(0~9):“);scanf(”%d“,&a);switch(a){ case 0: /*a=0程序结束*/

fclose(fc);exit(0);printf(”输入文件路径名和文件属性(1-只读文件,3-只读系统文scanf(“%s%d”,name,&attribute);create_file(name,attribute);/*建立文件*/ break;case 1: /*a=1建立文件*/ 件,4-普通文件):“);case 2: /*a=2打开文件*/

printf(”输入文件路径名和操作类型(0-读文件,1-写文件):“);

scanf(”%s%d“,name,&type);

open_file(name,type);/*打开文件*/

break;

case 3: /*a=3读文件*/

printf(”输入文件路径名和读长度“);

scanf(”%s%d“,name,&length);

read_file(name,length);/*读文件*/

break;

case 4: /*a=4写文件*/

printf(”输入文件路径名:“);

scanf(”%s“,name);

printf(”输入写的内容和和写长度“);

scanf(”%s%d“,buffer,&length);

write_file(name,buffer,length);/*写文件*/

break;

case 5:

/*a=

5关

文//P184

printf(”输入文件路径名“);

scanf(”%s“,name);

close_file(name);/*关闭文件*/

break;

case 6: /*a=6删除文件*/

printf(”输入文件路径名“);

scanf(”%s“,name);

Delete(name);/*删除文件*/

break;

case 7: /*a=7建立目录*/

printf(”输入目录路径名“);

scanf(”%s“,name);

md(name);/*建立目录*/

break;

case 8: /*a=8显示目录*/

printf(”输入目录路径名“);scanf(”%s“,name);

*/

dir(name);/*显示目录*/ break;printf(”输入文件路径名“);scanf(”%s“,name);typefile(name);/*显示文件*/ break;printf(”输入文件路径名和文件属性(1-只读文件,3-只读系统文scanf(“%s%d”,name,&attribute);change(name,attribute);case 9: /*a=9显示文件*/ case 10:/* a=10改变文件属性 */ 件,4-普通文件):");}/* switch */)

束}/* while */ }/*main(//P185

六、结束语:

*/

通过对磁盘文件操作,使我了解了基本的磁盘文件的知识,再加上对程序流程的理解,更加明白了Windows对磁盘管理的方式,首先程序查找绝对路径名name,然后从name中分离出“/”后下一个目录(或文件名);若是文件,分离出类型名type,再进行之后的判断操作。当在已打开的文件表中查找某文件时,首先查找文件路径名为pname的文件,通过一个变量的判断,进行查找。将某文件从已打开的表中删除时,在已打开的文件表中查找路径名为name的登记项i,如果找到该文件登记项i,删除第i项,如果没有找到,提示文件没有打开,删除失败。通过对这些流程的理解,让我深刻的体会到了磁盘文件操作的步骤,达到了实习目的。参考文献:

[1] 滕艳平等.计算机操作系统(实验指导书),哈尔滨工业大学出版社.2008年9月

[2] 张明等编.操作系统习题解答与实验指导(第二版).中国铁道出版社.2007年12月

[3] 张丽芬等编.操作系统实验教程.清华大学出版社.2006年 [4] 张献忠等编.操作系统学习辅导.清华大学出版社.2004年

[5] 汤小丹等编.计算机操作系统.西安电子科技大学出版社.2006年9月

第二篇:操作系统课程设计++模拟磁盘文件管理的程序

中南林业科技大学

操作系统课程设计

课程题目:模拟磁盘文件管理的程序

姓名: 学号:

专业: 计算机科学与技术 年级:

2006

计算机科学学院

2008年11月 模拟磁盘文件管理的程序

一、课程设计内容

⑴ 自定义磁盘文件管理的数据结构; ⑵ 能够自由创建、修改、删除文件; ⑶ 文件具有一定自定义的属性; ⑷ 能够显示当前系统文件的状态。

二、课程设计的数据结构说明

程序中定义了两个类: class file//文件类 {private: char name[10];//文件名 public: int tag;//删除标记 1:已删 0:未删 file(){ } char *getname(){return name;} //获取文件名

int gettag(){return tag;} //获取删除标记

int getlength(){return length;} //获取文件大小

int getblocknum(){return blocknum;} // 磁盘块数

int getblocksum1(){return blocksum1;} //磁盘块号的始点 int getblocksum2(){return blocksum2;} //磁盘块号的终点 int length,blocknum,blocksum1,blocksum2;

void setname(char na[ ]){strcpy(name,na);} //设置文件名 void delwenjian(){ tag=1;}//设置删除标记 1:已删 0:未删

void creatfile(char *na,int L,int num,int s1,int s2)//创建文件 void deltefile(char *na){tag=1;strcpy(name,na);} //删除文件 void disp()//输出文件信息 class fdatabase //文件库类 { private: int top;//文件记录指针 file f[50];public: fdatabase(){top=-1;} //构造函数 int search(char *fname)//按文件名查找

int creatfile(char *na,int L,int num,int s1,int s2)//创建文件时先查找是否存在

int deltefile(char *na)//删除文件时先查找是否存在 void disp()//输出所有文件信息 };

三、课程设计的模板说明

1、初始化,建立文件系统

输入磁盘大小(G),每个盘块大小(M),自动建立位示图,位示图字长定为32位

输出位示图的行数,以及行号、列号与磁盘块号的转换公式(都从0开始编号)。

2、循环选择执行以下功能

1、存储文件

输入建立的文件名和文件大小,如果该文件名已经存在,则输出不能建立的信息否则计算所需的磁盘块数

为其分配足够多的磁盘块,并记录下来 输出所占用的磁盘块号

2、删除文件

输入要删除的文件名,如果该文件名不存在,则输出删除错误信息,否则收回该文件所占用的磁盘块 删除该文件名

3、显示位示图情况

显示位示图的情况 显示剩余磁盘块的数目

4、显示文件列表

显示文件名,文件大小,占用的磁盘块数目和磁盘块号

四、课程设计的源代码

#include #include #include #include #include int i=0,j=0,sum=0,tt=0,r,ii,k,g,m;int a[100][32];class file//文件类 {private: int no;//文件编号

char name[10];//文件名 public: int tag;//删除标记 1:已删 0:未删 file(){ } char *getname(){return name;} //获取姓名

int gettag(){return tag;} //获取删除标记

int getno(){return no;} //获取文件编号

int getlength(){return length;} //获取文件大小

int getblocknum(){return blocknum;} // 磁盘块数 int getblocksum1()//磁盘块号的始点 { return blocksum1;} int getblocksum2()//磁盘块号的终点 { return blocksum2;} int length;//文件大小

int blocknum;//盘块数

int blocksum1;//所占盘块号的始点

int blocksum2;//所占盘块号的终点

void setname(char na[ ])//设置文件名

{strcpy(name,na);} void delwenjian(){ tag=1;}//设置删除标记 1:已删 0:未删

void creatfile(char *na,int L,int num,int s1,int s2)//创建文件 { tag=0;length=L;blocknum=num;blocksum1=s1;blocksum2=s2;strcpy(name,na);blocknum=length/m;//盘块数=文件大小/盘块大小 if(length%m!=0)//盘块数取上整 blocknum=blocknum+1;cout<<“ 所需磁盘块数:”<

for(;j<32;j++)

a[i][j]=1;i=i+1;for(j=0;j<(sum+blocknum)-32;j++)//再进行剩余项赋值

{

a[i][j]=1;} sum=sum+blocknum-32;} tt=tt+blocknum;//输出文件所占用的盘块号

cout<<“ 所占磁盘块号:”<

{

for(ii=0;ii<=top;ii++)

{ if(strcmp(f[ii].getname(),fname)==0 && f[ii].tag==0)

return 0;

}

return 1;} int creatfile(char *na,int L,int num,int s1,int s2)//创建文件时先查找是否存在

{ int p;p=search(na);

if(p==1)

{ top++;

f[top].creatfile(na,L,num,s1,s2);

return 1;}

else

{cout<<“!!该文件已存在,不能创建!!nn”;

return 0;} } int deltefile(char *na)//删除文件时先查找是否存在{int b,p,x=0,n1,n2,q1,q2,t;p=search(na);if(p==0)//若文件存在

{ //进行删除文件赋值

f[ii].tag=1;b=f[ii].length/m;//盘块数=当前文件大小/盘块大小

if(ii==0)// 对第一个删除文件进行赋值

for(k=0;k

a[x][k]=0;

else{ n1=(f[ii-1].blocksum2+1)/32;//被查找的文件之前文件所占用的盘块数

/32,//大于0表示跨行

n2=(f[ii].blocksum2+1)/32;//所有文件所占用的盘块数/32,大于0表示跨行

q1=(f[ii-1].blocksum2+1)-n1*32;// 当前文件的开始盘块号 q2=(f[ii].blocksum2+1)-n2*32;// 用于跨行后计算盘块号 t=n2-n1;if(t==0)//若n2与n1相等,表明当前所有被占用盘块在同一行

for(k=q1;k<1+b;k++)

a[n2][k]=0;

else { if((f[ii-1].blocksum2+1)%32==0)//前面所占用的盘块数是32倍数

{ x=x+n1;//当前文件赋值

for(;t-1>=0;t--,x++)//循环进行整行赋值

for(k=0;k<32;k++)

a[x][k]=0;

x=n2;//对剩余项赋值

for(k=0;k

a[x][k]=0;

} else //对当前文件前几项赋值

{ x=n1;

for(k=q1;k<32;k++)

a[x][k]=0;x=x+1;int t1=t;

for(;t-1>0;t--,x++)//中间整行赋值

for(k=0;k<32;k++)

a[x][k]=0;

x=n2;//最后剩余项赋值

for(k=0;k<(f[ii].blocksum2+1)-t1*32;k++)

a[x][k]=0;

}

} return 1;} } else

{cout<<“该文件不存在”;

return 0;}

} void disp()//输出所有文件信息 { for(int i=0;i<=top;i++)

if(f[i].tag==0)

f[i].disp();} };void bit_map(int I){ int s=0;cout<<“-”<

cout<

out<<“--”<>g;cout<>m;cout<

a[i][j]=0;

cout<<“ 建立的位示图为:”<

cout<<“ 行数:”<

cout <<“ttt1

存 储 文 件nnttt2

删 除 文 件 nnttt3 显示位示图情况 nnttt4 显示文件列表”<> choice;cout<

case '1':

cout <<“ 请输入文件名: ”;

cin>>fname;

cout<

if(q==0)

{ cout<<“!!该文件已存在,不能创建!!nn”;

break;}

cout <<“ 请输入文件大小MB: ”;

cin>>l;

cout<

if(l>g*1024)

{cout<<“!!文件大小超过磁盘最大容量,无法进行分配!!”<

break;}

p.creatfile(fname,l,b,ss1,ss2);

break;

case '2':

cout <<“ 请输入文件名: ”;

cin>>fname;

cout<

q=p.search(fname);

if(!q==0)

{

cout<<“!!该文件不存在,无法删除!!nn ”;

break;

} p.deltefile(fname);

break;case '3':

cout <<“tt**************显示位示图如下*********************n”;

bit_map(I);

cout<

break;

case '4': cout <<“tt*************文件列表如下************************n”;cout<<“-”<

p.disp();

cout<

break;default:

cout<<“输入错误,请从新输入: nn”;

break;} } }

五、课程设计程序运行结果

1、初始化,建立文件系统

(1)用户根据提示输入磁盘大小(GB)与每个盘块大小(MB);

(2)程序首先根据用户输入的磁盘大小(GB)与每个盘块大小(MB),自动建立位示图,即初始化位示图,位示图每一行长度固定为32位(即列固定为32);位示图中每一位表示一个盘块,取值0和1分别表示空闲和占用。初始化的位示图应全为0;

(3)程序再输出位示图的剩余盘块数,行数,以及行号、列号与磁盘块号的转换公式(行列皆从0开始编号);

这样,初始化,建立文件系统完成。运行结果:

2、选择执行:存储文件,删除文件,显示位示图情况,显示文件列表 【显示文件管理系统列表】显示文件系统管理列表,并提示输入信息1——4。用户输入文件操作命令1(存储文件),2(删除文件)、3(显示位示图情况)、4(显示文件列表);

格式如下:键入1,创建文件名为fname,大小为L(MB)的文件;

键入2,删除文件名为fname的文件;

键入3,显示位示图情况;

键入4,显示所有文件信息。

运行结果:

【存储文件】

用户输入文件操作命令是1(存储文件)。系统提示你输入你要建立的文件名和文件大小,如果该文件名已经存在,则系统提示输出不能建立此文件的信息,否则计算所需的磁盘块数和所占用的磁盘块号,并输出结果。相应的在位示图上,因为位示图是矩阵,可以用数组存储,根据所占用的磁盘块号和公式:

磁盘块号=行号*32+列号 行号=磁盘块号/32

列号=磁盘块号%32 计算出文件占用的磁盘块在位示图上的位置,现在是创建文件,所以将位示图该位置上的二进制数置1,表示已分配出去。

分别创建名为ll,zz和mm三个文件,文件大小分别为224MB,320MB和56MB。

此时对应的位示图如下:

文件列表如下:

若再创建一个已经创建过的文件,则显示如下信息:

若创建的文件大小超过磁盘的最大容量,则显示如下信息:

【删除文件】

用户输入文件操作命令是2(删除文件)。系统提示你输入要删除的文件名,如果该文件名不存在,则输出删除出错信息。在位示图上,根据所占用的磁盘块号和公式:

磁盘块号=行号*32+列号 行号=磁盘块号/32 列号=磁盘块号%32 计算出文件占用的磁盘块在位示图上的位置,现在是删除文件,所以将位示图该位置上的二进制数置0,表示收回该文件所占用的磁盘块。删除第二个文件zz,结果如下:

则相应的位示图和文件列表变为:

若删除一个不存在的文件,则显示如下信息:

【显示位示图情况】

如果用户输入文件操作命令是我wst()(显示位示图情况),系统输出此时位示图的情况,状态位为'0'表示对应盘块空闲,状态位为'1'表示该盘块已被分配出去。系统再显示剩余磁盘块的数目。

以下是删除zz文件,创建xx后和创建xx后,删除ll的位示图:

【显示文件列表】

如果用户输入文件操作命令是disp()(显示所有文件情况),系统会显示所有文件的文件名,文件大小,占用的盘块数和盘块号。

以下是删除zz文件,创建xx后和创建xx后,删除ll显示的文件列表:

第三篇:操作系统课程设计-磁盘调度算法

1.实验题目:

磁盘调度算法。

建立相应的数据结构;

在屏幕上显示磁盘请求的服务状况;

将一批磁盘请求的情况存磁盘文件,以后可以读出并重放; 计算磁头移动的总距离及平均移动距离; 支持算法:FIFO、SSTF、SCAN、CSCAN;

2.设计目的:

调度磁盘I/O请求服务,采用好的方式能提高访问时间和带宽。本实验通过编程对磁盘调度算法的实现,加深对算法的理解,同时通过用C++语言编写程序实现这些算法,并在windos平台上实现,更好的掌握操作系统的原理以及实现方法,提高综合运用专业课知识的能力。

3.任务及要求

3.1 设计任务

编程实现下述磁盘调度算法,并求出每种算法的平均寻道长度:

1、先来先服务算法(FCFS)

2、最短寻道时间算法(SSTF)

3、扫描算法(SCAN)

4、循环扫描算法(CSCAN)

3.2 设计要求

对用户指定的磁盘调度请求序列,基于以上四种算法,实现各自的调度顺序并输出,同时计算出各种算法下的平均寻道长度。

4.算法及数据结构

4.1算法的总体思想

queue[n] 为请求调度序列,diskrode为磁盘磁道数,headstarts为正在调度的磁道

①先来先服务算法(FCFS)按queue[n]数组的顺序进行磁盘调度,将前一个调度磁道与下一个调度磁道的差值累加起来,得到总的寻道长度,再除以n得到平均寻道长度。

②最短寻道时间优先算法(SSTF)将queue[n]进行由小到大的排序,首先定位当前调度磁headstarts在queue[n]的位置,通过循环语句找出离起始磁头最短的位置。

③扫描算法(SCAN)

将queue[n]进行由小到大的排序,首先定位当前调度磁headstarts在queue[n]的位置,然后在此位置按给定的方向遍历queue[n],当道端点(queue[0]或queue[n-1])时,再在定位处反向遍历到另一端。当调度磁道不在queue端点时,总的寻道长度为为前一个磁道与后一个磁

道差值的累加,当到达端点且queue[n]未全调度时,总寻道长度加上端点值再加上下一个调度磁道的值,再按前面的算法进行,直到磁道全部都调度完毕,得到总的寻道长度,除以n得到平均寻道长度。

④循环扫描算法(CSCAN)将queue[n]进行由小到大的排序,首先定位当前调度磁headstarts在queue[n]的位置,然后在此位置按给定的方向遍历queue[n],当道端点(queue[0]或queue[n-1])时,反向到另一端点再以此方向进行遍历,直到queue[n]中所有都调度完。当调度磁道不在queue端点时,总的寻道长度为为前一个磁道与后一个磁道差值的累加,当到达端点且queue[n]未全调度时,总寻道长度加上端点值再加上磁盘磁道总长度,再加上下一个调度磁道的值,再按前面的算法进行,直到磁道全部都调度完毕,得到总的寻道长度,除以n得到平均寻道长度。

5、源代码:

#include #include #include void menu(){ cout<<“*********************菜单*********************”<

1、先来先服务算法(FCFS)**********”<

cout<<“******

2、最短寻道时间优先算法(SSTF)**********”<

cout<<“******

3、扫描算法(SCAN)**********”<

cout<<“******

4、循环扫描算法(CSCAN)**********”<

cout<<“******

5、退出 **********”<

/*======================初始化序列=======================*/ void init(int queue[],int queue_copy[],int n){ int i;for(i=0;i

//对当前正在执行的磁道号进行定位,返回磁道号小于当前磁道中最大的一个 int fix(int queue[], int n, int headstarts){ int i =0;while(iqueue[i]){ i++;} if(i>n-1)return n-1;//当前磁道号大于磁盘请求序列中的所有磁道 if(i==0)return-1;//当前磁道号小于磁盘请求序列中的所有磁道 else return i-1;//返回小于当前磁道号中最大的一个 } /*=================使用冒泡算法从小到大排序==============*/ int *bubble(int queue[],int m){ int i,j;int temp;for(i=0;i queue[j]){ temp=queue[i];queue[i]=queue[j];queue[j]=temp;} } cout<<“排序后的磁盘序列为:”;for(i=0;i

/* ====================以下是FCFS算法==================*/ void FCFS(int queue[],int n,int diskrode,int headstarts)//queue是请求调度序列,n为其个数,diskroad为磁盘磁道数,headstarts为正在调度的磁道 { cout<<“************以下为FCFS调度算法***********”<queue[0])count +=headstarts-queue[0];else count+=queue[0]-headstarts;cout<<“调度序列为: ”;cout<queue[i+1])count +=queue[i]-queue[i+1];else count +=queue[i+1]-queue[i];} cout<

/*=====================SSTF算法====================*/ void SSTF(int queue[], int n, int diskrode, int headstarts){ int k=1;int l,r;int i,j,count=0;queue =bubble(queue,n);cout<<“************以下为SSTF调度算法***********”<=0;i--)cout<=headstarts)//若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务 { cout<<“磁盘扫描序列为: ”;cout<queue[0] && headstarts =0)&&(r

-headstarts)){ cout<=0;j--){ cout<

/*======================以下是SCAN算法====================*/ void SCAN(int queue[], int n, int diskrode, int headstarts){ int direction, i, fixi;cout<<“***********以下是SCAN调度算法*************”<>direction;double count=0;*bubble(queue,n);fixi = fix(queue,n,headstarts);cout<=0;i--){ cout<=0;i--)//从大到小 { cout<-1;i--){ cout<-1;i--)//从大到小 { cout<

/*======================以下是CSCAN算法====================*/ void CSCAN(int queue[],int n,int diskrode,int headstarts){ int direction,i,fixi;cout<<“***********以下是CSCAN调度算法*************”<>direction;int count=0;//count表示磁道移动的长度 *bubble(queue,n);fixi=fix(queue,n,headstarts);cout<<“调度序列为: ”<-1;--i){ cout<-1;--i){ cout<-1;i--){ cout<fixi;i--){ cout<

void main(){ int n, i, diskrode, headstarts;//n表示调度磁盘请求序列queue的长度,diskrode表示磁盘磁道的个数,headstarts表示目前正在调度的磁道; cout<<“请输入磁盘的总磁道数:”<> diskrode;cout<<“请输入磁盘调度请求序列个数:”<>n;int *queue;queue =(int*)malloc(n*sizeof(int));//给quneue数组分配空间...int *queue_copy;queue_copy =(int*)malloc(n*sizeof(int));cout<<“请依次输入该序列的值:”<>queue[i];for(i=0;i>headstarts;int menux;menu();cout<<“请按菜单选择,输入相应的数字: ”;cin>>menux;while(menux!=0){ if(menux ==1)FCFS(queue,n,diskrode,headstarts);

if(menux ==2)SSTF(queue,n,diskrode,headstarts);

if(menux ==3)SCAN(queue,n,diskrode,headstarts);if(menux ==4)CSCAN(queue,n,diskrode,headstarts);if(menux ==5)cout<<“程序结束,谢谢使用!”<>menux;cout<

第四篇:操作系统课程设计,磁盘调度算法范文

沈阳理工大学课程设计专用纸 Noi

目 录 1 课程设计目的及要求……………………………………………………错误!未定义书签。2 相关知识…………………………………………………………………错误!未定义书签。3 题目分析…………………………………………………………………2 4 概要设计…………………………………………………………………2 4.1 先来先服务(FCFS)的设计思想……………………………….2 4.2 最短寻道时间优先调度(SSTF)的设计思想…………………..2 4.3 扫描算法(SCAN)的设计思想…………………………………2 4.4 循环扫描(CSCAN)的设计思想………………………………..2 5 代码及流程………………………………………………………………3 5.1 流程图……………………………………………………………...3 5.2 源代码……………………………………………………………...8 6 运行结果…………………………………………………………………16 7 设计心得…………………………………………………………………19 参考文献…………………………………………………………………………19

沈阳理工大学 沈阳理工大学课程设计专用纸 No1 1 课程设计目的及要求

设计目的:加深对操作系统原理的进一步认识,加强实践动手能力和程序开发能力的培养,提高分析问题解决问题的能力,培养合作精神,以巩固和加深磁盘调度的概念。操作系统是一门工程性很强的课程,它不仅要求学生掌握操作系统的工作原理和理论知识,也要求学生的实际动手能力,以加深对所学习内容的理解,使学生熟练地掌握计算机的操作方法,使用各种软件工具,加强对课程内容的理解。这次课程设计,就是通过模拟磁臂调度来加深对操作系统中磁臂调度概念的理解。使学生熟悉磁盘管理系统的设计方法;加深对所学各种磁盘调度算法的了解及其算法的特点。

设计要求:编程序实现下述磁盘调度算法,并求出每种算法的平均寻道长度;要求设计主界面可以灵活选择某算法,且以下算法都要实现

1、先来先服务算法(FCFS)

2、最短寻道时间优先算法(SSTF)

3、扫描算法(SCAN)

4、循环扫描算法(CSCAN)相关知识

数据结构:数组 now:当前磁道号;

array[]:放置磁道号的数组;

void FCFS(int array[],int m)先来先服务算法(FCFS)void SSTF(int array[],int m)最短寻道时间优先算法(SSTF)void SCAN(int array[],int m)扫描算法(SCAN)void CSCAN(int array[],int m)循环扫描算法(CSCAN)磁盘调度:当有多个进程都请求访问磁盘时,采用一种适当的驱动调度算法,使各进程对磁盘的平均访问(主要是寻道)时间最小。目前常用的磁盘调度算法有:1)闲来先服务2)最短寻道时间优先3)扫描算法4)循环扫描算法等

沈阳理工大学 沈阳理工大学课程设计专用纸 No2 3 题目分析

选择一个自己熟悉的计算机系统和程序设计语言模拟操作系统基本功能的设计方法及其实现过程

完成各分项功能。在算法的实现过程中,要求可决定变量应是动态可变的;同时模块应该有一个合理的输出结果。具体可参照实验的程序模拟.各功能程序要求自行编写程序实现,不得调用现有操作系统提供的模块或功能函数。磁盘调度程序模拟。先来先服务调度算法.最短寻道时间优先调度,循环(SCAN)调度算法。程序设计语言自选,最终以软件(含源代码以及执行程序)和设计报告的形式提交课程设计结果.。磁盘调度让有限的资源发挥更大的作用。在多道程序设计的计算机系统中,各个进程可能会不断提出不同的对磁盘进行读/写操作的请求。由于有时候这些进程的发送请求的速度比磁盘响应的还要快,因此我们有必要为每个磁盘设备建立一个等待队列。概要设计

1.先来先服务(FCFS)的设计思想

即先来的请求先被响应。FCFS策略看起来似乎是相当“公平”的,但是当请求的频率过高的时候FCFS策略的响应时间就会大大延长。FCFS策略为我们建立起一个随机访问机制的模型,但是假如用这个策略反复响应从里到外的请求,那么将会消耗大量的时间。为了尽量降低寻道时间,看来我们需要对等待着的请求进行适当的排序,而不是简单的使用FCFS策略。这个过程就叫做磁盘调度管理。有时候fcfs也被看作是最简单的磁盘调度算法。

2.最短寻道时间优先调度(SSTF)的设计思想

最短时间优先算法选择这样的进程。要求访问的磁道,与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。

3.扫描算法(SCAN)的设计思想

扫描(SCAN)调度算法:该算法不仅考虑到欲访问 的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。例如,当磁头正在自里向外移动时,SCAN算法所考虑的下一个访问对象,应是其欲访问的磁道,既在当前磁道之外,又是距离最近的。这样自里向外的访问,直至再无更外的磁道需要访问时,才将磁道换向自外向里移动。这时,同样也是每次选择这样的进程来调度,也就是要访问的当前位置内距离最近者,这样,磁头又逐步地从外向里移动,直至再无更里面的磁道要访问,从而避免了出现“饥饿”现像。

4.循环扫描(CSACN)的设计思想

循环扫描(CSCAN)算法:当磁头刚从里向外移动而越过了某一磁道时,恰好又有一进程请求访问此磁道,这时,该里程就必须等待,为了减少这种延迟,CSCAN算法规定磁头单向移动,而本实验过程中我们所设计的是磁头从里向外移动,而从外向里移动时只须改方向而已,本实验未实现。但本实验已完全能演示循环扫描的全过程。

沈阳理工大学 沈阳理工大学课程设计专用纸 No3 5 代码及流程

1.先来先服务(FCFS)

图 1—1 FCFS的流程图

沈阳理工大学 沈阳理工大学课程设计专用纸 No4 2.最短寻道时间优先调度(SSTF)

图1—2 SSTF的流程图

沈阳理工大学 沈阳理工大学课程设计专用纸 No5 3.扫描算法(SCAN)

图1—3 SCAN的流程图

沈阳理工大学 沈阳理工大学课程设计专用纸 No6 4.循环扫描(CSCAN)

图1—4 CSCAN的流程图

沈阳理工大学 沈阳理工大学课程设计专用纸 No7

图1—5 主函数的流程图

沈阳理工大学 沈阳理工大学课程设计专用纸 No8 源代码:

#include“stdio.h” #include“stdlib.h” //#include“iostream.h” #define maxsize 100 //定义最大数组域

//先来先服务调度算法 void FCFS(int array[],int m){ int sum=0,j,i;int avg;printf(“n FCFS调度结果: ”);for(i=0;i

} avg=sum/(m-1);//计算平均寻道长度 printf(“n 移动的总道数: %d n”,sum);printf(“平均寻道长度: %d n”,avg);}

//最短寻道时间优先调度算法 void SSTF(int array[],int m){ int temp;int k=1;int now,l,r;int i,j,sum=0;int avg;for(i=0;iarray[j])//两磁道号之间比较 { temp=array[i];

沈阳理工大学 沈阳理工大学课程设计专用纸 No9 array[i]=array[j];array[j]=temp;} } } for(i=0;i

for(i=m-1;i>=0;i--)//将数组磁道号从大到小输出 printf(“%d ”,array[i]);sum=now-array[0];//计算移动距离 } else if(array[0]>=now)//判断整个数组里的数是否都大于当前磁道号 {

for(i=0;i=0)&&(r

printf(“%d ”,array[l]);sum+=now-array[l];//计算移动距离 now=array[l];l=l-1;} else

沈阳理工大学 沈阳理工大学课程设计专用纸 No10 {

printf(“%d ”,array[r]);sum+=array[r]-now;//计算移动距离 now=array[r];r=r+1;} } if(l=-1){

for(j=r;j

printf(“%d ”,array[j]);} sum+=array[m-1]-array[0];//计算移动距离 } else {

for(j=l;j>=0;j--){

printf(“%d ”,array[j]);} sum+=array[m-1]-array[0];//计算移动距离 } } avg=sum/m;printf(“n 移动的总道数: %d n”,sum);printf(“平均寻道长度: %d n”,avg);} //扫描算法

void SCAN(int array[],int m)//先要给出当前磁道号和移动臂的移动方向 { int temp;int k=1;int now,l,r,d;int i,j,sum=0;int avg;for(i=0;iarray[j])//对磁道号进行从小到大排列

沈阳理工大学 沈阳理工大学课程设计专用纸 No11 { temp=array[i];array[i]=array[j];array[j]=temp;} } } for(i=0;i

printf(“n SCAN调度结果: ”);for(i=m-1;i>=0;i--){ printf(“%d ”,array[i]);//将数组磁道号从大到小输出 } sum=now-array[0];//计算移动距离 } else if(array[0]>=now)//判断整个数组里的数是否都大于当前磁道号 {

printf(“n SCAN调度结果: ”);for(i=0;i

沈阳理工大学 沈阳理工大学课程设计专用纸 No12 { for(j=l;j>=0;j--){ printf(“%d ”,array[j]);} for(j=r;j=0;j--){ printf(“%d ”,array[j]);} sum=-now-array[0]+2*array[m-1];//计算移动距离 }//磁道号增加方向 } avg=sum/m;printf(“n 移动的总道数: %d n”,sum);printf(“平均寻道长度: %d n”,avg);}

//循环扫描算法

void CSCAN(int array[],int m){ int temp;int k=1;int now,l,r,d;int i,j,sum=0;int avg;for(i=0;iarray[j])//对磁道号进行从小到大排列

沈阳理工大学 沈阳理工大学课程设计专用纸 No13 { temp=array[i];array[i]=array[j];array[j]=temp;} } } for(i=0;i

printf(“n CSCAN调度结果: ”);for(i=0;i

printf(“%d ”,array[i]);//将磁道号从小到大输出 } sum=now-array[0]+array[m-1];//计算移动距离 } else if(array[0]>=now)//判断整个数组里的数是否都大于当前磁道号 {

printf(“n CSCAN调度结果: ”);for(i=0;i

printf(“%d ”,array[i]);//将磁道号从小到大输出 } sum=array[m-1]-now;//计算移动距离 } else { while(array[k]

沈阳理工大学 沈阳理工大学课程设计专用纸 No14 { for(j=l;j>=0;j--){ printf(“%d ”,array[j]);} for(j=m-1;j>=r;j--){ printf(“%d ”,array[j]);} sum=2*(array[m-1]-array[0])-array[r]+now;//计算移动距离 }//磁道号减小方向 else { for(j=r;j

// 操作界面 int main(){ int c;FILE *fp;//定义指针文件

int cidao[maxsize];//定义磁道号数组 int i=0,count;fp=fopen(“cidao.txt”,“r+”);//读取cidao.txt文件 if(fp==NULL)//判断文件是否存在 { printf(“n 请 先 设 置 磁 道!n”);exit(0);} while(!feof(fp))//如果磁道文件存在

沈阳理工大学 沈阳理工大学课程设计专用纸 No15 { fscanf(fp,“%d”,&cidao[i]);//调入磁道号 i++;} count=i-1;printf(“n-------------------n”);printf(“ 10-11OS课程设计--磁盘调度算法系统n”);printf(“

计算机科学与技术二班n”);printf(“

姓名:宋思扬n”);printf(“

学号:0803050203n”);printf(“

电话:************n”);printf(“

2010年12月29日n”);printf(“n-------------------n”);printf(“n 磁道读取结果:n”);for(i=0;i

1、先来先服务算法(FCFS)n”);printf(“

2、最短寻道时间优先算法(SSTF)n”);printf(“

3、扫描算法(SCAN)n”);printf(“

4、循环扫描算法(CSCAN)n”);printf(“ 5.退出n”);printf(“n”);printf(“请选择:”);scanf(“%d”,&c);if(c>5)break;switch(c)//算法选择 { case 1: FCFS(cidao,count);//先来先服务算法 printf(“n”);break;case 2: SSTF(cidao,count);//最短寻道时间优先算法 printf(“n”);break;case 3:

沈阳理工大学 沈阳理工大学课程设计专用纸 No16 SCAN(cidao,count);//扫描算法 printf(“n”);break;case 4: CSCAN(cidao,count);//循环扫描算法 printf(“n”);break;case 5: exit(0);} } return 0;} 6 运行结果

图2—1 运行界面

沈阳理工大学 沈阳理工大学课程设计专用纸 No17

图2—2 运行FCFS的界面

图2—3 运行SSTF的界面

图2—4 运行SCAN的界面

沈阳理工大学 沈阳理工大学课程设计专用纸 No18

图2—5 运行SCAN的界面

图2—6 运行CSCAN的界面

图2—7 运行CSCAN的界面

沈阳理工大学 沈阳理工大学课程设计专用纸 No19 运行结果: 四种磁盘调度运行结果正确,与预期的相符。设计心得

此次操作系统的课程设计,从理论到实践,在两个星期的日子里,可以说是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

本次实验首先要了解磁盘调度的工作原理及四种调度方法的工作原理。在课程设计前的准备工作时,先把这部分工作做完了。在设计总的程序框架的时候,要注意各功能模块的位置,尽量做到简洁、有序;各功能模块与主程序要正确衔接。

在设计的过程中遇到许多问题,我设计的是四种调度算法中的后两种。例如:在最初程序设计时主要有两种构思:1)选用数据结构是链表的。2)选用数组。我最初尝试了用链表,觉得方便易懂,但是在循环扫描处出现了些问题,后来又转变了设计思路,选用了数组,直接进行排序,然后再联系到各功能模块。

同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,自身知识的很多漏洞,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。比如说编语言掌握得不好,应用程序编写不太会……通过这次课程设计之后,一定把以前所学过的知识重新温故。在此,也感谢在课程设计过程中帮我解惑的老师和同学。参考文献

[1] 《操作系统》

人民邮电出版社

宗大华 宗涛 陈吉人 编著

[2] 《C语言程序设计》

清华大学出版社

马秀丽 刘志妩 李筠 编著 [3] 《操作系统实验指导书》 沈阳理工大学

唐巍 菀勋 编著

沈阳理工大学

第五篇:Linux操作系统实习报告

沈阳航空航天大学

Linux系统操作实习报告

院(系):计算机学院 专

业:计算机科学与技术 班

级:84010103 学

号:2008040101061 姓

名:李雪城 指导教师:王越

完成日期:2011年7月22日

7月18日实习内容

今天是Linux的系统操作实习的第一天,感觉它与windows相比有很多不同的地方。Linux是一类Unix计算机操作系统的统称。Linux 是以 Unix 操作系统为原型的多任务、多用户的系统。可运行于多种硬件平台:PC、Alpha、SPARC、POWER PC。

今天实习的主要内容是学习了解Linux的安装过程;Linux登录和退出,熟悉Linux操作系统的图形界面。

(一)Linux的安装过程

1)VMware软件的安装。因为我用的是自己的电脑,所以要先安装VMware软件。这个过程十分简单,下载完毕,直接“Next”即可完成安装。

2)虚拟机的安装。打开VMware软件,单击“新建虚拟机”命令,根据提示选择一种要安装的操作系统,一般选择典型设置,然后直接按“下一步”即可。

3)Red Hat Linux 9.0安装。首先单击“编辑虚拟机设置”,改写镜像为“linux9cd1”,然后返回初始界面。点击“启动该虚拟机”,便进入到软件的安装过程。开始是“欢迎使用Red Hat Linux”界面,然后经历语言选择、键盘配置、鼠标配置、磁盘分区设置、选择软件包组、安装软件包等操作后,便安装成功了。

(二)Linux的登录过程

点击“运行”,便进入到Linux的登陆界面。根据安装过程中输入的用户名以及密码进入系统,进入后发现与windows的差别很多,进而对linux操作系统的界面进行了熟悉。

(三)Linux的退出过程

Linux的退出与windows基本相似。

在安装过程中我遇到一些问题:首先是切换虚拟机与主机。安装软件时,发现在进入虚拟平台后,它会屏蔽掉主机计算机的所有鼠标或键盘操作,通过查看资料,发现按“Ctrl+Alt”组合键即可返回主机系统。然后是虚拟机安装完第一张盘后要进行第二张盘的安装,经过老师的指点,按住“Ctrl+Alt”,将鼠标调出,双击右下方任务栏第一个按钮,依次选择第二、三镜像,继续安装,问题得以解决。

7月19日实习内容

Linux系统操作实习第二天的主要任务为了解一些Linux操作系统命令。首先在虚拟机中打开linux操作系统,然后打开终端。在终端里输入命令,即可完成指令的操作。今天我学到了一些比较基础的Linux操作指令。

(一)有如下指令

关闭重启命令:shutdown、reboot;

目录类命令:cd、mkdir、rmdir、lsmount、umount等; 文件操作类命令:cat、more、less、cp、rm、mv、chmod等; 磁盘操作命令:df、du;

用户管理类命令: useradd、passwd、su、who等; 进程管理类命令: ps、kill、&、df、top等;

网络管理类命令 :ifconfig、ping、netstat、telnet等。

(二)部分指令功能 cat:直接显示文件内容 cp:复制文件。

mv:移动或重新命名文件和目录。

reboot:重新启动计算机,它的使用权限是系统管理者。ls:列出目录内容。pwd:显示当前路径。cd:改变工作目录。mkdir:创建一个目录。rmdir: 删除目录。

今天熟悉了linux的几个基本命令。当我在使用cat命令时,我发现它可以同时查看多个文件,例如输入“cat 文件名一 文件名二”,便可同时查看两个文件。还有在学习cp命令时,发现如果给出的源是一个目录,那么cp将复制该目录下所有的子目录和文件,不过要求目标也是一个目录名;如果源是文件名,目标是目录名的话,那么使用cp命令可以指定多个源文件名。

7月20日实习内容

今天是linux实习的第三天,在昨天的学习过程中我掌握了部分操作系统的基本指令,今天又了解到更多的基本指令。学习到的基本指令有:

mount和umount:挂载、卸载指定的文件系统。useradd:创建一个新的用户。passwd:为用户创建密码。chmod:设定文件或目录权限。rm:删除文件或目录。

find:在指定目录中搜索文件。

ln:链接文件命令是ln命令。该命令在文件之间创建链接。这种操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的名称。

ps:显示当前系统中由该用户运行的进程列表。kill:结束或终止进程。&:后台执行命令。

经过第三天的学习,已经对linux的基本指令有了初步了解。同时还学到了很多访问权限,例如:w 写访问权限,r 读访问权限,x 执行权限,u(文件拥有者),g(所属用户组),o(其他用户)权限。

此外,我还发现在 Red Hat Linux 7 中有许多文字编辑工具,其中最常用的应该是 vi。首先,可以使用命令“vi 文件名”打开一个文件。由于刚开始不太熟练,所以有时忘记在vi后加上文件名,不能运行程序。其次,在刚启动的时候,vi 处于命令状态,不能够输入任何字符。在这个状态下,可以使用方向键进行移动,而需要输入内容时,你需要输入“a”命令进入编辑状态。同时,编辑完成后,需要按下“ESC”键回到命令状态。在命令状态下,可以输入“:q!”不存盘退出,输入“:wq”存盘退出。

7月21日实习内容

今天学习的内容是利用Linux的GCC编辑器、GDB调试器。在Linux下编辑、编译、调试运行C程序。过程如下:

1)在Linux里输入一个程序。首先建立一个文件:#vi a.c。并在其中输入一段C语言代码。

2)输入“gcc a.c”,对程序进行测试。若此代码有错误,则会出现错误提示,输入“vim a.c”,对代码进行修改;若代码无误,则可继续输入下一条语句。

3)然后是使用gdb。但在使用之前,应先载入可执行文件,所以输入“gcc –g a.c-o aaa”指令,然后启动gdb。

4)接下来是gdb对程序的调试阶段。可以输入不同的命令:例如list、next、run、quit、continue、break等操作。部分操作如图所示:

图1 GCC编辑器、GDB调试器的使用

7月22日上机考核内容

1)挂载U盘,命令为: mount –t vfat /dev/sda1 /mnt/usb 2)创建一个目录,并在里面创建一个文件,命令为: mkdir work vi a.c/work 3)创建一个用户,命令为: useradd aaa passwd aaa 输入密码:111 确认密码:111 4)在新用户下新建一个文件,并设置读、写权限,命令为: vi q chmod 666 q 5)删除新用户命令为:dec aaa 6)在目录下创建一个文件并编写一段C语言代码,命令为: vi a.c C语言代码: void main(){printf(“Hello World!”);} 输入完成后保存并退出,即按下esc键后输入:wq 7)用GCC编译生成可执行文件,命令为:gcc –o a a.c 8)运行a,命令为:./a 9)用GDB进行调试,命令为: 显示:list 设置断点在第1行:b 1 运行:r 运行下一行:n 退出:q

心得体会

带着彷徨与紧张的心情,开始了为期5天的Linux操作系统实习。时至今天,实习结束了,原本迷茫与无知,现如今满载而归。因此十分感谢学院给我们提供了这样好的实习环境和各种优越条件,感谢所有的老师对我们的辛勤教导,让我们拥有了如此良好的实习机会。学习的时间虽然短暂,但是我对于linux系统产生了浓厚的兴趣。它让我们开阔了眼界,认识到计算机世界的无限辽阔,还有很多的知识去学习和探索。

实习开始时,Linux操作系统对我来说是一个很陌生的操作系统。起初不太会使用,也没发现它比Windows的优越性,但经过了几天的实习,发现Linux下的编程是比较实用的。并且跟随老师的知识不断练习,开始适应这种操作方式。因为用惯了Windows 各种编译软件,在使用Linux初期,有点不知所措。对我们这些初出茅庐的新手来说简直不知道该怎么办,还好在老师的帮助下,只需要在Linux上利用GCC编辑器、GDB调试器并在这些软件的帮助下便可以对不同的程序进行编辑、编译和调试。即使这样,也是困难重重。在不断的尝试和摸索中,同时在老师的帮助下,终于成功运行程序。

在这些天的学习中,在几位老师的帮助下,我对linux系统有了初步的认识。在第一天学习了VMware软件的安装,并在此软件下安装虚拟机和linux系统。还学会了Linux登录、退出和Linux操作系统的图形界面。在第二天和第三天学习了一些基本的操作指令。在第四天学会了在linux系统下使用GCC编辑器、Gbd调试器。在Linux下编辑、编译、调试运行C程序。

Linux操作系统实习,让我接触了一种全新的事物,走出Windows走进Linux,我感受到了不同操作系统之间的差别和优缺点,让我学到了很多课本上没有的知道的知识。本次实习,不仅使我开阔了视野,拓宽了思路,增长了知识,而且为今后的学习打下了牢固的基础,也增强我对计算机学习的兴趣。

最后感谢给予我帮助的同学们和老师们。

下载操作系统实习报告(磁盘文件操作)(含5篇)word格式文档
下载操作系统实习报告(磁盘文件操作)(含5篇).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    操作系统实习报告样本[五篇范文]

    1 操作系统实习报告内容 基本信息:完成人姓名、学号、报告日期 实习内容 实习目的 实习题目 设计思路和流程图(6) 主要数据结构及其说明(7) 源程序并附上注释......

    网络操作系统实习报告

    广西生态工程职业技术学院信息工程系 课程实习报告书 课 程: 专 业: 年 级: 班 级: 学 号: 姓 名: 网络操作系统 计算机系统维护 2010级 系统101班 11410117 曾令员 信息工程系 20......

    linux操作系统实习报告(定稿)

    linux操作系统实习报告 篇一:linux 实习报告(一).通过综合实训进一步巩固、深化和扩展学生的专业技能。 1.熟练掌握Linux操作系统的安装及基本配置。 2.熟练掌握Linux系统管......

    Linux操作系统实习报告

    Linux系统操作实习报告 院(系): 班级: 学号: 姓名: 实习内容 Linux的系统操作实习的第一天, 尚观科技长期开发高端UNIX/Linux、嵌入式开发、Linux集群、Linux内核、POSIX开发、Ora......

    无盘工作站建立保存文件磁盘方法(推荐)

    一、建立工作站用户共享文件夹: 首先在服务器F盘建一个文件夹以存放工作站的文件,比如“学生作业”,再在里面建立所有工作站的共享目录,有多少台就建多少个目录,文件名为001~00X......

    实验一:磁盘与文件管理

    实验一:磁盘与文件管理 【实训目的】 1.掌握利用 NTFS 文件系统实现磁盘限额 2.掌握利用 NTFS 文件系统压缩数据 3.掌握利用 NTFS 文件系统中的 EFS 加密数据 4.掌握共享文件夹的......

    文件操作通用格式

    文件操作三步骤: 打开文件:Open “文件名” for input/Output/append as #文件号 读取或者写入:主要针对顺序文件的命令. 关闭文件:close 文件号 写文件的通用格式: Open “文件......

    实习报告文件

    顶岗实习报告 在进行2年的理论知识积累之后,要有一个踏入工地进行实践的过程,也就是理论与实践的结合,特别是对于建筑这种实践性能非常强的一门学科更强调实际操作技能的培养。......