《操作系统原理》课程设计报告姓名:班级:学号:指导老师:年月日目录一、《操作系统原理》课程设计的目的与要求.............................................................................11、目标:.................................................................................................................................12、要求:.................................................................................................................................1二、简述课程设计内容、主要功能和实现环境...........................................................................21、主要功能:.........................................................................................................................22、主要设计内容:.................................................................................................................23、运行环境:.........................................................................................................................2三、任务的分析、设计、实现和讨论...........................................................................................31、任务的分析.........................................................................................................................32、任务的设计与实现(分别给出系统总控和本人负责实现的算法流程图与说明).....43、操作过程和结果分析.........................................................................................................74、思考题的解答和讨论.......................................................................................................11四、《操作系统》课程设计小结(收获、不足与建议)...........................................................12五、附录(主要源程序和运行结果的清单)..................................................................................131一、《操作系统原理》课程设计的目的与要求1、目标:随着社会信息量的极大增长,要求计算机处理的信息与日俱增涉及到社会生活的各个方面。因此,文件管理是操作系统的一个极为重要的组成部分。学生应该运用独立的高级语言来编写一个简单和可操作的文件操作系统,模拟文件管理的工程运作。从而对各种文件操作指令的实质内容和过程原理有比较深刻的了解,掌握他们的实施方法加深理解课堂上讲授过的知识。我小组需要实施的文件管理是任务六,包括文件系统的:建立,关闭以及写的功能。2、要求:(1)设计一个多(n)用户的文件系统,每个用户户最多保存m个文件。(2)限制用户在一次运行中只能打开一个文件。(3)系统应能检查打入命令的正确性,出错是要能够显示出错的原因。(4)对文件的权限必须有保护措施,如果只能运行,允许读,允许写等。在每次打开文件时,根据本次打开的要求,设置保护级别,即可有二级保护。(5)对文件的操作表述中必须有以下指令:建立:create()删除:delete()打开:open()关闭close()读:read()写:write()2二、简述课程设计内容、主要功能和实现环境此次实验的基本内容就是完成一个可执行的文件系统管理的操作系统。1、主要功能:一个由10个用户的操作系统,每个用户最多保存10个文件,一次运行中用户可打开5个文件。系统对相应的操作判断操作性的正确与否并进入相应的菜单运行。为使用者提供了操作的方便,不需要敲代码来实现程序的功能。该程序设置了用户登入,创建文件,打开文件,关闭文件,写文件以及对用户文件总体概况的结果显示。另外,为了更加真实的反应该系统的对文件可执行程度的判断,添加了保护码控制文件的读写操作的安全性。2、主要设计内容:(1)本实习设计一个10个用户的文件系统,每个用户最多可保存10个文件,每个文件名都为单个字符,一次运行中用户可打开5个文件。(2)程序采用二级文件目录,即设置了主文件目录(MFD)和用户文件目录(UFD)。前者应包含文件主(即用户)及他们的目录区指针;后者应给出每个主文件占有的文件目录,即文件名,保护码,文件长度以及他们存放的位置等。另外为打开文件设置了运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。(3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只修改读写指针,并不进行实际文件的读写操作。3、运行环境:课程设计的实现环境是在WINXP\2000下运行MicrosoftVisualC++和在WINXP\2000下运行WORD2003。3三、任务的分析、设计、实现和讨论1、任务的分析(1)、整个源程序采用一维数组来定义。用户登录采用最简单的选择型,总共设置10位用户,登陆即选择相对应的用户名。文件目录的检索是使用了简单的线性搜索,而没有采用哈希等有效的算法。该设计的程序的保护码形式采取简单的单字符,分为3种,其中分别是0-只可读,1-只可写,2-可读写。另外对于文件打开与关闭的操作设置了单字节的标识符有,0-文件已关闭,1-文件未关闭。(2)、整个程序的布局应该是有7个函数,分别为Incitialize()初始化函数,create()建立文件函数,open()对文件的打开函数,close()对文件的关闭函数,write()对文件的写函数,Show()显示概况信息的函数和main()主函数。每个函数都是实现改程序的重要环节。创建文件函数决定了整个程序的关键它需要准确的定义与算法。在定义函数时定义结构体,把需要的变量定义完整,整个程序主要还是通过数组的运用来完成的。通过数组来衔接主目录和用户目录来执行之后的操作。(3)、主文件目录与用户目录的结构图如下图1-1:图1-1文件系统目录结构图(4)、打开文件目录如下图图1-2所示:图1-2打开文件目录图打开文件号打开保护码读写指针UFDMFD用户名文件目录指针用户名文件目录指针用户名文件目录指针…文件名保护码文件长度文件名…文件名保护码文件长度文件名…42、任务的设计与实现(分别给出系统总控和本人负责实现的算法流程图与说明)(1)、在编译程序实现功能的任务中,我主要负责最初的结构体定义,对关键变量的初始化以及对全程序的修改及完善。定义结构体以及变量是程序的开头,也是关键因素之一,对程序编译时所采用的算法进行了决定性作用。(2)、定义的结构体以一维数组的形式定义,便于组员之间相互理解与编译。结构体定义:a、Mfd用户目录对象名类型说明username[9]Char型数组用户名CountInt对用户数的计数器UfdUFD[Filenum]文件结构体数组文件目录数组MfdMFD[Usernum]数组用户数的数组b、Afd文件目录文件打开目录对象名类型说明OpenNoInt打开文件号ProInt保护码AfdAFD[Opennum]数组打开文件数c、Ufd文件目录对象名类型说明FilenameChar文件名Proint文件保护码Lengthint文件长度FlagInt文件打开标识号AfdAFD[Opennum]数组打开文件数UfdUFD[Filenum]数组文件数量(3)、初始化定义:inti,j=0;两个变量分别代表MFD和UFD中所指的当前位置MFD[i].UFD[j].filename=NULL;文件名设为空MFD[i].UFD[j].flag=0;打开标识符为关闭MFD[i].UFD[j].length=0;长度为0MFD[i].UFD[j].pro=3;保护码不存在MFD[i].UFD[j].AFD-OpenNo=0;打开目录号为0(4)、操作模拟流程:5(5)、详细说明:在设计方面,是按数组套数组的思想进行定义。即Mfd数组中套Ufd数组,再Ufd数组中套Afd数组。这样不需要指针的定义,也能很有效的找到用户所对的文件以及文件和所对的文件打开号。但是这样也有缺陷,需要定义很大的数组容量,占用了很多空间,另外,因为定义的是字符型而没有定义字符型数组,导致对于文件名的定义执行和输出只能实现单字节。(6)、总体设计概要:a、结构体定义完成后,将定以后的变量以及数组等信息放入各个函数进行编译操作,做为最主要的开头核心函数Create()创建文件函数,编译者按照定义的结构体把要求的3位安全码改成了1位,由“0-2”三个数字实现对文件的读写操作的保护,同时用了多个循环体来对操作者可能出现的误操作做了相应合理的处理,另外,“MFD[k].UFD[i].AFD[i].OpenNo=count++;”对打开函数中打开号的处理也提前完成。Create的返回值为“returncount;”的值要在打开函数中赋值给打开号。Open和Close函数由另一位成员完成,其中Open()打开函数按照要求进行,一个循环体“while(iFilenum)”打开文件“MFD[k].UFD[i].flag=1;”为标识码的设置,初始为0现在打开后改为1。Close()关闭函数中“if(MFD[k].UFD[i].flag==1”判断标识码,“MFD[k].UFD[i].flag=0;”文件关闭后将标识码的值改为”0”。我和另一位成员一起完成write()写文件函数的编译,“MFD[k].UFD[i].pro==1||MFD[k].UFD[i].pro==2”和“if(MFD[k].UFD[i].flag==1)”;两句判断语是否可写入和是否文件已经打开将保护码和标识码的作用发挥出来,并且写函数添加了将文件长度增加的功能“length=len+MFD[k].UFD[i].length;”Show()显示信息函数将之前保存的信息输出,以简明概要的输出该文件管理系统对文件操作后的信息,Show()函数主要需要之前函数的保存工作,之前函数编辑成员未能将内容保存在各自的函数中,在之后的修改中得以实现,Write函数中对长度的保存:“MFD[k].UFD[i].length=length;”Create函数中对文件名的保存:“MFD[k].UFD[i].filename=name;”对保护码的保存:“MFD[k].UFD[i].pro=pro;”对长度的保存:“MFD[k].UFD[i].length=length;”打开码的保存:“MFD[k].UFD[