文件系统模拟程序 3 任务书
- 格式:doc
- 大小:40.50 KB
- 文档页数:3
实验五文件系统实验一. 目的要求. 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
要求设计一个n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。
二. 例题:设计一个N个用户的文件系统,每次用户可保存L个文件,一次运行用户可以打开S个文件。
程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。
另外,为打开文件设置了运行文件目录,用户已打开文件表UOF.。
为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作算法与框图:因系统小,文件目录的检索使用了简单的线性搜索。
文件保护简单使用了保护码:允许读写执行、对应位为1,对应位为2,和对应位为3。
程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD)打开文件目录(UOF)(即运行文件目录)主文件目录MFD:用户文件目录UFD用户已打开文件表UOF二、实验要求:显示初始的文件目录表、输入的文件操作命令和每条命令执行后的UOF文件,程序运行后打印所有用户的文件目录表。
假定文件系统提供的文件操作有建立文件(CREATE),打开文件(OPEN),关闭文件(CLOSE),读文件(READ),写文件(WRITE)和删除文件(DELETE),在模拟程序中可以从键盘上输入文件操作命令来模拟各用户程序中所调用的各种文件操作,用一个结束命令(end)停止程序执行。
主程序结构流图如下:用输入命令来模拟用户程序中调用的文件操作,这些命令的格式和和要求如下:①建立文件:create(文件名,文件长度,文件属性)②写文件:write(文件名,记录号)有两种情况,第一种是在执行create后要求写,第二种是在执行open 后要求写,即对一个已存在的文件进行修改。
***课程设计报告书所属课程名称操作系统题目模拟文件系统分院**分院专业班级学号学生姓名指导教师2012 年 6 月20 日目录第1章课程设计内容及要求 (3)第2章需求分析 (4)第3章系统设计及实现 (5)第4章课程设计心得 (16)第5章参考文献 (17)第1章课程设计内容及要求课程设计题目:模拟文件系统课程设计内容及要求:通过本次实验,建立一个简单的模拟文件管理系统,理解用户界面和操作模拟管理在操作系统中的作用。
本模拟文件管理系统实现文件的创建、文件的删除、文件目录的创建、删除文件目录、改变目录显示目录等功能。
本次课设由本人独立完成.第2章需求分析该模拟文件系统包括目录文件(简称目录)、普通文件(简称文件),并实现下面一些基本功能:1.改变目录:cd 〈目录名〉,工作目录转到指定的目录下。
cd .. ,返回根目录下2.创建文件:create 〈文件名〉,创建一个指定名字的新文件,即在目录中增加一项,不考虑文件的内容。
3.删除文件:delete 〈文件名〉,删除指定的文件。
4.显示目录:ls [〈目录名〉],显示目录下全部文件和第一级子目录,如果没有指定路径名,则显示当前目录下的内容。
5.创建目录:mkdir 〈目录名〉,再指定路径下创建指定的目录,或者在没有指定路径时,在当前目录下创建子目录。
6.删除目录:rmdir〈目录名〉,删除指定的目录。
7. 获得命令帮助HELP8. 退出文件系统EXIT要考虑的特殊情况:1.各个命令对全路径和相对路径的支持A.目录不存在时,给出错误信息B.不能用cd 进入文件C.相对路径的解析D.路径中的空格剔除2.删除目录或文件时的问题A.删除不存在的文件或目录,给出错误提示B.删除目录时目录不为空; 如果该目录为空,则可删除,否则给出是否做删除,删除操作将该目录下的全部文件和子目录都删除C.进入到某个目录下,却要删除本目录或者上级目录第3章系统设计及实现模拟文件系统处理流程如下:文件系统的几个主要数据结构:<1>索引节点的数据结构:struct inode{struct inode *i_forw;struct inode *i_back;char I_falg;unsigned int I_ino;unsigned int I_count;unsigned int di_addr[NADDR];unsigned short di_number;unsigned short di_mode;unsigned short di_uid;unsigned short di_gid;unsigned short di_size;};<2>超级块的数据结构:struct filsys{unsigned short s_isize;unsigned long s_fsize;unsigned int s_nfree;unsigned short s_pfree;unsigned int s_free[NICPREE];unsigned int s_ninode;unsigned short s_pinode;unsigned int s_inode[NICINOD];unsigned int s_rinode;char s_fmod;};<3>有关目录的数据结构:struct dinode{unsigned short di_number;unsigned short di_mode;unsigned short di_uid;unsigned short di_gid;unsigned short di_size;unsigned int di_addr[NADDR]; };struct direct{char d_name[DIRSIZ];unsigned int d_ino;};struct dir{struct direct ditect[DIRNUM];int size;};主要模块说明<1>创建文件int get_file(int parent,char *file_name)//创建文件节点,成功则返回文件的索引号,失败返回-1{int index;if(search(parent,file_name,1,index)! =-1) //搜索在父目录下是否有同名文件存在,有则创建失败{printf("File name repeated!\n");return -1;}for(int i=0;i<FILE_NUM;i++) //搜索空闲的文件节点if(file_flag[i]==0){strcpy(file[i].file_name,file_nam e);file[i].block_count=0;if(get_block(i)==-1) //给新创建的文件申请磁盘块,如果失败,创建文件将失败{printf("Disk volumn error!\n");return -1;}file_flag[i]=1;fileflag_flag[i]++;//登记并给文件节点初始化file_change_flag[i]++;file[i].file_length=0;file[i].parent=parent;GetLocalTime(&file[i].ctime); //获得当前时间return i;}return -1;}int create_file(int parent,char *file_name) //在指定的目录下创建文件,如果创建成功则返回{//文件的索引号,否则返回-1if(dir[parent].file_count==16) //如果父目录已满,则创建失败{printf("Parent directory is full!\n");return -1;}intpos=get_file(parent,file_name);//开始创建文件if(pos==-1){printf("Create file error!\n");return -1;}dir_node *p=&dir[parent]; //修改父目录的控制信息int top=p->file_count;p->child_file[top]=pos;p->file_count++;dir_change_flag[parent]++;return pos;}int create(char *name) //创建文件的主调函数,前提是已经取得要创建文件的索引{//成功返回文件的索引号,否则返回-1int parent,p=0;parent=get_parent(name,p);if(parent==-1)//找不到父目录,输入错误,创建失败{printf("Path name error!\n");return -1;}returncreate_file(parent,name+p);//开始创建文件}<2>创建目录int create_dir(int parent,char *dir_name) //在指定的目录下创建目录,如果成功则返回目录{//的索引号,否则返回-1if(dir[parent].dir_count==8)//如果父目录已满,则创建失败{printf("Parent directory is full!\n");return -1;}intpos=get_dir(parent,dir_name);//开始创建目录if(pos==-1){printf("Create directory error!\n");return -1;}dir_node *p=&dir[parent]; //修改父目录的控制信息int top=p->dir_count;p->child_dir[top]=pos;p->dir_count++;dir_change_flag[parent]++;return pos;}int md(char *name) //创建目录的主调函数,它的参数只有用户输入{//如果创建成功,则返回目录的索引号,否则int parent,p=0; //返回-1parent=get_parent(name,p);if(parent==-1)//父目录找不到,输入有误,创建失败{printf("Path name error!\n");return -1;}returncreate_dir(parent,name+p);//开始创建目录}<3>删除文件void del_file(int pos) //删除文件,调用该函数的前提是已经取得要删除文件的索引号{return_block(pos);//释放磁盘块file_flag[pos]=0;fileflag_flag[pos]++;file_change_flag[pos]=0;}int del_file(int parent,char *file_name) //在指定的目录下删除文件,删除成功则返回文件的{//索引号,否则返回-1int del_pos,index;if((del_pos=search(parent,file_name, 1,index))==-1)//搜索该文件是否存在,不存在则删除失败{printf("The file to delete not exist!\n");return -1;}del_file(del_pos);//开始删除文件dir_node *p=&dir[parent]; //修改父目录的控制信息if(p->file_count>=2){int top=p->file_count-1;p->child_file[index]=p->child_f ile[top];}p->file_count--;dir_change_flag[parent]++;return del_pos;}int delfile(char *name) //删除文件的主调函数,前提是知道了删除文件的名字{int parent,p=0;parent=get_parent(name,p);if(parent==-1){printf("Path name error!\n");return -1;}return del_file(parent,name+p); }<4>删除目录void del_dir(int pos) //删除指定的目录节点,该目录已经为空{dir_flag[pos]=0;dirflag_flag[pos]++;dir_change_flag[pos]=0;}void del(int pos)//删除一个指定目录及它下面的所有文件及所有目录{for(inti=0;i<dir[pos].file_count;i++)//删除当前目录下的所有文件del_file(dir[pos].child_file[i]);for(i=0;i<dir[pos].dir_count;i++) //删除子目录del(dir[pos].child_dir[i]);del_dir(pos);//删除当前目录}void del_dir(int parent,int del_pos,int index) //在一个指定的目录下删除一个目录及它下面的{//所有文件及所有目录del(del_pos);//开始删除目录if(dir[parent].dir_count>=2)//修改父目录的控制信息{inttop=dir[parent].dir_count-1;dir[parent].child_dir[index]=dir[ parent].child_dir[top];}dir[parent].dir_count--;dir_change_flag[parent]++;}<5>保存文件void savefile(int file_id) //显式保存文件的核心函数{if(fileflag_flag[file_id]%2!=0) //如果创建或删除,需要写回磁盘{write_bit(file_id,1);fileflag_flag[file_id]=0;}if(file_change_flag[file_id]>0) //如果控制信息被修改,需要写回磁盘{ write_inode(file_id,1);file_change_flag[file_id]=0;for(inti=0;i<file[file_id].block_count;i++){inttemp=file[file_id].block[i];if(blockflag_flag[temp]%2!=0) //如果磁盘块被释放或被占用,需要写回磁盘{write_bit(temp,2);blockflag_flag[temp]=0;}}}<6>保存目录void save_dir(int dir_id) //保存空目录函数{if(dirflag_flag[dir_id]%2!=0)//如果删除或创建,需要写回磁盘{write_bit(dir_id,0);dirflag_flag[dir_id]=0;}if(dir_change_flag[dir_id]>0)//如果控制信息被修改,需要写回磁盘{write_inode(dir_id,0);dir_change_flag[dir_id]=0;}}void save(int dir_id) //保存一个目录及它下面的所有目录及文件{//用了递归for(inti=0;i<dir[dir_id].dir_count;i++)save(dir[dir_id].child_dir[i]);for(i=0;i<dir[dir_id].file_count;i ++)savefile(dir[dir_id].child_file[i]) ;save_dir(dir_id);}<7>改变目录void paste(int dir_id) //用于设置当前路径{if(dir_id==0)return;paste(dir[dir_id].parent);strcat(curr_path,dir[dir_id].dir_n ame);strcat(curr_path,"/");}int change_dir(char *name) //改变工作目录,成功则返回该目{//录的索引号,否则返回-1int parent,p=0,pos,index;if(strcmp(name,"/")==0)pos=0;else if(strcmp(name,"..")==0)pos=curr_dir->parent;else{parent=get_parent(name,p);if(parent==-1){ printf("Path name error!\n");return -1;}pos=search(parent,name+p,0,ind ex);}if(pos==-1)//如果该目录不存在,则失败{printf("The dictory not exist!\n");return -1;}curr_path[3]='\0';paste(pos);curr=pos;//改变当前目录及路径curr_dir=&dir[curr];return curr;}<8>显示当前目录下的文件和子目录信息void show_dir(int dir_id) //以下几个函数用于显示当前目录下面的目录和文件,{//跟上面不同的是,它不能显示目录及文件之间的关系,printf("%s",dir[dir_id].dir_name ); //但它可以显示一些细节,如创建时间,文件for(inti=strlen(dir[dir_id].dir_name);i<20;i ++)printf(" ");printf("<DIR>");for(i=25;i<30;i++)printf(" ");printf("%d-%.2d-%.2d%.2d:%.2d:% .2d\n",dir[dir_id].ctime.wY ear,dir[di r_id].ctime.wMonth,dir[dir_id].ctim e.wDay,dir[dir_id].ctime.wHour,dir[ dir_id].ctime.wMinute,dir[dir_id].cti me.wSecond);}void show_file(int file_id) //显示一个文件{printf("%s",file[file_id].file_name); for(inti=strlen(file[file_id].file_name);i<20 ;i++)printf(" ");printf("<FILE>");for(i=26;i<30;i++)printf(" ");printf("%d-%.2d-%.2d%.2d:%.2d:%.2d",file[file_id].ctime.wYear,file[fil e_id].ctime.wMonth,file[file_id].cti me.wDay,file[file_id].ctime.wHour,f ile[file_id].ctime.wMinute,file[file_i d].ctime.wSecond);for(i=0;i<8;i++)printf(" ");int length=file[file_id].file_length; printf("len: %d bytes\n",length);}void show(int dir_id) //显示目录及文件的核心函数,用了递归思想{for(inti=0;i<dir[dir_id].file_count;i++) show_file(dir[dir_id].child_file[i]); for(i=0;i<dir[dir_id].dir_count;i++) show_dir(dir[dir_id].child_dir[i]);}void list() //显示文件及目录的主调函数{show(curr);//该函数的参数表示根目录的索引printf("\n%dfiles.\n",curr_dir->file_count); //统计文件数printf("\n%ddirs.\n",curr_dir->dir_count); //统计目录数}<9>获得系统的命令的帮助void help() //打印命令及解释{printf("Commands:Explanation:\n\n"); printf(" exit -Exit!\n"); printf(" dir -Show files and directories!\n"); printf(" mkf -Create a new file!\n"); printf(" mkd -Create a new directory!\n"); printf(" delf -Delete a file!\n"); printf(" deld -Delete a directory!\n"); printf(" cd -Change the current directory!\n"); printf(" help -Print commands!\n"); }系统实现相关截图:第4章课程设计心得课程设计能反映出一个人的编程的综合能力。
文件管理模拟程序姓名:学号:班级:1.设计目的(1)建立一个简单的模拟文件管理系统。
(2)理解用户界面和操作命令在操作系统中的作用。
2.设计要求需要实现一个命令行操作界面,包含如下命令:1.创建文件功能:创立一个指定名字的新文件,即在目录中增加一项,不考虑文件内容,但必须能输入文件长度。
2.删除文件功能:删除指定的文件3.创建目录功能:在当前路径下创建指定的目录。
4.删除目录功能:删除当前目录下的指定目录,如果该目录为空,则可删除,否则应提示是否作删除,删除操作将该目录下的全部文件和子目录都删除。
5.改变目录功能:工作目录转移到指定的目录下,只要求完成改变到当前目录的某一个子目录下的功能,不要求实现相对目录以及绝对目录。
6.显示目录功能:显示全部目录以及文件,输出时要求先输出接近根的目录,再输出子目录。
对于重名(创建时),文件不存在(删除时),目录不存在(改变目录时)等错误情况,程序应该作出相应处理并给出错误信息。
界面的提示符为#,提示的命令以及调试的方法应和前面的要求一致,可以自己设计更多的命令或者附加功能。
3.环境本实验是在windows xp+vc 6.0环境下实现的,利用windows SDK 提供的系统接口(API)完成程序功能。
在windows xp下安装好VC后进行,VC是一个集成开发环境,其中包含了windows SDK所有工具,所以就不用单独在安装SDK了,程序中所用的API是操作系统提供的用来进行应用程序设计的系统功能接口。
要使用这些API,需要包含对这些函数进行说明的SDK头文件,最常见的就是windows.h。
一些特殊的API调用还需要包含其他的头文件。
4.步骤1.打开VC,选择菜单项File->New,选择Project选项卡并建立一个名为filesys的win32console application工程。
2.在工程中创建原文件filesys.cpp:选择菜单项Project->Add to Project->File,此时将打开一个新窗口,在其中输入想要创建的文件名字,这里是filesys.cpp,在其中编辑好原文件并保存。
中北年夜学之阿布丰王创作把持系统课程设计说明书学院、系:软件学院专业:软件工程学生姓名:xxx学号:xxx设计题目:模拟文件系统的设计与实现起迄日期: 2015年12月28日- 2016年1月8日指导教师:xxx2016 年1月8日1需求分析通过模拟文件系统的实现,深入理解把持系统中文件系统的理论知识, 加深对教材中的重要算法的理解.同时通过编程实现这些算法,更好地掌握把持系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握把持系统结构、实现机理和各种典范算法,系统地了解把持系统的设计和实现思路,并了解把持系统的发展意向和趋势.模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件.2总体设计结合数据结构、法式设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解把持系统.文件的创立: create 文件关闭:close 文件的翻开:open文件的读:read 文件的写:write 文件关闭:close删除文件:delete 创立子目录:mkdir 删除子目录:rmdir列出文件目录:dir 退出:exit#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 //最年夜写入文字长度128KBstruct 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; /*以后打文件的数目*/};管理文件的主要代码:int create(char *name){int i,j;if(strlen(name)>8) /*文件名年夜于 8位*/return(-1);for(j=2;j<MSD+2;j++) /*检查创立文件是否与已存在的文件重名*/{if(!strcmp(cur_dir->directitem[j].name,name))break;}if(j<MSD+2) /*文件已经存在*/return(-4);for(i=2;i<MSD+2;i++) /*找到第一个空闲子目录*/{if(cur_dir->directitem[i].firstdisk==-1)break;}if(i>=MSD+2) /*无空目录项*/return(-2);if(u_opentable.cur_size>=MOFN) /*翻开文件太多*/return(-3);for(j=ROOT_DISK_NO+1;j<DISK_NUM;j++) /*找到空闲盘块 j 后退出*/{if(fat[j].em_disk=='0')break;}if(j>=DISK_NUM)return(-5);fat[j].em_disk = '1'; /*将空闲块置为已经分配*//*-----------填写目录项-----------------*/strcpy(cur_dir->directitem[i].name,name);cur_dir->directitem[i].firstdisk = j;cur_dir->directitem[i].size = 0;cur_dir->directitem[i].next = j;cur_dir->directitem[i].property = '0';/*---------------------------------*/fd = open(name);return 0;}int open(char *name){int i, j;for(i=2;i<MSD+2;i++) /*文件是否存在*/{if(!strcmp(cur_dir->directitem[i].name,name))break;if(i>=MSD+2)return(-1);/*--------是文件还是目录-----------------------*/if(cur_dir->directitem[i].property=='1')return(-4);/*--------文件是否翻开-----------------------*/ for(j=0;j<MOFN;j++){if(!strcmp(u_opentable.openitem[j].name,name))break;}if(j<MOFN) /*文件已经翻开*/return(-2);if(u_opentable.cur_size>=MOFN) /*文件翻开太多*/return(-3);/*--------查找一个空闲用户翻开表项-----------------------*/for(j=0;j<MOFN;j++){if(u_opentable.openitem[j].firstdisk==-1)break;/*--------------填写表项的相关信息------------------------*/u_opentable.openitem[j].firstdisk = cur_dir->directitem[i].firstdisk;strcpy(u_opentable.openitem[j].name,name);u_opentable.openitem[j].size = cur_dir->directitem[i].size;u_opentable.cur_size++;/*----------返回用户翻开表表项的序号--------------------------*/return(j);}int close(char *name){int i;for(i=0;i<MOFN;i++){if(!strcmp(u_opentable.openitem[i].name,name))break;}if(i>=MOFN)return(-1);/*-----------清空该文件的用户翻开表项的内容---------------------*/strcpy(u_opentable.openitem[i].name,"");u_opentable.openitem[i].firstdisk = -1;u_opentable.openitem[i].size = 0;u_opentable.cur_size--;return 0;}int write(int fd, char *buf, int len){char *first;int item, i, j, k;int ilen1, ilen2, modlen, temp;/*----------用 $ 字符作为空格 # 字符作为换行符-----------------------*/char Space = 32;char Endter= '\n';for(i=0;i<len;i++){if(buf[i] == '$')buf[i] = Space;else if(buf[i] == '#')buf[i] = Endter;}/*----------读取用户翻开表对应表项第一个盘块号-----------------------*/item = u_opentable.openitem[fd].firstdisk;/*-------------找到以后目录所对应表项的序号-------------------------*/for(i=2;i<MSD+2;i++){if(cur_dir->directitem[i].firstdisk==item)break;}temp = i; /*-寄存以后目录项的下标-*//*------找到的item 是该文件的最后一块磁盘块-------------------*/while(fat[item].item!=-1){item =fat[item].item; /*-查找该文件的下一盘块--*/}/*-----计算出该文件的最末地址-------*/first = fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZ E;/*-----如果最后磁盘块剩余的年夜小年夜于要写入的文件的年夜小-------*/if(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE>len){strcpy(first,buf);u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;}else{for(i=0;i<(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);i++){/*写一部份内容到最后一块磁盘块的剩余空间(字节)*/first[i] = buf [i];}/*-----计算分配完最后一块磁盘的剩余空间(字节)还剩下几多字节未存储-------*/ilen1 = len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);ilen2 = ilen1/DISKSIZE;modlen = ilen1%DISKSIZE;if(modlen>0)ilen2 = ilen2+1; /*--还需要几多块磁盘块-*/ for(j=0;j<ilen2;j++){for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)/*寻找空闲磁盘块*/{if(fat[i].em_disk=='0')break;}if(i>=DISK_NUM) /*--如果磁盘块已经分配完了-*/return(-1);first = fdisk+i*DISKSIZE; /*--找到的那块空闲磁盘块的起始地址-*/if(j==ilen2-1) /*--如果是最后要分配的一块-*/{for(k=0;k<len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE)-j*DISKSIZE;k++)first[k] = buf[k];}else/*-如果不是要最后分配的一块--*/{for(k=0;k<DISKSIZE;k++)first[k] =buf[k];}fat[item].item = i; /*--找到一块后将它的序号寄存在上一块的指针中-*/fat[i].em_disk = '1'; /*--置找到的磁盘快的空闲标识表记标帜位为已分配-*/fat[i].item = -1; /*--它的指针为 -1 (即没有下一块)-*/}/*--修改长度-*/u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;}return 0;}int read(int fd, char *buf){int len = u_opentable.openitem[fd].size;char *first;int i, j, item;int ilen1, modlen;item = u_opentable.openitem[fd].firstdisk;ilen1 = len/DISKSIZE;modlen = len%DISKSIZE;if(modlen!=0)ilen1 = ilen1+1; /*--计算文件所占磁盘的块数-*/ first = fdisk+item*DISKSIZE; /*--计算文件的起始位置-*/for(i=0;i<ilen1;i++){if(i==ilen1-1) /*--如果在最后一个磁盘块-*/{for(j=0;j<len-i*DISKSIZE;j++)buf[i*DISKSIZE+j] = first[j];}else /*--不在最后一块磁盘块-*/{for(j=0;j<len-i*DISKSIZE;j++)buf[i*DISKSIZE+j] = first[j];item = fat[item].item; /*-查找下一盘块-*/first = fdisk+item*DISKSIZE;}}return 0;}int del(char *name){int i,cur_item,item,temp;for(i=2;i<MSD+2;i++) /*--查找要删除文件是否在以后目录中-*/{if(!strcmp(cur_dir->directitem[i].name,name))break;}cur_item = i; /*--用来保管目录项的序号,供释放目录中-*/if(i>=MSD+2) /*--如果不在以后目录中-*/return(-1);if(cur_dir->directitem[cur_item].property!='0') /*--如果删除的(不)是目录-*/return(-3);for(i=0;i<MOFN;i++) /*--如果文件翻开,则不能删除,退出-*/{if(!strcmp(u_opentable.openitem[i].name,name))return(-2);}item = cur_dir->directitem[cur_item].firstdisk;/*--该文件的起始盘块号-*/while(item!=-1) /*--释放空间,将FAT表对应项进行修改-*/{temp = fat[item].item;fat[item].item = -1;fat[item].em_disk = '0';item = temp;}/*-----------------释放目录项-----------------------*/cur_dir->directitem[cur_item].sign = 0;cur_dir->directitem[cur_item].firstdisk = -1;strcpy(u_opentable.openitem[cur_item].name,""); cur_dir->directitem[cur_item].next = -1;cur_dir->directitem[cur_item].property = '0';cur_dir->directitem[cur_item].size = 0;return 0;}主函数:int main(){FILE *fp;char ch;char a[100];char code[11][10];char name[10];int i,flag,r_size;char *contect;contect = (char *)malloc(MAX_WRITE*sizeof(char));if((fp=fopen("disk.dat","rb"))==NULL){printf("You have not format,Do you want format?(y/n)");scanf("%c",&ch);if(ch=='y'){initfile();printf("Successfully format! \n");}else{return 0;}}enter();print();show();strcpy(code[0],"exit");strcpy(code[1],"create");strcpy(code[2],"open");strcpy(code[3],"close");strcpy(code[4],"write");strcpy(code[5],"read");strcpy(code[6],"del");strcpy(code[7],"mkdir");strcpy(code[8],"rmdir");strcpy(code[9],"dir");strcpy(code[10],"cd");while(1){scanf("%s",a);for(i=0;i<11;i++){if(!strcmp(code[i],a))break;}switch(i){case 0: //退出文件系统free(contect);halt();return 0;case 1: //创立文件scanf("%s",name);flag = create(name);if(flag==-1){printf("Error: \n The length is too long !\n");}else if(flag==-2){printf("Error: \n The direct item is already full !\n");}else if(flag==-3){printf("Error: \n The number of openfile is too much !\n");}else if(flag==-4){printf("Error: \n The name is already in the direct !\n");}else if(flag==-5){printf("Error: \n The disk space is full!\n");}else{printf("Successfully create a file! \n");}show();break;case 2://翻开文件scanf("%s",name);fd = open(name);if(fd == -1){printf("Error: \n The open file not exit! \n");}else if(fd == -2){printf("Error: \n The file have already opened! \n");}else if(fd == -3){printf("Error: \n The number of open file is too much! \n");}else if(fd == -4){printf("Error: \n It is a direct,can not open for read or write! \n");}else{printf("Successfully opened! \n");}show();break;case 3://关闭文件scanf("%s",name);flag = close(name);if(flag == -1){printf("Error:\n The file is not opened ! \n");}else{printf("Successfully closed! \n");}show();break;case 4://写文件if(fd ==-1){printf("Error:\n The file is not opened ! \n");}else{printf("Please input the file contect:");scanf("%s",contect);flag=write(fd,contect,strlen(contect));if(flag == 0){printf("Successfully write! \n");}else{printf("Error:\n The disk size is not enough! \n");}}show();break;case 5://读文件if(fd ==-1){printf("Error:\n The file is not opened ! \n");}else{flag = read(fd,contect);if(flag == 0){for(i=0;i<u_opentable.openitem[fd].size;i++){printf("%c",contect[i]);}printf("\t\n");}}show();break;case 6://删除文件scanf("%s",name);flag = del(name);if(flag == -1){printf("Error:\n The file not exit! \n");}else if(flag == -2){printf("Error:\n The file isopened,please first close it ! \n");}else if(flag == -3){printf("Error:\n The delete is not file ! \n");}else{printf("Successfully delete! \n");}show();break;}}}法式运行截图:4.心得体会在设计的过程中,我查询了很多相关资料,不竭地发现问题、提出问题、解决问题.用C做法式开发语言,让我重新认识了C的基础,在新语言不竭呈现并发展迅速的今天,重新体会到C的基础性、重要性,以及面对过程,面对函数式的编程方式.在对自己所编写的源法式段的纠错的过程中,使我更好的理解了把持系统中文件系统的理论知识,同时在编程时用到了模块化的设计思想,这种编程方法可以使我们的编程更简单,可以使我们的查错与纠错变得更加方便.总的来说通过这次的设计学习使我学到了很多在平时的学习中学不到的很多工具,对把持系统有了更深一层的了解,同时也提高了C语言的能力,由于时间以及个人知识的问题,因此有很多的处所还需要改进.在以后的学习中还要更加努力.。
操作系统课程设计-模拟文件系统班级:计044班姓名:夏鑫学号:2004121228一.实验目的用高级语言编写和调试一个简单的文件系统。
模拟文件管理的工作过程。
加深理解文件系统的内部功能和内部实现。
二.基本要求在任意一个OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟UNIX文件系统。
可以实现下列几条命令FORMAT 初始化MKF 创建文件(给出文件名,文件长度)MKD 创建目录CD 改变当前目录(CD .. 返回根目录)DELF 删除文件DELD 删除目录DIR 显示文件目录(当前目录下)HELP 获得命令的帮助EXIT 退出系统三.设计思想说明1.设计环境课程设计的环境是windows xp sp2操作系统。
在windows系统中创建一个较大容量的文件,作为所设计文件系统的假想的“文件卷”,从而编写各程序模块。
2.开发环境课程设计所使用的开发环境是VC++ 6.03.基本思想以 1M 的存储器空间为例作为文件空间,空间“分块”。
超级块,在最前面,共占3.2k个字节。
其中0.2K个字节存放目录节点的位示图,1K个字节存放文件节点的位示图,2k字节存放盘块节点的位示图。
用位状态='0'表示空闲,状态='1'表示已分配。
后半部用于存放目录接点和文件接点。
超级块不参与文件空间的动态分配。
其他块用于存贮目录接点和文件接点的信息。
该程序在系统盘内自动创建一个目录A :作为该系统的根目录。
四.需求分析该模拟文件系统包括目录文件(简称目录)、普通文件(简称文件),并实现下面一些基本功能:1.改变目录:CD 〈目录名〉,工作目录转到指定的目录下。
CD .. ,返回上一级目录下2.创建文件:MKF 〈文件名〉,创建一个指定名字的新文件,即在目录中增加一项,不考虑文件的内容。
3.删除文件:DELF 〈文件名〉,删除指定的文件。
4.显示目录:DIR [〈目录名〉],显示目录下全部文件和第一级子目录,如果没有指定路径名,则显示当前目录下的内容。
理学院School of Sciences 课程设计报告所选题目:模拟文件管理系统学生姓名:刘宁学生学号:200801055所在班级:08级二班所在专业:信息与计算科学指导教师:段建丽一、课程设计简介1、设计目的:设计和调试一个简单的文件系统,通过模拟文件操作命令的执行,来模拟文件管理对主要文件操作命令的实质和执行过程有比较深入的了解,掌握它们的基本实施方法.2、实验内容:•建立文件存储介质的管理机制•建立目录•文件系统功能(显示目录、创建、删除、打开、关闭、读、写)•文件操作接口(显示目录、创建、删除、打开、关闭、读、写)二、数据结构及算法及结构图1、创建大文件作为虚拟磁盘此部分处于程序初始化阶段,当程序检测到大文件(FileSystem)不存在时调用init.c 文件中的space_aquire()函数创建512*512*512B 的一个大文件,其中最后一个512 为块大小,整个虚拟磁盘一共有512*512 个BLOCK。
创建成功返回0,其中文件指针为外部变量,指向创建的文件。
创建文件即采用创建一个文件,写入512*512 个大小为512B 的块即可得到。
2、初始化super block1)建立空闲盘块分组链接索引结构:在此即涉及到虚拟磁盘块的功能划分,若将磁盘块编号,则下列各区分别占用块数如下管理块结构如下:typedef struct super_block_struct { /*管理块*/f_block block; /*直接管理的空闲块结构*/f_inode inode; /*直接管理的空闲i 结点结构*/ } superB;typedef struct free_block { /*空闲块组*/int s_nfree; /*管理的空闲块数*/int s_free[127]; /*空闲块号栈*/} f_block;其中超块与空闲块结构的关系可用下图表示:所有空闲块看似形成了一个链表,实际上是一个栈,超块直接管理一个空闲块组,每个空闲块组的0 号s_free[0]指向前一组。
一、课程设计名称及题目操作系统课程设计----模拟文件管理系统二、算法思想及功能:编制文件管理模拟程序,进行文件的操作与管理—— “模拟文件管理系统”。
1、采用两级目录进行文件管理,最多支持5个用户。
主目录(MFD ):采用顺序表存储结构,用户文件目录(UFD ):采用链式存储结构。
文件记录采用链式存储结构。
2、采用菜单方式与用户交互,实现文件操作,各菜单具体功能如下:(1)建立文件:在某用户下建立一个或多个文件,文件中可以保存一条或多条记录。
(2)打开文件:打开已经建立的文件,任何文件必须先打开后使用(包括读、写和查看显示),若要打开没有建立文件,返回错误提示。
(3)删除文件:删除已经建立的文件,若文件已经被打开,先关闭再删除。
(4)关闭文件:关闭已经打开的文件,若文件内容被修改,需要保存新的文件内容。
(5)读文件:读某一被打开的文件第Ri 个记录内容。
读出记录后,可以选择对文件记录进行修改或删除操作,也可不做任何改动,直接返回主菜单。
(6)写文件;对打开的文件写入记录数据,包括姓名和性别。
(7)显示目录 :显示用户文件表和打开文件表。
(8)显示文件:显示某一被打开文件的全部记录。
(9)退出操作:退出当前用户,可选择另外一个用户进行操作或者直接退出程序。
3、可反复选择不同用户,针对性实施文件操作程序主要数据结构:主目录 (link f )用户名用户文件目录指针username [ ]next结构体数组程序主要数据结构与函数功能描述:struct linkf{ }; //主目录struct links{ }; //用户文件目录struct linkr { }; //文件——记录类型struct linkt { }; //打开文件表void print1() //显示主目录void print2() //显示当前用户的文件目录void print3() //显示文件内容void pcreate() //建立新文件void popen() //打开文件void pclose() //关闭文件void pdelete() //删除文件void pread() //读文件void pwrite() //写文件void close() //退出某用户操作时,关闭所有打开文件void main() // 主函数三、负责的功能段程序:删除文件部分void pdelete(){p2=ufd;if(p2==NULL){ printf("该用户没有文件,不能删除!\n");return;}printf("输入要删除的文件名:");scanf("%s",X);q3=afd;p3=afd;if(q3!=NULL){while((strcmp(q3->filename,X)!=0)&&(q3->next!=NULL)){p3=q3;q3=q3->next;}if(strcmp(q3->filename,X)==0)//如果在活动文件列表中找到=》从中删除 {if(q3==afd)afd=afd->next;p3->next=q3->next;free(q3);//!!printf("删除前已经将文件关闭\n");}}q2=ufd;while((strcmp(p2->filename,X)!=0)&&(p2->next!=NULL)){q2=p2;p2=p2->next;}if(strcmp(p2->filename,X)==0)//查找和输入文件名相容的链表项{q=p2->headlink;if(q!=NULL){while(q->next!=NULL){p=q;q=q->next;free(p);}free(q);}//p2->headlink=NULL;//while(p2->headlink!=NULL)// {// p2->headlink=p2->headlink->next;// free(p2->headlink);// }if(p2==ufd) ufd=ufd->next;q2->next=p2->next;free(p2);//释放文件记录空间printf("文件已经成功删除\n");}else{printf("该文件不存在,不能删除!\n"); return;}}四、程序流程图:课设个人完成模块需要编制pdelete()函数,相应流程图如下:五、调试运行情况先创建两个用户,1,2;然后显示了MFD中已经有两个用户1和2 了;然后输入对用户1进行操作;先在用户1中创建三个文件;分别取名为a;aa;aaa创建好了之后打开文件a,并且写入学生的纪录还是在文件a 中写入两条新的纪录然后在文件aa中写入新的记录显示操作出错了,因为没有打开文件aa 然后打开文件aa在aa中写入两条记录然后进行读操作选择5 读取文件a 中的第一条记录,并且将记录修改一下;然后看一下7,显示一下用户和文件的目录条件发现在MFD中的长度依旧是0然后将文件aa进行关闭操作想再往文件aa中进行相应的写入新的记录;发现出现了以下的错误操作;所以,要是想进一步进行操作,必须先打开文件aa 这时打开7再看一下发现MFD中aa的长度已经作了相应的修改了现在看下a中具体的记录,选择8然后删除文件aaa发现文件直接删除掉了,不需要打开;再重新创建下文件aaa创建成功再对删除的另一种情况进行操作先打开文件aa发现删除时会显示在删除前已经将文件关闭了然后再删除一个不存在的文件aaaa发现显示的是该文件不存在没有办法删除关闭文件a选择7显示结果:发现aa 删除之后的文件的空间已经释放了。
实验三文件管理
专业:计算机科学与技术班级: 1班学号: 122 姓名:
实验地点:工A207 实验时间: 2012-11-23 指导教师:
一、实验目的
通过调试并运行一个简单的文件系统来模拟文件操作命令的执行、模拟文件管理,使学生对主要文件操作命令的实质和执行过程有比较深入的了解,掌握它们的基本实施方法。
二、实验环境
具备Windows或MS-DOS操作系统、带有Turbo Pascal 集成环境的PC机。
三、实验内容
一.阅读实验程序
文件管理模拟程序代码见【实验例程】。
二.编译实验例程
用Turbo Pascal 编译实验例程。
三.运行程序并对照实验源程序阅读理解实验中输入、输出的意义。
四、实验记录
1.实验目录
2.create
3.open
4.close
5.delete
6.driectory
User
main
五、思考题
1、该文件模拟系统目录结构的特点?
答:模拟二级目录结构的特点
2、该文件模拟系统支持几个用户?
答:最多5个用户
3、主文件目录、用户文件目录、活动文件目录的目录项有哪些?
答:主文件目录: user_name,file_number
用户文件目录:filename,protection code ,length
活动文件目录:
4、设置数据域pcode的目的是什么?请说明如何发挥它的作用?
答:用于访问控制。
5、描述文件管理主控程序的算法(流程图或N-S图)。
答:
六、实验小结
答:学习了模拟文件管理系统的二级系统结构,文件的建立查看等。
文件系统实验说明书(含代码).摘要本程序将模拟一个很简单的文件系统,实现对文件的管理和控制功能,文件系统向用户提供了一整套的文件体统调用命令,在用户程序中用户可通过使用文件系统提供的一系列命令对文件进行操作。
其功能对文件的增加、删除、显示、修改,以及对文件目录的查询(显示)、改变、创建、删除、等操作文件采用的物理结构为连续。
程序是采用二级文件目录。
(即设置主目录(MFD)和用户文件目录(UFD)。
另外,为打开文件设置指针。
为了方便实现,对文件的读写作了简化。
在执行读写命令时,只需改读写指针。
并不进行实际的读写操作。
关键词:文件系统文件指针模拟管理信息正文1.设计思想程序是采用二级文件目录。
(即设置主目录(MFD)和用户文件目录(UFD)。
另外,为打开文件设置指针。
为了方便实现,对文件的读写作了简化。
在执行读写命令时,只需改读写指针。
并不进行实际的读写操作。
框图如下:(用户“1”文件目录)(用户目录) 1 文件名保护码文件长度文件指针MFD 2用户1(名字) 3用户2 4用户3 5用户4 678910(用户“2”文件目录)1 文件名保护码文件长度文件指针2345678910图1 目录框图实验开始,先进入MFD表,初值为空。
输入用户名字,需要保存用户名字,同时也有了有个新文件目录表。
接着是文件的一系列的基本操作:1、打印所有文件名。
2、打开一个文件。
3、添加一个文件。
4、删除一个文件。
5、改文件的保护码。
6、写文件。
7、读文件。
8、退出。
2. 函数调用关系图:图2 流程图在MFD 中找到该用户输入用户名开始输入操作命令初始化运行文件表AFD显示该用户目录表UFD 中的所有文件是什么命令打开全部文件打开一个文件创建一个文件删除文件读文件写文件改变保护码退出结束3.算法用到的主要数据结构//结构体,用户变量struct user {char name[10];}user[10];//结构体,文件变量struct link {struct file {char name[10]; //文件名int lenght; //文件长度int write; //读文件int read; //写文件int exe;}file[10];int used;}link[10];4.相关的各模块的伪码算法检测用户函数checkuser(){for(int i=0;i<10;i++){s=strcmp(“cin<<name”,);< p="">if(s==0) return i;}建立用户函数createuser(){strcpy(,”cin<<name”);< p="">link[in].used=0;in++;}打开所有文件openall(){If :file p==0 ,file is empty;else :{cout<<"文件名读保护写保护执保护"<<endl;< p="">cout<<、、、、、、、、、相、、、、、、、、关、、、、、、、、、值、、、、、、、、}}打开单个文件openfile(){ if :cin>>name;int i=find();cannot find;file not existelse :{cout<<"文件名读保护写保护执保护文件长度”<<endl;< p=""> cout <<、、、、、、相、、、、、、、、关、、、、、、、、、、、值、、、、、、、、、、、} }建立文件createfile(){cin>>file name;write=0;read=0;exe=0;lenght=0;}删除文件deletefile(){ cin>>file nameUse function find()If cannot find;cout<<"此文件不存在!";else {deletefile and some filepointers; }写文件write(){ cin>>file nameFunction find();If:cannot findcout<<"此文件不存在!";else :{cin>>lengthfile.lenght+=l;}}读文件 read(){ cin>>file name;Function find();If :cannot findcout<<此文件不存在!else :{cout<<文件已经打开cout<<"文件长度为:file.length }}查找 find(){for(int i=0;i<10;i++){a=strcmp(“cin <<name”,);< p="">if :a=0 ,return i;}}5.调试分析调试中遇到的问题及对问题的解决方法:由于文件管理系统相对于本人来说不是那么容易就可以轻易实现的,在设计之前,我先做了些准备工作,首先设计在实现程序中要用到的数据结构模型,使用了结构体数据结构,然后将各个功能模块化,依次编写,调试。
操作系统大型试验实验报告姓名:XX班级:软件工程110x学号:201126630xxx一、名称操作系统大型试验。
二、目的用C++编写出一个简单的模拟文件系统,实现目录的添加、删除、重命名,文件的添加、删除、重命名、文件和目录、文件的拷贝。
三、要求开发工具:word,vc win32api1.设计和实现一个简单的文件系统,要求包括目录、普通文件和文件的存储2.文件系统的目录结构采用类似Linux的树状结构;3.要求模拟的操作包括:a)目录的添加、删除、重命名;b)目录的显示(列表)c)文件的添加、删除、重命名d)文件和目录的拷贝4.用户进入时显示可用命令列表;用户输入help时显示所有命令的帮助文档;输入某个命令+?时显示该条命令的使用说明5.用户输入exit时退出该系统6.实验实现基于windows平台;7.实验开发语言可以选用C/c++等四、设计1.主要思路说明本模拟系统通过一个大小固定的数组要代表物理盘块,假设共有1024块,新增目录占一块,新增文件占一块,文件中可输入内容,内容假设定义为5个字符占一块,超出则应新申请空间。
模拟物理盘块的数组中,数组内容为-99代表改物理盘块内容为空,可使用,其他数字均代表该物理盘块被占用,其中-3代表是占用文件的末结点,其他整数代表是文件内容的下一个寻址下标,另有一个string类型的数组来存储内容,模拟文件写入了对应下标的物理盘块中。
设置了一个全局指针指向根结点,一个全局指针指向当前操作目录。
搜索空白物理盘块时采用顺序搜索物理盘块数组。
存储形式主要采用类似二叉树结构,如目录为根,目录下的第一个文件或目录存在根的子节点,目录下的其他文件或目录存在第一个文件或目录的兄弟节点,以此类推。
本程序仅seperate()函数使用现成代码,此函数功能为将输入命令串分离,仅仅起到美观作用,其余所有代码均为原创!2.申优功能:1)能实现动态增长,即当输入文件的内容大小大于分配的模拟物理盘块时系统能够自动寻找空物理盘块并分配,将超出的内容保存在新的物理盘块中,若超出模拟磁盘大小,则超出部分不保存且返回提示。
目录第1章需求分析…….......... ............... j…第2章概要设计…………..................... ……系统的主要功能……… …............... .1 •…系统模块功能结构……........ ....... .. 1•…运行环境要求… …....... ........... :;2数据结构设计… …....... ......... ::…•“2第3章详细设计…………....... ............... 3•…模块设计.... ….... ............. .:“吒...算法流程图.... .................. :: ....... 3 ....... 第4章系统源代码................... .............. 4...第5章系统测试及调试............ . (4)运行结果及分析... …...... ....... .•:..... -4 系统测试结论.. . …............... :: .... 5 ....... 第6章总结与体会…………....... .............. 6…第7章参考文献…………....... ............... 6•…附录.7第1章需求分析通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识,加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,并了解操作系统的发展动向和趋势。
模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。
第2章概要设计系统的主要功能1)系统运行时根据输入的用户数目创建主目录2)能够实现下列命令:Login用户登录Create建立文件Read Write 读取文件写入文件Delete删除文件Mkdir 建立目录Cd 切换目录Logout退出登录运行环境要求操作系统windows xp ,开发工具vc++数据结构设计用户结构:账号与密码结构typedef struct users{char name[8];char pwd[10]; }users;本系统有8 个默认的用户名,前面是用户名,后面为密码,用户登陆时只要输入正确便可进入系统,否则提示失败要求重新输入。
操作系统原理课程设计任务书
学院名称:数学与计算机学院课程代码:_8404061_
专业:年级:
一、设计题目
文件系统模拟程序
二、主要内容
设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。
三、具体要求及应提交的材料
程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。
另外,为打开文件设置了运行文件目录(AFD)。
为了便于实现,对文件的读写可作简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。
算法与框图:
因系统小,文件目录的检索使用简单的线性搜索。
文件保护简单使用三位保护码即可:允许读写执行、对应位为1,反之则为0。
程序中使用的主要设计结构如下:
主文件目录和用户文件目录(MFD、UFD)
打开文件目录(AFD)(即运行文件目录)
课程设计要求:
1.分析设计要求,给出解决方案(要说明设计实现所用的原理,采用的数
据结构);
2.画出程序的基本结构框图和流程图;
3.对程序的每一部分要有详细的设计分析说明;
4.程序执行的每个步骤要有具体的提示内容或输出;
5.源代码格式规范,注释不少于三分之一;
6.设计合适的测试用例,对得到的运行结果要有分析;
7.设计中遇到的问题,设计的心得体会。
设计结束后,每位同学必须上交如下材料:
1.《课程设计说明书》打印稿一份;
2.《课程设计说明书》电子文档及课程设计的程序源代码刻盘
四、主要技术路线提示
首先选择自己熟悉的程序设计语言,然后分析问题,画出流程图,再进行详细编码,实现相应的功能。
最后要对软件进行测试。
五、进度安排
共计2周时间,20个机时,建议进度安排如下:
1. 选题和需求分析2学时
2. 查阅资料(图书、期刊资料或上网查阅相关资料) 2学时
3. 构造框架(系统结构设计) 1.5学时
4. 编程上机,调试9学时
5. 现场验收(根据程序提问)0.5学时
6. 书写课程设计报告5学时
当然,仅靠课内时间是不够的,希望同学们课外多花时间编程学习。
六、推荐参考资料(不少于3篇)
1.张尧学等编著. 计算机操作系统教程.北京:清华大学出版社,2006.02 2.汤子瀛等编著.计算机操作系统.西安:西安电子科技出版社,1996.12 3.陈向群编著.操作系统教程.北京:北京大学出版社,2007.01
4.罗宇等编著.操作系统课程设计.北京:机械工业出版社,2005.9
指导教师签名日期年月日
系主任审核日期年月日。