您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 模拟文件管理和进程调度的仿真操作系统设计
UNIX操作系统设计-1-模拟文件管理和进程调度的仿真操作系统设计1.总体设计根据要求,该仿真操作系统主要实现了对于文件管理和进程调度的模拟。由于是一个虚拟的操作系统,因此所有的操作和功能都在内存中实现,力图集中反映出这两个模块最本质的东西。该仿真系统以命令行作为人机交互的接口,设计了一些简单的命令实现了用户对文件和进程的有效管理。最后以一个写文件进程的例子将两个模块联系起来,构成一个有机的整体。整个仿真系统分为文件子系统和进程管理子系统两个主要部分。2.文件子系统设计文件子系统采用树形结构,存储为儿子—兄弟的形式,包括对文件或目录的创建、删除、查看等操作。2.1.文件结构文件的类型分为两种:常规文件和目录。目录可以进入,并且还可以在其下面继续创建文件;而常规文件则不允许,它们只能作为整个文件系统树的叶子。每个文件以树中结点的形式存在于文件系统中,而在程序里则用结构体来加以定义,各个结构体之间再用指针相互串联从而构成一棵文件系统树。其中表示文件结点的结构体定义如下:structfile{charfile_name[20];structtimecreat_time;charfile_type;charcontent[MAX_FILE_SIZE];charstate;structfile*child;structfile*brother;structfile*parent;};其中file_name成员是一个字符串数组,保存文件名;creat_time成员是一个时间类型变量,保存文件的创建时间;file_type成员表示文件类型,有两种取值,DIRECTORY(目录)或REGULAR_FILE(常规);content成员是一个字符串数组,用来模拟文件的内容,初始值为空,用户可以创建写文件的进程向常规文件中添加内容,对于目录来讲,该成员为空且不能被赋值。state成员表示该文件的状态,包括OK、WR和NO三种状态,分别表示文件内容已经写入完毕、正在向文件写入内容和该文件是目录或从未被写入的常规文件三种情况。child、brother和parent成员是三个指向该结构体的指针,分别指向给定结点的第一个孩子、第一个右兄弟和父亲结点,对于常规文件,child成员为空。当程序开始运行时,将整个文件系统树初始化为一个文件名是”root”的根目录结点。2.2.相关命令格式及其实现该系统为文件操作设计了创建、删除、查看、进入等命令,实现了对文件子系统的有效管理。下面对文件操作命令的格式及其主要的函数实现加以介绍。UNIX操作系统设计-2-名称:mkdir/mkfile功能:创建目录/常规文件格式:mkdir/mkfile…/…/FileName描述:该命令用函数structfile*mkfile(structfile*,char*,char)来实现,使用该函数前先用structfile*get_upper_dir(structfile*,char*,char*)函数获得欲创建文件的上级目录地址,然后将该地址连同文件名、文件类型一起作为参数调用mkfile()。函数首先查找该目录下有无同名同类型的文件,如有,返回错误信息,如没有则创建新的文件结点并赋值,然后插入到该目录下,返回新建文件的指针。举例:rootmkdirmydir——在当前目录(root)下创建名为mydir的目录rootmkfileroot/mydir/myfile——在目录”root/mydir/”下创建名为myfile的常规文件,前提是”root/mydir/”目录存在mydirmkfile../myfile——在当前目录(mydir)的上级目录下创建名为myfile的常规文件mydirmkdirmydir1/mydir2——在当前目录(mydir)下的mydir1目录下创建名为mydir2的目录名称:rmdir/rmfile功能:删除目录/常规文件格式:rmdir/rmfile…/…/FileName描述:该命令用函数voidrmfile(structfile*,char*,char)来实现,使用前同样先获得欲删除文件的上级目录地址,然后将该地址连同文件名、文件类型一起作为参数调用rmfile()。函数首先查找该目录下有无同名同类型的文件,如没有,返回错误信息,如有则删除该文件结点。举例:与创建文件类似,在此不赘述。名称:cd功能:进入指定目录格式:cd…/…/DirectoryName描述:该命令用函数voidcd(structfile**,structfile*,char*)来实现,使用前先获得欲进入目录的上级目录地址,然后将该地址连同当前目录地址的地址以及目录名作为参数调用cd()。函数先查找该目录下有无同名目录,如没有,返回错误信息,如有则修改当前目录的地址。举例:rootcdmydir——进入当前目录(root)下的mydir目录mydircd..——返回当前目录(mydir)的上一级目录mydircdroot/mydir1/mydir2——进入”root/mydir1/mydir2”目录mydircdmydir1/mydir2/mydir3——进入当前目录(mydir)下的”mydir1/mydir2/mydir3”目录名称:ls功能:查看当前目录下的所有文件UNIX操作系统设计-3-格式:ls描述:该命令用函数voidls(structfile*)来实现。首先获取当前目录的指针,然后打印其儿子结点,再依次打印儿子结点的右兄弟结点,直到右兄弟结点为空。举例:略。名称:cat功能:查看指定目录下常规文件的内容格式:cat…/…/RegularFileName描述:该命令用函数voidcat(structfile*,char*)实现,使用前先获得欲查看文件的上级目录地址,然后将给地址连同文件名作为参数调用cat()。函数先查找该目录下有无同名常规文件,如没有,返回错误信息,如有则打印该常规文件的内容。举例:略。3.进程管理子系统设计进程管理子系统采用链表来处理进程队列,进程调度使用时间片轮转和优先级相结合的策略,包括进程的创建、删除和查看等操作。3.1.进程结构一般来讲,不同的进程有不同的功能,但为了说明问题的需要,该仿真系统只设计了一种写文件的进程。每个进程以结点的形式存在于进程管理系统中,而在程序里同样用结构体来加以定义(类似于UNIX操作系统中的PCB),各个结构体之间再用指针相互串联从而构成进程链表。其中表示进程结点的结构体定义如下:structprocess{charname[20];unsignedcharid;unsignedshortpriority;unsignedshortinit_priority;unsignedshorttotal;shortrest;unsignedshortstart;unsignedcharwrite_progress;structfile*fp;unsignedcharfinish_ratio;structprocess*next;};其中name成员是一个字符串数组,用于保存进程名;id成员保存进程id,每当一个进程被创建时,系统自动为它分配一个唯一的id;priority表示进程的优先级,该优先级随时间发生变化;init_priority成员表示进程的初始优先级,在进程被创建时由用户指定,并贯穿进程运行的始终;total成员用来表示该进程欲向常规文件中写入数据的总数;rest成员表示进程还未写入数据的数量;start成员表示进程每次写文件的起始位置;write_progress成员表示进程在每个时间片内能够写入数据的数量,在进程创建时被随机赋予1~11之间的值;fp成员是指向欲写常规文件的指针,在进程创建时自动在根目录下创建名为”file_”+”进程名”的常规文件,并将地址赋予fp,以后该进程将向相应的UNIX操作系统设计-4-常规文件中写入数据;finish_ratio成员表示进程的完成百分比;next成员指向等待队列中的下一个进程结点。3.2.进程管理和调度策略该仿真系统的进程通过创建专门的线程来进行管理,因此可与文件操作并行工作。进程调度采用时间片轮转结合优先级的调度策略。进程在创建时先产生一个进程结点,并由用户指定进程名、初始优先级以及欲写入的数据总数,然后根据优先级从大到小的顺序插入等待进程链表中。系统首先从链表的头部取下一个进程加以处理,进程向相应的常规文件写入一定量的数据后,令rest=rest-write_progress,并将等待队列链表中所有进程的priority加1,然后判断rest值是否大于零,若是则置优先级为初始优先级并根据优先级大小插入等待队列链表中,然后继续取队列的头部结点来处理;若否则直接取队列的头部结点。流程图如下:图1进程调度流程图3.3.相关命令格式及其实现该仿真系统为进程管理操作设计了创建进程、删除进程和查看进程等命令,实现了对进程的有效管理。下面对进程管理操作命令的格式及其主要的函数实现加以介绍。开始进程队列是否为空取头结点start成员是否为0更改进程优先级和完成比,根据优先级插入进程等待队列rest成员是否>0向相应文件写数据并更改rest更改文件状态OK,进程数减1root下创建文件并返回指针是否是是否否UNIX操作系统设计-5-名称:createpro功能:创建进程格式:createproProcessNamePriorityTotal描述:以等待进程队列链表头为参数,调用voidcreatepro(char*,unsignedshort,unsignedshort,structprocess**)函数创建进程,将用户指定的进程名、初始优先级和欲写入数据总数赋予进程结构体,赋予进程id,随机生成进程的write_progress,在根目录下创建文件并返回指针,最后插入等待进程队列链表中。举例:createpromypro20100——创建一个名为mypro的进程,其初始优先级为20,欲写入数据总量为100,同时在root目录下创建一个名为file_mypro的常规文件名称:deletepro功能:删除指定进程格式:deleteproProcessID描述:以进程id和等待进程队列链表头为参数,调用voiddeletepro(unsignedchar,structprocess**)函数从进程等待队列中删除指定id的进程,如果不存在此进程,则返回错误信息。举例:deletepro2——删除id号为2的进程名称:ps功能:列出当前等待队列中的进程以及进程总数格式:ps描述:以等待进程队列链表头为参数,调用voidps(structprocess*)函数,打印出从等待进程队列链表头开始的所有进程。举例:略。4.操作实例运行系统,首先在根目录下创建两个目录doc、music和一个常规文件sys.txt;然后进入doc目录,在此目录下创建study目录;再进入study目录,在此目录下创建course.doc文件,同时在root/music/目录下创建love.mp3文件;进入root/music/目录,删除love.mp3文件,同时删除root/doc目录;并返回根目录。创建四个进程p1~p4,不断查看各个进程的排队状态,以及根目录下由进程所创建的文件的状态;根据进程p2的id,删除此进程,查看根目录下的文件,该进程所对应的文件file_p2也被同时删除;当进程p4结束时,根目录下常规文件file_p4状态显示OK,使用cat命令查看文件,显示进程p4刚刚写入的100个字节的数据。当所有进程结束时,查看进程,显示当前进程数为0,根目录下由进程所创建的文件状态均显示OK。退出系统。5.结论该仿真系统在linuxRadhat9.0kernel-2.4.20下调试通过。实验证明该系统能够较好的完成文件子系统和进程管理子系统的仿真工作,不仅体现了这两个模块的本质属性,而且具有比较完整的功能和友好的人机交互接口。但由于时间和设计者水平的限制,还有诸如命
本文标题:模拟文件管理和进程调度的仿真操作系统设计
链接地址:https://www.777doc.com/doc-3130408 .html