搜档网
当前位置:搜档网 › 操作系统课程设计报告

操作系统课程设计报告

操作系统课程设计报告
操作系统课程设计报告

《操作系统课程设计》

报告

专业班级:计科1106班

姓名:李育洪、胡壮

刘春林、邓程峰

指导老师:李玺

设计时间:2014年6月

目录

第一章概论 (3)

第二章设计的基本概念和原理 (4)

第三章总体设计 (6)

第四章详细设计 (8)

第五章系统的测试和运行 (18)

第六章系统的使用说明 (20)

第七章课程设计总结 (21)

第八章参考资料 (22)

第一章概论

1.1课程设计的内容

本次课程设计我们是四个人的小组,我们选择的是第三个题目,题目的描述如下:

在uC/OS操作系统中增加一个简单的文件系统, 要求如下:

(1)熟悉并分析uc/os操作系统

(2)设计并实现一个简单的文件系统

(3)可以是存放在内存的虚拟文件系统,也可以是存放在磁盘的实际文件系统

(4)编写测试代码,测试对文件的相关操作:建立,读写等

1.2课程设计的目的

操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统开发的基本技能。

1.3要解决的主要问题

通过对题目的分析,以及对相关资料的查阅,我们决定为μC/OS-II写一个FAT32文件系统。

那么,我们要解决的主要问题就有:

1)掌握μC/OS-II的基本原理,并能在μC/OS-II上用C语言进行程序设计;2)μC/OS-II开发环境的建立。由于我们没有嵌入式的硬件设备,所以在PC上进行开发。于是就需要把μC/OS-II一直到windows下,用VC++作为开发环境;

3)了解FAT32文件系统的底层细节。必须要有FAT32这种文件系统的详细说

明。

4)手动实现FAT32文件系统。

5)测试。必须保证文件系统能在μC/OS-II下运行。

第二章设计的基本概念和原理

2.1 μC/OS-II简介

μC/OS-II由Micrium公司提供,是一个可移植、可固化的、可裁剪的、占先式多任务实时内核,它适用于多种微处理器,微控制器和数字处理芯片(已经移植到超过100种以上的微处理器应用中)。同时,该系统源代码开放、整洁、一致,注释详尽,适合系统开发。μC/OS-II已经通过联邦航空局(FAA)商用航行器认证,符合航空无线电技术委员会(RTCA)DO-178B标准。

μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU 的移植等5个部分。

1)核心部分

是操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。能够维持系统基本工作的部分都在这里。

2)任务处理部分

任务处理部分中的内容都是与任务的操作密切相关的。包括任务的建立、删除、挂起、恢复等等。因为μC/OS-II是以任务为基本单位调度的,所以这部分内容也相当重要。

3)时钟部分

μC/OS-II中的最小时钟单位是timetick(时钟节拍)。任务延时等操作是在这里完成的。

4)任务同步和通信部分

为事件处理部分,包括信号量、邮箱、邮箱队列、事件标志等部分;主要用于任务间的互相联系和对临界资源的访问。

5)与CPU的接口部分

是指μC/OS-II针对所使用的CPU的移植部分。由于μC/OS-II是一个通用性的操作系统,所以对于关键问题上的实现,还是需要根据具体CPU的具体内容和要求作相应的移植。这部分内容由于牵涉到SP等系统指针,所以通常用汇编语言编写。主要包括中断级任务切换的底层实现、任务级任务切换的底层实现、时钟节拍的产生和处理、中断的相关处理部分等内容。

2.2 μC/OS-II在VC++下的移植

为了开发环境的方便,需要将μC/OS-II移植到VC++上。移植主要有三步,下面作简要说明。详细的方法可以参考《嵌入式实时操作系统μC/OS原理与实践》一书。

1)VC下时钟的获得

可以使用采用软件定时器来模拟时钟中断。这里我们采用的是timeSetEvent()函数。这个函数很简单,不需要消息循环,定时精度为ms级,主要应用在多媒体定时方面,能够在非常精确的时间间隔内完成一个事件、函数或过程的调用。可以通过调用timeSetEvent()函数,将需要周期性执行的任务定义在LpTimeProc回调函数中,从而完成所需处理的事件。调用这个函数后会增加一个线程,时间一到则在这个线程中调用回调函数,对于主线程来说,非常类似外部中断调用,我们需要的正是这样的效果。

2)模拟时钟中断的产生

中断指的是中止当前的事务,处理别的更要紧的事情。我们通过软件定时器来模拟产生uC/OS-II的时钟中断,但timeSetEvent()函数调用定时回调函数是和主线程同时被windows操作系统调度的,并没有起到中断的作用。所以在调用定时回调函数的时候必须停止主线程的运行,退出回调函数则恢复主线程的运行,自然这些事情可以都放在定时回调函数,也就是uC/OS-II的时钟中断处理函数中完成。Windows下要挂起一个线程的运行,首先要得到这个线程的句柄,然后调用SuspendThread(hangdler)和ResumeThread(handler)就可以挂起和继续执行线程。

3)任务切换

任务切换,其实做的是任务的上下文切换,在其他CPU上非常容易分辨出任务的上下文,一般就是CPU上的相应寄存器,那么在VC下呢?从简单考虑,我们选择了不带浮点运算的上下文环境,因此任务的上下文和uC/OS-II在80x86上移植的上下文很相近,不同点只是段寄存器不用保存,因为在VC下任务其实只是在同一个线程中切换,而且在保护模式下段寄存器的概念已变,其值在同一个线程中是不会变的。

2.3 FAT32文件系统格式

FAT32是Windows系统硬盘分区格式的一种。这种格式采用32位的文件分配表,使其对磁盘的管理能力大大增强,突破了FAT16对每一个分区的容量只有2 GB的限制。由于现在的硬盘生产成本下降,其容量越来越大,运用FAT32的分区格式后,我们可以将一个大硬盘定义成一个分区而不必分为几个分区使用,大大方便了对磁盘的管理。目前已被性能更优异的NTFS分区格式所取代。

一个FAT文件系统包括四个不同的部分:保留扇区、FAT区域、根目录区域、数据区域。

对于FAT32的具体说明可以参考微软官网上关于FAT32的白皮书,网址:。

第三章总体设计

嵌入式文件系统由于功能和作用与普通桌面操作系统的文件系统不同,导致了二者在体系结构上具有很大的差异性。在普通桌面操作系统中,文件系统不仅要管理文件,提供文件系统调用API,还要管理各种设备,支持对设备和文件操作的一致性(即要像操作文件一样来操作各种I/O设备)。在嵌入式文件系统中,这种规则发生了很大的变化。在某些情况下,嵌入式系统可以针对特殊的目的来进行定制,特别是随着ASOS(为应用定制的嵌入式操作系统)的发展,对嵌入式操作系统的系统功能规整性、可伸缩性及其灵活性提出了更高的要求。

基于以上的考虑,我们采用了下图所示的嵌入式文件系统体系结构,该结构

定义的文件系统从上到下有三个层次:第一层为API层、第二层为中间转换层、下层为介质驱动层。

API层

中间转换层

介质驱动层

第一层:API层。API层是文件系统和用户应用程序之间的接口,它有一个标准C函数库,其中包含有诸如打开文件(f_open)、写文件(f_write)等函数。本层的功能是将用户调用传送给中间转换层。这是整个系统设计的核心,也是嵌入式文件系统中用户唯一可见的部分。

第二层:中间转换层。中间转换层要为文件系统的实现提供与硬件无关的统一接口,是文件系统结构规整性的基础。中间转换层包含有文件系统子层及逻辑块子层,其中文件系统子层将文件操作解释到逻辑块子层,然后文件系统调用逻辑块子层并根据不同的设备定义出相应的设备驱动程序;逻辑块子层主要是同步对设备驱动程序的访问,向上提供友好界面。

第三层:介质驱动层。介质驱动层是访问硬件的最低端的程序,该程序的结构要能够便于实现对硬件的访问。本层的功能主要是完成对介质的访问。本层的重要任务就是提供统一的设备驱动程序接口。

根据文件系统的层次结构,可以将该文件系统分成三大功能块:API接口模块、中间转换模块、设备驱动模块。其中API接口模块主要完成文件的基本操作,包含有文件的生成、删除、打开、关闭、文件读、文件写等。中间转换模块主要完成对存取权限的检查、介质的选择、逻辑到物理的转换。设备驱动模块完成存储介质的驱动程序,包含有一个驱动程序函数表和介质读、介质写、检查状态、

执行特定命令等驱动程序。

第四章详细设计

总体设计完成之后,就可以几种精力进行详细设计。根据总体设计划分的模块,一个模块一个模块进行详细设计。

4.1 文件系统对外提供的主要接口

1、FRESULT f_open (FIL*, const char*, BYTE);

函数功能:打开或者创建一个文件

2、FRESULT f_read (FIL*, BYTE*, WORD, WORD*);

函数功能:读一个文件

3、FRESULT f_close (FIL*);

函数功能:关闭一个文件

4、FRESULT f_opendir (DIR*, const char*);

函数功能:读一个目录中的目录项

5、FRESULT f_readdir (DIR*, FILINFO*);

函数功能:读取目录的内容

6、FRESULT f_stat (const char*, FILINFO*);

函数功能:获取文件的状态

7、FRESULT f_mountdrv ();

函数功能:初始化文件系统

8、FRESULT f_write (FIL*, const BYTE*, WORD, WORD*);

函数功能:写文件

9、FRESULT f_sync (FIL*);

函数功能:同步文件缓冲区的内容到磁盘中

10、FRESULT f_delete(const char*);

函数功能:删除一个文件或者目录

11、FRESULT f_mkdir (const char*);

函数功能:创建一个目录

这就是文件系统提供的全部功能,灵活地运用上述函数,就可以编写出复杂的应用程序。

4.2 文件系统的主要数据结构

1)UCFS结构体

/* 文件系统结构体,保存文件系统的有关信息 */

typedef struct{

BYTE fs_type;// 文件系统类型

BYTE files;// 当前已打开的文件的数目

BYTE sects_clust;// 每个簇的扇区数

BYTE n_fats;// FAT表的数目

WORD n_rootdir;// 根目录数(在FAT32中为0)

BYTE winflag;// 标记文件是否被改动过,为1时要回写

BYTE pad1;// 站位,字节对齐

DWORD sects_fat;// 每个FAT表所占的扇区数

DWORD max_clust;// 总的簇数

DWORD fatbase;// FAT区的起始扇区

DWORD dirbase;// 根目录区的起始扇区

DWORD database;// 数据区的起始扇区

DWORD winsect;// 当前缓冲区中存储的扇区号

BYTE win[512];// 单个扇区缓存

} UCFS;

UCFS结构体记录了文件系统的所有信息,有了这个结构体,就可以方便地访问文件系统的每一部分。

2)DIR结构体

//目录结构体,表示一个目录

typedef struct{

DWORD sclust;// 起始簇

DWORD clust;// 当前簇

DWORD sect;// 当前扇区

WORD index;// 当前索引

} DIR;

作为目录项的指针,既可以用于记录一个特定文件在目录中的位置,又可以用于记录在目录中当前目录项指针的位置(类似于文件指针)。

3)FIL结构体

//文件结构体,表示一个文件

typedef struct{

DWORD fptr;// 文件读写指针

DWORD fsize;// 文件大小

DWORD org_clust;// 文件起始簇

DWORD curr_clust;// 当前簇(fsize=0时为0)

DWORD curr_sect;// 当前扇区

DWORD dir_sect;// 此文件的目录项所在的扇区

BYTE* dir_ptr;// 指向文件目录项的指针

BYTE* buffer;// 文件读写缓冲区

BYTE flag;// 文件状态标识

BYTE sect_clust;// 当前簇中剩余的扇区数

} FIL;

记录普通文件(不是目录文件)的详细信息,比如文件对应的目录项位置,文件起始簇号,文件指针,文件大小等。

4)FILINFO结构体

//文件信息的结构体,也可以表示目录,用fattrib区分

typedef struct _FILINFO {

DWORD fsize;// 文件大小

WORD fdate;// 文件修改日期

WORD ftime;// 文件修改时间

BYTE fattrib;// 文件属性

char fname[13];// 文件名 (8.3 格式)

} FILINFO;

5)win[512]数组

位于 FATFS 结构体中,作为目录项或者 FAT 分配表的读写缓冲区。它不是某一个文件专有的缓冲区,而是整个文件系统的公共读写缓冲区。

6)buffer指针

buffer 是一个指向 512 字节缓冲区的指针,位于 FIL 结构体中,也就相当于是 FIL 中有一个 512 字节缓冲区的成员。此 512 字节的缓冲区,是一个文件的专有缓冲区。用于当文件的读写没有按照 512 字节对齐的时候,作为磁盘与用户读写缓冲区之间的临时缓冲区。

4.3 各个函数的详细实现

1)move_window

函数原型:BOOL move_window ( DWORD sector )

函数功能:win[]操作函数(DBR、FAT 表、目录项)

<1>读取新的扇区内容到临时缓冲区 win[]

<2>同步 win[]中的内容到磁盘

注意:

<1> 如果读取新的扇区号就是现在存储在 win[]中的扇区号,就什么也不操作

<2> 如果不同,则根据情况同步 win[]到磁盘中,并且将新扇区中的内容读取到 win[]中

<3> 如果 sector 为 0,则函数功能变为同步 win[]到磁盘中,不会读取0 扇区的内容到 win[]

输入参数:sector 要读取扇区的扇区号

与其他函数的关系:此函数被下列函数直接或间接调用

第一类:操作 FAT 表

①get_cluster

②put_cluster

③remove_chain

④create_chain

第二类:操作 MBR、DBR

⑤check_fs

第三类:操作目录项所在扇区(目录的数据空间)

⑥trace_path

程序的实现方法:首先判断要读取的扇区号是否与当前缓存在 win[]中的扇区号一致。倘若一致,则无需执行任何操作。倘若不一致,再判断缓存在 win[]中的内容是否被修改过,如果修改过,就需要更新到磁盘,最后还要把新扇区中的内容加载到 win[]中。当传入参数0时,0 与当前缓存在 win[]的扇区号肯定不一样,所以一定会同步 win[]内容到磁盘中。

2)f_mountdrv

函数原型:FRESULT f_mountdrv()

函数功能:初始化磁盘;初始化UcFs对象,记录物理磁盘的相关参数。

函数实现方法:首先调用磁盘初始化函数,对磁盘进行初始化。然后读取物理磁盘 0 号扇区的内容,判断是否是 DBR 扇区。如果不是 DBR 扇区,那么肯定就是 MBR 扇区,再从 MBR 扇区中获取 DBR 扇区的地址,将 DBR 扇区的内容调取到 win[]中。接下来从 win[]中,填充 UCFS 类型的系统对象,这样物理磁盘和文件系统的参数就被保存到了这个对象中。以后,程序就可以从全局变量--UcFs 类型的变量,访问文件系统的每一个区域。

3)f_open

函数原型:FRESULT f_open (FIL *fp, const char *path, BYTE mode)

函数功能:以指定的方式打开或者新建一个文件。如果打开或者创建成功,会填充fp 指向的文件信息变量(包含文件的目录项确切位置和文件的信息)。

函数参数:fp指向文件信息变量的指针

path指向文件的路径

mode打开方式

输出参数:FR_OK 打开或者创建成功

其他值打开或者创建失败

函数实现方法:

①以只读的方式打开一个已经存在的文件

首先调用函数trace_path 搜索文件系统中是否存在目标文件,如果不存在就返回失败;如果存在就返回文件的目录项位置(dirscan、dir),并且将目录项所在扇区的内容加载到 win[]中。接下来就是从 win[]中,将文件目录项的参数稍作转化后传入 FIL 类型的变量中。到此,一个文件就算完整的打开了。注意打开文件并不是打开文件的内容,而是文件的目录项,知道了文件的目录项就知道了如何去查看文件的内容。

以后,通过 FIL 类型的变量就可以操作对应的文件。

②新建一个文件

首先调用函数trace_path 搜索文件系统中是否存在目标文件,因为是新建文件肯定不存在。那么不存在的文件就返回新建文件当前文件夹的目录指针位置(dirscan、dir)--第一个空目录项所在位置,并且将当前目录指针所在扇区的内容加载到 win[]中。首先给新建文件在当前文件夹中预定一个目录项位置,

然后填入新建文件的目录项初始值(文件名、扩展名、属性、创建时间、更新时间)到 win[]中。注意这里并不会将新建文件目录项所在扇区同步到磁盘中,只有当调用f_sync 函数时才会将文件的目录项所在扇区同步到磁盘。创建一个新文件,只会在其上一层目录中添加对应的目录项并初始化,并不会给文件分配数据空间,当然文件的大小肯定是 0。

③重建一个文件

首先调用函数trace_path 搜索文件系统中是否存在目标文件,因为是重建文件肯定存在。那么就返回文件的目录项位置(dirscan、dir),并且将目录项所在扇区的内容加载到 win[]中。重建首先将文件的簇链删除,然后设置文件起始位置和文件大小为空,还需要初始化文件的属性、创建时间和修改时间。这里的修改都只是在 win[]中进行的,并没有同步到磁盘。只有当调用 f_sync 函数时才会将文件的目录项所在扇区同步到磁盘。重建文件更改了原来文件在目录中的目录项信息,重建文件并没有分配簇,也就是没有分配数据空间。

4)f_read

函数原型:FRESULT f_read (FIL *fp, BYTE *buff, WORD btr, WORD *br) 函数功能:文件读操作

输入参数:fp 文件信息指针

buff 指向用户缓冲区

btr 准备读取的字节数

br 指向实际读取字节数的变量

输出参数:FRESULT 成功与否

备注:函数在读取文件内容后,还会移动文件指针到下一此读写操作的起点。函数的实现方法:

读文件的情况有些复杂,不同的情况有不同的处理方法。开始读的时候,文件指针并没有位于扇区边界上(512 字节对齐),读取的跨度为 3 个簇。

首先读没有对齐扇区的剩余内容,其实这个内容在以前的函数(以前的函数移动了文件指针)已经将这个扇区的内容加载到了 buffer 中。所以,直接从缓冲区 buffer 中读取此扇区文件指针以后的剩余内容到用户缓冲区。

接下来,读取第一个簇的剩余一个扇区的内容到用户缓冲区。通过

get_cluster 函数从 FAT 表中,获取第二个簇链的位置。然后一次性的将一个簇链的所有扇区内容读取到用户缓冲区中。再通过 get_cluster 函数从 FAT 表中,获取第三个簇链的位置。然后将第三个簇链的第一个扇区内容读取到用户缓冲区中。

最后,将最后所需要读取剩余内容所在的扇区(剩余部分不够一个扇区)读取到 buffer 中,然后再从 buffer 中读取所需要的剩余内容到用户缓冲区中。到这里为止,整个读取操作已经完成。由于 buffer 中还有一部分内容没读,假设继续调用函数f_read 函数读取数据,那么肯定先从这个buffer 缓冲区中将文件指针以后的扇区剩余内容读取到用户缓冲区。

5)f_write

函数原型:FRESULT f_write(FIL *fp,const BYTE *buff,WORD btw, WORD *bw) 函数功能:文件写操作,只对文件的数据区进行写入,并没有更新对应的目录项。

输入参数:fp 文件信息指针

buff 指向读取的用户缓冲区

btw 准备写入的字节数

bw 返回实际写入的字节数

输出参数:FRESULT 成功与否

备注:函数在写完文件内容后,还会移动文件指针到下一此读写操作的起点。函数的实现方法:

写文件的情况与读取文件内容类似。开始写的时候,文件指针并没有位于扇区边界上(512 字节对齐),写入数据的跨度为 3 个簇。

首先写入没有对齐扇区的剩余内容,其实这个内容在以前的函数(以前的函数移动了文件指针)已经将这个扇区的内容加载到了 buffer 中。所以,将用户缓冲区中对应的内容写入到buffer 中(从文件指针开始到buffer 结束的这部分空间)。然后再将 buffer 中的内容写入到磁盘对应的扇区。

接下来,将用户缓冲区写入到第一个簇的剩余一个扇区中。通过creat_chain 函数从 FAT 表中,获取第二个簇链的位置(如果是文件有剩余簇链则使用文件的剩余簇链,如果已经用完则重新从 FAT 表中搜索一个空的簇链连接到此文件中,也就是更改了文件的大小)。然后一次性的将用户缓冲区写入到第二个簇链的所有扇区中。再通过get_cluster 函数从 FAT 表中,获取第三

个簇链的位置。然后将用户缓冲区写入到第三个簇链的第一个扇区中。

最后,将最后所需要写入剩余内容所在的扇区(剩余部分不够一个扇区)读取到buffer 中,然后再将用户缓冲区中剩余内容写入到buffer 中。到这里为止,整个读取操作已经完成。注意这里并没有将 buffer 的内容写入到磁盘中。当调用 f_sync 函数的时候才会将 buffer 的内容同步到磁盘。

在函数返回之前,还需要判断文件大小是否更改了,如果大小更改了则要更新文件的大小,并将 FA__WRITTEN记录到文件的 flag 中。这样做的目的是为了当执行 f_sync 时,可以根据 FA__WRITTEN 判断出文件修改过,从而更新文件的目录项。

6)f_sync

函数原型:FRESULT f_sync (FIL *fp)

函数功能:在关闭文件之前,同步文件缓冲区中的内容到磁盘,同步文件目录项信息到磁盘。

输入参数:fp 文件信息指针

输出参数:FRESULT 成功与否

函数实现方法:判断文件是否修改过,如果修改过再判断文件buffer 缓冲区是否修改过,如果修改过则同步到磁盘中文件对应的数据空间中。如果文件修改过,还要更新文件的目录项,这时的修改也是在win[]中的。最后通过调用move_window(0),将文件目录项信息同步到磁盘中。

7)f_opendir

函数原型:FRESULT f_opendir (DIR *scan, const char *path)

函数功能:打开一个目录

输入参数:scan 指向返回找到的目录项结构体

path 指向路径

输出参数:FRESULT 成功与否

函数的实现方法:

首先调用函数trace_path 搜索文件系统中是否存在所要打开的目录,如果不存在就返回失败;如果存在就返回目录对应目录项的位置(dirscan、dir),并且将目录对应目录项所在扇区的内容加载到 win[]中。

接下来判断找到的是不是一个目录。如果就是一个目录的话,就从 win[]中将目录对应目录项的参数稍作转化后传入 DIR 类型的变量中。到此,一个目录就算完整的打开了。注意打开目录并不是打开目录的内容,而是目录对应的目录项,知道了目录对应的目录项就知道了如何去查看目录的内容。

以后,通过 DIR 类型的变量就可以操作对应的目录。

8)f_mkdir

函数原型:FRESULT f_mkdir (const char *path)

函数功能:创建一个目录

新建一个目录,它虽然是一个空目录(有效存储内容为 0),但是系统已经为它分配了一个簇的数据空间,用于保存它的目录项。这是与新建一个普通文件区别很大的地方。

另外,新建一个目录时,对新建目录在上一层目录的目录项以及新建目录中的目录项的初始化,全部都在 win[]中进行操作。

输入参数:path 指向路径的指针

输出参数:FRESULT 成功与否

函数的实现方法:

首先调用函数trace_path 搜索文件系统中是否存在目标目录,因为是新建目录肯定不存在。那么不存在目录时就返回新建目录所在当前文件夹的目录指针(dirscan、dir)--第一个空目录项位置,并且将当前目录指针所在扇区的内容加载到 win[]中。

接下来给新建目录在当前文件夹中预定一个目录项位置。然后调用creat_chain 函数在FAT 表中为新建目录找到一个可用的数据簇,再调用move_window(0)同步 FAT 表到磁盘中。为新建目录的数据簇初始化,并且初始化第一个目录项。

最后,填入新建目录的目录项初始值(目录名、属性、创建时间、数据簇起始位置)到 win[]中。然后同步到磁盘中,完成整个新建目录的工作。

9)f_delete

函数原型:FRESULT f_delete (const char *path)

函数功能:删除一个文件或者目录

1、删除目录或者文件的簇链(回收数据空间)。

2、文件或者目录的目录项被设置成为删除(0xE5),注意目录项并没有回收,只是标记为删除。

输入参数:path 指向路径的指针

输出参数:FRESULT 成功与否

函数的实现方法:

首先调用函数trace_path 搜索文件系统中是否存在所要删除的目录或者文件,如果不存在就返回失败;如果存在就返回对应目录项的位置(dirscan、dir),并且将对应目录项所在扇区的内容加载到 win[]中。判断要删除的是不是目录,如果是目录还要判断是不是非空目录,如果是非空目录则不允许删除。如果是空目录,那么就可以删除。

删除文件或者目录时,首先删除簇链(数据空间),然后修改目录项为删除状态(0xE5),最后同步目录项所在扇区 win[]缓冲区到磁盘中,完成删除。10)f_readdir

函数原型:FRESULT f_readdir (DIR *scan, FILINFO *finfo)

函数功能:从当前目录项指针处读取一个目录项,并且移动目录指针到下一个索引

输入参数:scan 要读取的目录

finfo 目录的信息,finfo->fname[0] = 0,这是一个空目录项

finfo->fname[0] = others,这是一个非空目录项。

输出参数:FRESULT 成功与否

函数的实现方法:首先将目录指针当前所在物理扇区读取到 win[]中,然后调用get_ 函数从当前目录指针处读取当前目录项并处理后存入 finfo 中。最后,还要移动目录项指针到下一个索引位置。

11)f_close

函数原型:FRESULT f_close (FIL *fp)

函数功能:关闭文件

函数参数:fp 指向文件的指针

函数返回值:FRESULT 操作是否成功

函数的实现方法:首先调用f_sync(),如果成功,则把UcFs->files减一。

第五章系统的测试和运行

文件系统主要是对外提供接口,因此需要编写驱动程序开测试文件函数是否正常工作。

5.1 测试程序的编写

测试程序必须运行在μC/OS-II上,因为我们是为μC/OS-II编写的文件系统。而且测试程序必须覆盖所有的公共接口。下面是测试程序的主要代码:void test_fs(void* p_arg)

{

char cmd[256];

char param[20];

char* p;

CMDTYPE type;

for(;;)

{

printf("ucosii/fs>");

fgets(cmd,255, stdin);

//删除行尾的换行符

p = strrchr(cmd,'\n');

if(p !=NULL)

*p ='\0';

rm_blank(cmd);

if(*cmd =='\0')

{

puts("");

continue;

}

type = parse(cmd, param);

switch(type)

{

case READ:

read_test(param);

puts("");

break;

case WRITE:

write_test(param);

puts("");

break;

case LS:

ls_test(param);

puts("");

break;

case RM:

rm_test(param);

puts("");

break;

case NEWFILE:

new(param);

puts("");

break;

case MKDIR:

mkdir_test(param);

puts("");

break;

case HELP:

show_help();

puts("");

break;

case QUIT:

exit(0);

break;

case INVALID:

printf("输入的命令有误,请重新输入"); puts("");

break;

}

}

}

5.2 程序的运行结果

程序运行的截图如下:

经过反复的测试,发现程序是正确的。

第六章系统的使用说明

在使用此文件系统的时候,有下面几点需要注意:

1、不使用一个文件的时候,要调用 f_close 或者 f_sync 函数将文件同步到磁盘中。

2、f_read、f_write、f_lseek、f_sync、f_close 在使用前要先打开文件,也即是调用 f_open 函数。

3、f_stat 无需事先打开文件,可以直接使用

操作系统课程设计

课程设计报告 2015~2016学年第一学期 操作系统综合实践课程设计 实习类别课程设计 学生姓名李旋 专业软件工程 学号130521105 指导教师崔广才、祝勇 学院计算机科学技术学院 二〇一六年一月

- 1 -

- 2 -

一、概述 一个目录文件是由目录项组成的。每个目录项包含16B,一个辅存磁盘块(512B)包含32个目录项。在目录项中,第1、2字节为相应文件的外存i节点号,是该文件的内部标识;后14B为文件名,是该文件的外部标识。所以,文件目录项记录了文件内、外部标识的对照关系。根据文件名可以找到辅存i节点号,由此便得到该文件的所有者、存取权、文件数据的地址健在等信息。UNIX 的存储介质以512B为单位划分为块,从0开始直到最大容量并顺序加以编号就成了一个文件卷,也叫文件系统。UNIX中的文件系统磁盘存储区分配图如下: 本次课程设计是要实现一个简单的模拟Linux文件系统。我们在内存中开辟一个虚拟磁盘空间(20MB)作为文件存储器,并将该虚拟文件系统保存到磁盘上(以一个文件的形式),以便下次可以再将它恢复到内存的虚拟磁盘空间中。文件存储空间的管理可采用位示图方法。 二、设计的基本概念和原理 2.1 设计任务 多用户、多级目录结构文件系统的设计与实现。可以实现下列几条命令login 用户登录 logout 退出当前用户 dir 列文件目录 creat 创建文件 delete 删除文件 open 打开文件 close 关闭文件 - 3 -

read 读文件 write 写文件 mkdir 创建目录 ch 改变文件目录 rd 删除目录树 format 格式化文件系统 Exit 退出文件系统 2.2设计要求 1) 多用户:usr1,usr2,usr3,……,usr8 (1-8个用户) 2) 多级目录:可有多级子目录; 3) 具有login (用户登录)4) 系统初始化(建文件卷、提供登录模块) 5) 文件的创建:create (用命令行来实现)6) 文件的打开:open 7) 文件的读:read8) 文件的写:write 9) 文件关闭:close10) 删除文件:delete 11) 创建目录(建立子目录):mkdir12) 改变当前目录:cd 13) 列出文件目录:dir14) 退出:logout 新增加的功能: 15) 删除目录树:rd 16) 格式化文件系统:format 2.3算法的总体思想 - 4 -

操作系统课程设计题目

课程设计任务书 一、课程设计目的 《计算机操作系统》课程设计是计算机类专业的集中实践性环节之一,是学习完《计算机操作系统》课程后进行的一次全面的综合练习。其目的在于加深对操作系统课程的理解,使学生更好地掌握操作系统的基本概念、基本原理、及基本功能,理解操作系统在计算机系统中的作用、地位和特点,具有分析实际操作系统,设计、构造和开发现代操作系统的基本能力,为今后从事的各种实际工作,如设计、分析和改进各种系统软件和应用软件提供必要的软件理论基础。 二、课程设计内容及要求 课程设计要求: 每位同学从下述设计任务中任选一个任务完成,上机验收运行结果,现场提问,并提交所完成该任务的课程设计报告。 实验要求: 1)上机前认真使用C语言编写好程序,采用Visual C++6.0作为编译环境; 2)上机时独立调试程序 3)上机验收运行结果,现场提问 4)根据具体任务要求,提交课程设计实验报告,报告内容包括:课程设计目的、内容、基本原理、模块划分、数据结构、算法设计、程序流程图(包括主程序流程图、模块详细设计流程图等)、以及算法源码(必须有相关注释,以有助于说明问题为宜,不得全盘打印而不加任何注释)、心得体会等。

设计内容一页式虚拟存储管理页面置换算法 1.目的和要求 在熟练掌握计算机虚拟存储技术的原理的基础上,利用一种程序设计语言模拟实现几种置换算法,一方面加深对原理的理解,另一方面提高学生通过编程根据已有原理解决实际问题的能力,为学生将来进行系统软件开发和针对实际问题提出高效的软件解决方案打下基础 2.实验内容 阅读教材《计算机操作系统》,掌握存储器管理相关概念和原理。 模拟实现页式虚拟存储管理的三种页面置换算法(OPT、FIFO和LRU),并通过比较性能得出结论。 前提: (1)页面分配采用固定分配局部置换。 (2)作业的页面走向和分得的物理块数预先指定。可以从键盘输入也可以从文件读入。 (3)置换算法的置换过程输出可以在显示器上也可以存放在文件中,但必须清晰可读,便于检验。 3.实验环境 Windows操作系统、VC++6.0、C语言 4.实验提示 (1)基础知识 存储管理是操作系统进行资源管理的一个重要功能。现代操作系统广泛采用虚

操作系统课程设计文件系统管理)

操作系统课程设计Array文件系统管理 学院计算机学院 专业计算机科学与技术 班级 姓名 学号 2013年1月8日 广东工业大学计算机学院制 文件系统管理 一、实验目的 模拟文件系统的实现的基本功能,了解文件系统的基本结构和文件系统的管理方法看,加深了解文件系统的内部功能的实现。通过高级语言编写和实现一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作系统命令的实质内容和执行过程有比较深入的了解。 二、实验内容和要求 编程模拟一个简单的文件系统,实现文件系统的管理和控制功能。在用户程序中通过使用文件系统提供的create,open,read,write,close,delete等文件命令,对文件进行操作。 以下报告主要包括: 1.可行性分析 2.需求分析 3.概要设计

4.详细设计 5.测试 6.总结 三、可行性分析 1、技术可行性 对于图形编程还不了解,但是经过本学期的三次实验的练习,可以设计好命令操作界面。利用大二期间学习的数据结构可以模拟出此课程设计的要求。 2、经济可行性 课程设计作为本课程的练习及进一步加深理解。与经济无关,可以不考虑。(零花费,零收益) 3.法律可行性 自己编写的程序,仅为练习,不作其他用途,与外界没什么联系,可行。 四、需求分析 编写程序实现文件系统,主要有以下几点要求: 1、实现无穷级目录管理及文件管理基本操作 2、实现共享“别名” 3、加快了文件检索 五、概要设计 为了克服单级目录所存在的缺点,可以为每一位用户建立一个单独的用户文件目录UFD(User File Directory)。这些文件目录可以具有相似的结构,它由用户所有文件的文件控制块组成。此外,在系统中再建立一个主文件目录MFD (Master File Directory);在主文件目录中,每个用户目录文件都占有一个目

操作系统课程设计报告书

题目1 连续动态内存管理模拟实现 1.1 题目的主要研究内容及预期达到的目标 (1)针对操作系统中内存管理相关理论进行设计,编写程序并进行测试,该程序管理一块虚拟内存。重点分析三种连续动态内存分配算法,即首次适应算法、循环首次适应算法和最佳适应算法。 (2)实现内存分配和回收功能。 1.2 题目研究的工作基础或实验条件 (1)硬件环境:PC机 (2)软件环境:Windows XP,Visual C++ 6.0 1.3 设计思想 首次适应算法的实现:从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法的目的在于减少查找时间。为适应这种算法,空闲分区表中的空闲分区要按地址由低到高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高址空间保留大的空闲区。 循环首次适应算法的实现:在分配内存空间时,不再每次从表头开始查找,而是从上次找到空闲区的下一个空闲开始查找,直到找到第一个能满足要求的的空闲区为止,并从中划出一块与请求大小相等的内存空间分配给作业。该算法能使内存中的空闲区分布得较均匀。 最佳适应算法的实现:从全部空闲区中找到能满足作业要求的、且最小的空闲分区,这种方法能使碎片尽量小。为适应此算法,空闲分区表中的空闲分区要按从小到大进行排序,从表头开始查找第一个满足要求的自由分配。 1.4 流程图 内存分配流程图,如图1-1所示。

图1-1 内存分配流程图内存回收流程图,如1-2所示。

图1-2 内存回收流程图 1.5 主要程序代码 (1)分配内存 void allocate(char z,float l) { int i,k; float ad; k=-1; for(i=0;i= l && free_table[i].flag == 1) if(k==-1 || free_table[i].length

《操作系统课程设计》题目要求

操作系统课程设计要求 一.设计目的 熟悉Linux编程环境,加强对Linux命令的理解及函数的运用 二.设计内容 1. 在Linux环境下模拟实现简单命令解释器。 (1)要求实现的基本命令包括: pwd //显示当前所在目录的路径名 dir <目录名> //列出指定目录名中的所有目录及文件 cd <目录名或路径>//改变当前工作目录 newdir <目录名> //新建目录 deldir <目录名> //删除目录 exit //退出命令解释程序 (2)可选做的扩展命令包括: rename <旧文件名> <新文件名> //重命名一个文件或目录 find <目录> -name <待查找的文件名> //在指定的目录及其子目录中查找指定的文件date //显示当前日期 (3)提示:整个程序的大致框架可参考如下: while ( exit未被输入) { 接收键盘的一行输入 分析输入的命令 对输入的命令进行处理,调用系统函数实现功能 } 2. 设计要求 (1) 设计必须在Linux环境下进行。 (2) 命令解释程序的提示符为:姓名拼音@ (3) 程序编写中不得使用system()系统调用。 (4) 整个程序必须严格经过测试,完成所有基本功能。源程序应有较详尽的注释。 3.可能用到的系统调用: open(),close(),read(),write(),creat() chdir(), opendir(),readdir(),rewinddir(),closedir(),rmdir(),mkdir() getcwd(), ftw() time(), localtime(), asctime()

操作系统课程设计-模拟文件系统

目录 第1章需求分析 (1) 第2章概要设计 (1) 2.1 系统的主要功能 (1) 2.2系统模块功能结构 (1) 2.3运行环境要求 (2) 2.4数据结构设计 (2) 第3章详细设计 (3) 3.1模块设计 (3) 3.2算法流程图 (3) 第4章系统源代码 (4) 第5章系统测试及调试 (4) 5.1运行结果及分析 (4) 5.2系统测试结论 (5) 第6章总结与体会 (6) 第7章参考文献 (6) 附录 (7)

第1章需求分析 通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,并了解操作系统的发展动向和趋势。 模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。 第2章概要设计 2.1 系统的主要功能 1) 系统运行时根据输入的用户数目创建主目录 2) 能够实现下列命令: Login 用户登录 Create 建立文件 Read 读取文件 Write写入文件 Delete 删除文件 Mkdir 建立目录

Cd 切换目录 Logout 退出登录 2.2系统模块功能结构 2.3运行环境要求 操作系统windows xp ,开发工具vc++6.0 2.4数据结构设计 用户结构:账号与密码结构 typedef struct users { char name[8]; char pwd[10]; }users;

操作系统课程设计报告

操作系统课程设计报告

东莞理工学院 操作系统课程设计报告 学院:计算机学院 专业班级: 13软件工程1班 提交时间: 2015/9/14 指导教师评阅意见: . 项目名称:进程与线程管理功能 一、设计目的 用语言来模拟进程和线程管理系统,加深对进程和线程的理解,掌握对进程和线程各种状态和管理的算法原理。

二、环境条件 系统: WindowsXP、VMWare、Ubuntu Linux 语言:C/C++ 开发工具:gcc/g++、Visual C++ 6.0 三、设计内容 1. 项目背景 计算机的硬件资源有限,为了提高内存的利用率和系统的吞吐量,就要根据某种算法来管理进程和线程的状态从而达到目的。 进程与线程管理功能完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 进程与线程管理功能 基本要求:完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 提高要求:(增加1项就予以加分) (1) 实现多种线程调度算法; (2)通过“公共信箱”进行通信的机制,规定每一封信的大小为128字节,实现两个用户进程之间通过这个“公共信箱”进行通信。 (3) 实现多用户进程并发的虚拟内存管理功能。

(4) 实现用户进程间通信功能,并用生产者/消费者问题测试进程间通信功能的正确性。 (5) 实现改进型Clock页面置换算法。 (6) 实现Cache功能,采用FIFO替换算法。 2. 扩展内容 实现多种线程调度算法:时间片轮转调度算法 四、人员分工 优先级调度算法:钟德新,莫友芝 时间片轮转调度算法:张德华,袁马龙 设计报告由小组队员共同完成。小组成员设计的代码分工如下:钟德新编写的代码:void Prinft(){ PCB *p; system("cls");//清屏 p=run; //运行队列 if(p!=NULL) { p->next=NULL; } cout<<"当前正在运行的进程:"<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<next; } cout<

操作系统课程设计报告

上海电力学院 计算机操作系统原理 课程设计报告 题目名称:编写程序模拟虚拟存储器管理 姓名:杜志豪.学号: 班级: 2012053班 . 同组姓名:孙嘉轶 课程设计时间:—— 评语: 成绩: 目录 一、设计内容及要求 (4) 1. 1 设计题目 (4) 1.2 使用算法分析: (4)

1. FIFO算法(先进先出淘汰算法) (4) 1. LRU算法(最久未使用淘汰算法) (5) 1. OPT算法(最佳淘汰算法) (5) 分工情况 (5) 二、详细设计 (6) 原理概述 (6) 主要数据结构(主要代码) (6) 算法流程图 (9) 主流程图 (9) Optimal算法流程图 (10) FIFO算法流程图 (10) LRU算法流程图 (11) .1源程序文件名 (11) . 2执行文件名 (11) 三、实验结果与分析 (11) Optimal页面置换算法结果与分析 (11) FIFO页面置换算法结果与分析 (16) LRU页面置换算法结果与分析 (20) 四、设计创新点 (24) 五、设计与总结 (27)

六、代码附录 (27) 课程设计题目 一、设计内容及要求 编写程序模拟虚拟存储器管理。假设以M页的进程分配了N

块内存(N

操作系统-课程设计

课程设计说明书(操作系统) 题目:进程调度 院系:计算机科学与工程学院 专业班级:信息安全13-2 学号:20133029xx 学生姓名:xx 指导教师:xx 2015年12月15日

安徽理工大学课程设计(论文)任务书计算机科学与工程学院

安徽理工大学课程设计(论文)成绩评定表

摘要 现代计算机系统中,进程是资源分配和独立运行的基本单位,是操作系统的核心概念。因而,进程就成为理解操作系统如何实现系统管理的最基本,也是最重要的概念。进程调度是进程管理过程的主要组成部分,是必然要发生的事件。 在现代操作系统中,进程的并发机制在绝大多数时候,会产生不断变化的进程就绪队列和阻塞队列。处于执行态的进程无论是正常或非正常终止、或转换为阻塞状态,都会引发从就绪队列中,由进程调度选择一个进程进占CPU。 进程调度的核心是进程调度的算法.在本课程设计中,用良好清晰的界面向用户展示了进程调度中的时间片轮转调度算法。在最终实现的成果中,用户可指定需要模拟的进程数,CPU时间片和进程的最大执行时间,并且选择需要演示的算法,界面将会动态的显示进程调度过程及各个队列的变化。通过此进程调度模拟系统,用户可以对时间片轮转调度算法有进一步以及直观的了解。 关键词:进程,调度,PCB,时间片轮转

目录 1.设计目的 (6) 2.设计思路 (6) 3.设计过程 (8) 3.1流程图 (8) 3.2算法 (8) 3.3数据结构 (10) 3.4源代码 (10) 4.实验结果及分析 (20) 4.1 使用说明 (20) 4.2程序演示 (20) 5.实验总结 (24) 6.参考文献 (24)

【精选】操作系统课程设计(文件系统管理)文件

评定等级 操作系统课程设计 文件系统管理 学院计算机学院 专业计算机科学与技术 班级 姓名 学号 2013年1月8日 广东工业大学计算机学院制

文件系统管理 一、实验目的 模拟文件系统的实现的基本功能,了解文件系统的基本结构和文件系统的管理方法看, 加深了解文件系统的内部功能的实现。通过高级语言编写和实现一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作系统命令的实质内容和执行过程有比较深入的了 解。 二、实验内容和要求 编程模拟一个简单的文件系统,实现文件系统的管理和控制功能。在用户程序中通过使用文件系统提供的create,open,read,write,close,delete 等文件命令,对文件进行操作。以下报告主要包括: 1.可行性分析 2.需求分析 3.概要设计 4.详细设计 5.测试 6.总结 三、可行性分析 1、技术可行性 对于图形编程还不了解,但是经过本学期的三次实验的练习,可以设计好命令操作界面。利用大二期间学习的数据结构可以模拟出此课程设计的要求。 2、经济可行性 课程设计作为本课程的练习及进一步加深理解。与经济无关,可以不考虑。(零花费,零收益) 3.法律可行性 自己编写的程序,仅为练习,不作其他用途,与外界没什么联系,可行。 四、需求分析 编写程序实现文件系统,主要有以下几点要求: 1、实现无穷级目录管理及文件管理基本操作 2、实现共享“别名” 3、加快了文件检索 五、概要设计 为了克服单级目录所存在的缺点,可以为每一位用户建立一个单独的用户文件目录 UFD (User File Directory )。这些文件目录可以具有相似的结构,它由用户所有文件的文件 控制块组成。此外,在系统中再建立一个主文件目录MFD (Master File Directory );在主文件目录中,每个用户目录文件都占有一个目录项,其目录项中包括用户名和指向该用户目 录的指针。

2017操作系统(含课程设计) - 随堂练习

随堂练习提交截止时间:2017-12-15 23:59:59 当前页有10题,你已做10题,已提交10题,其中答对10题。 1.(单选题) 操作系统是基本的特征是() A、并发 B、共享 C、虚拟 D、异步 答题: A. B. C. D. (已提交) 参考答案:A 问题解析: 2.(单选题) 下面不属于操作系统设计目标的是() A、提高资源利用率 B、提高系统吞吐量 C、用户操作计算机更方便 D、并行执行多个进程 答题: A. B. C. D. (已提交) 参考答案:D 问题解析: 3.(单选题) 历史上最早出现的操作系统是() A、单道批处理系统 B、多道批处理系统 C、分时系统 D、实时系统 答题: A. B. C. D. (已提交) 参考答案:A 问题解析: 4.(单选题) 实时操作系统必须在()内处理完来自外部的事件。 A、响应时间 B、周转时间 C、被控对象规定时间 D、调度时间 答题: A. B. C. D. (已提交) 参考答案:C 问题解析: 5.(单选题) 操作系统是对()进行管理的软件。 A、软件 B、硬件 C、计算机资源 D、应用程序 答题: A. B. C. D. (已提交) 参考答案:C 问题解析: 6.(单选题) 配置了操作系统的计算机是一台比原来的物理计算机功能更强的计算机,这样的一台计算机只是一台逻辑上的计算机,称为()计算机。 A、并行 B、真实 C、虚拟 D、共享 答题: A. B. C. D. (已提交)

问题解析: 7.(单选题) 操作系统中采用多道程序设计技术提高了CPU和外部设备的() A、利用率 B、可靠性 C、稳定性 D、兼容性 答题: A. B. C. D. (已提交) 参考答案:A 问题解析: 8.(单选题) 在操作系统中,并发性是指若干事件____发生( ) A、在同一时刻 B、在不同时刻 C、在某一时间间隔内 D、依次在不同时间间隔内 答题: A. B. C. D. (已提交) 参考答案:C 问题解析: 9.(单选题) ()操作系统允许在一台主机上同时联接多台终端,多个用户可以通过各自的终端同时交互地使用计算机。 A、网络操作系统 B、批处理操作系统 C、实时操作系统 D、分时操作系统 答题: A. B. C. D. (已提交) 参考答案:D 问题解析: 10.(单选题) 下面关于操作系统的叙述中正确的是 ( ) A、批处理作业必须提交作业控制信息 B、分时系统不一定都具有人机交互功能 C、从响应时间的角度看,实时系统与分时系统差不多 D、由于采用了分时技术,用户可以独占计算机的资源 答题: A. B. C. D. (已提交) 参考答案:A 问题解析:

操作系统课程设计报告

; 一、概述 课程设计目的、意义: 课程设计目的使学生熟悉文件管理系统的设计方法;加深对所学各种文件操作的了解及其操作方法的特点。通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。 主要任务: 模拟文件系统设计是设计和实现一个简单的文件系统。内容包括: 1.建立文件存储介质的管理机制 2.建立目录(采用一级目录结构) 3.文件系统功能(显示目录、创建、删除、打开、关闭、读、写) ~ 4.文件操作接口(显示目录、创建、删除、打开、关闭、读、写) 二、系统设计 课程设计的系统设计: 本系统模拟一个文件管理系统,要完成对文件的基本操作,文件的基本操作有文件、文件夹的打开、新建、删除和读取写入文件,创建更改目录,列出目录内容等信息。系统建立了文件目录树,存储文件系统中的所有文

件。对于用户名下的文件,用文件目录树的分枝来存贮。采用命令行操作界面很直观,也方便用户进行操作,用户只要按照操作界面所显示的命令来操作就行了。 整体设计框架: 系统初始化界面是由创建用户存储空间,管理文件,退出系统三个模块组成。用户创建由创建用户存储空间,进入目录,删除用户存储空间,显示所有用户存储空间,等模块组成。然后各个模块再由一些小模块组成。其中创建文件,打开关闭文件,读写文件等文件操作模块包括在进入目录模块里面。 三、系统实现 课程设计主要内容的实现程序代码: 《 #include <> #include <> #include <> typedef struct file{ char name[10]; struct file *next; }File; typedef struct content{ ! char name[10]; File *file;

操作系统课程设计报告

东莞理工学院 操作系统课程设计报告学院:计算机学院 专业班级:13软件工程1班 提交时间:2015/9/14 指导教师评阅意见: . 项目名称:进程与线程管理功能 一、设计目的 用语言来模拟进程和线程管理系统,加深对进程和线程的理解,掌握对进程和线程各种状态和管理的算法原理。 二、环境条件 系统:WindowsXP、VMWare、Ubuntu Linux 语言:C/C++ 开发工具:gcc/g++、Visual C++ 6.0 三、设计内容 1. 项目背景

计算机的硬件资源有限,为了提高内存的利用率和系统的吞吐量,就要根据某种算法来管理进程和线程的状态从而达到目的。 进程与线程管理功能完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 进程与线程管理功能 基本要求:完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 提高要求:(增加1项就予以加分) (1) 实现多种线程调度算法; (2)通过“公共信箱”进行通信的机制,规定每一封信的大小为128字节,实现两个用户进程之间通过这个“公共信箱”进行通信。 (3) 实现多用户进程并发的虚拟内存管理功能。 (4) 实现用户进程间通信功能,并用生产者/消费者问题测试进程间通信功能的正确性。 (5) 实现改进型Clock页面置换算法。 (6) 实现Cache功能,采用FIFO替换算法。 2. 扩展内容 实现多种线程调度算法:时间片轮转调度算法 四、人员分工 优先级调度算法:钟德新,莫友芝 时间片轮转调度算法:张德华,袁马龙 设计报告由小组队员共同完成。小组成员设计的代码分工如下: 钟德新编写的代码:void Prinft(){ PCB *p; system("cls");//清屏 p=run; //运行队列 if(p!=NULL) { p->next=NULL; } cout<<"当前正在运行的进程:"<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<next; } cout<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<next; } cout<

操作系统课程设计论文

学年论文(课程设计)题目:操作系统课程设计 学院数学与计算机学院 学科门类工学 专业网络工程 学号 姓名 指导教师王煜 年月日

河北大学学年论文(课程设计)任务书 (指导教师用表) 指导教师签字: 系主任签字: 主管教学院长签字: 装 订 线

河北大学学年论文(课程设计)成绩评定表学院:数学与计算机学院 装 订 线

摘要 此系统实现了存储管理、设备管理和进程管理。 存储管理部分主要实现主存空间的分配和回收。存储管理采用可移动的可变分区存储管理方式。采用数组来模拟主存,大小为512个字节。 设备管理主要包括设备的分配和回收。模拟系统中有A、B、C三种独占型设备,A设备3个,B设备2个,C设备1个。设备分配时采用采用先来先服务策略。设备回收时唤醒等待设备的进程。 进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。其中硬件中的中央处理器用不断循环的函数CPU( )模拟,重要寄存器(如:程序状态寄存器PSW、指令寄存器IR)用全局变量模拟,中断的发现是在函数CPU中加检测PSW 的方式来模拟,时钟的模拟通过timer控件实现。进程控制块的模拟通过数组,本系统最多容纳10个。进程调度时采用时间片轮转调度算法,时间片为5。 关键词:存储管理设备管理进程管理时间片

ABSTRACT The system has storage management, equipment management and process management. The storage management has achieved the allocation and recovery of the main memory space. Variable storage management is used as storage management .We simulate the main memory by array, whose size is 512 bytes. The device management, including the distribution and recovery of devicet. We simulate three devices ,A,B,C. the numbers of them are 3,2,1. The distribution of device used to adopt first-come first-service strategy. It awakes the blocking process when the device is recycled. The process management, including scheduling ,creating revocation ,blocking and waking up the process, the realization of the interruption.We simulate the central processing unit by the cycling function named CPU(),simulate the important register by global variable, simulate the recovering of interruption by checking PSW in the function of CPU(),simulate the clock by the timer control. The simulation of the process control block by array, whose number is up to 10. When the scheduling of the process happens, we use the algorithm of time piece rotation scheduling, and the time piece is 5. Key words: storage device process time

操作系统课程设计二级文件系统

操作系统课程设计报告 专业:计算机信息处理 学号:09103408 姓名:纪旻材 提交日期:2011-12-28

【设计目的】 1. 课程设计目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。 2. 结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。 3. 通过对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力 【设计内容】 1、delete 删除文件 2、open 打开文件 3、close 关闭文件 4、write 写文件 【实验环境】 Windows7系统

Visual studio 2010 【相关知识综述】 本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。 首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。 【设计思路】 1 主要数据结构 #define MAXNAME 25 /*the largest length of mfdname,ufdname,filename*/ #define MAXCHILD 50 /*the largest child每个用户名下最多有50个文件*/ #define MAX (MAXCHILD*MAXCHILD) /*the size of fpaddrno*/ typedef struct/*the structure of OSFILE定义主文件*/

操作系统课程设计报告

东莞理工学院 操作系统课程设计报告 学院:计算机学院 专业班级:13软件工程1班 提交时间:2015/9/14 指导教师评阅意见: . 项目名称:进程与线程管理功能 一、设计目的 用语言来模拟进程和线程管理系统,加深对进程和线程的理解,掌握对进程和线程各种状态和管理的算法原理。 二、环境条件

系统:WindowsXP、VMWare、Ubuntu Linux 语言:C/C++ 开发工具:gcc/g++、Visual C++ 6.0 三、设计内容 1. 项目背景 计算机的硬件资源有限,为了提高内存的利用率和系统的吞吐量,就要根据某种算法来管理进程和线程的状态从而达到目的。 进程与线程管理功能完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 进程与线程管理功能 基本要求:完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 提高要求:(增加1项就予以加分) (1) 实现多种线程调度算法; (2)通过“公共信箱”进行通信的机制,规定每一封信的大小为128字节,实现两个用户进程之间通过这个“公共信箱”进行通信。 (3) 实现多用户进程并发的虚拟内存管理功能。 (4) 实现用户进程间通信功能,并用生产者/消费者问题测试进程间通信功能的正确性。 (5) 实现改进型Clock页面置换算法。 (6) 实现Cache功能,采用FIFO替换算法。

2. 扩展内容 实现多种线程调度算法:时间片轮转调度算法 四、人员分工 优先级调度算法:钟德新,莫友芝 时间片轮转调度算法:张德华,袁马龙 设计报告由小组队员共同完成。小组成员设计的代码分工如下:钟德新编写的代码:void Prinft(){ PCB *p; system("cls");//清屏 p=run; //运行队列 if(p!=NULL) { p->next=NULL; } cout<<"当前正在运行的进程:"<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<next; } cout<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<next; } cout<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<

操作系统(一个小型操作系统的设计与实现)课程设计

南通大学计算机科学与技术学院操作系统课程设计报告 专业: 学生姓名: 学号: 时间:

操作系统模拟算法课程设计报告 设计要求 将本学期三次的实验集成实现: A.处理机管理; B.存储器管理; C.虚拟存储器的缺页调度。 设计流程图 主流程图 开始的图形界面 处理机管理存储器管理缺页调度 先来先服务时 间 片 轮 转 首 次 适 应 法 最 佳 适 应 法 先 进 先 出 L R U 算 法

A.处理机调度 1)先来先服务FCFS N Y 先来先服务算法流程 开始 初始化进程控制块,让进程控制块按进程到达先后顺序让进程排队 调度数组中首个进程,并让数组中的下一位移到首位 计算并打印进程的完成时刻、周转时间、带权周转时间 其中:周转时间 = 完成时间 - 到达时间 带权周转时间=周转时间/服务时间 更改计时器的当前时间,即下一刻进程的开始时间 当前时间=前一进程的完成时间+其服务时间 数组为空 结束

2)时间片轮转法 开始 输入进程总数 指针所指的进程是 否结束 输入各进程信息 输出为就绪状态的进程的信息 更改正在运行的进程的已运行时间 跳过已结束的程序 结束 N 指向下一个进程 Y 如果存在下一个进程的话 Y N 输出此时为就绪状态的进程的信息 时间片轮转算法流程图

B.存储器管理(可变式分区管理) 1)首次适应法 分配流程图 申请xkb内存 由链头找到第一个空闲区 分区大小≥xkb? 大于 分区大小=分区大小-xkb,修改下一个空闲区的后向指针内容为(后向指针)+xkb;修改上一个空闲区的前向指针为(前向指针)+xkb 将该空闲区从链中摘除:修改下一个空闲区的后向地址=该空闲区后向地址,修改上一个空闲区的前向指针为该空闲区的前向指针 等于 小于延链查找下 一个空闲区 到链尾 了? 作业等待 返回是 否 登记已分配表 返回分配给进程的内存首地址 开始

操作系统课程设计题目

实验一进程调度 一、实验目的 观察、体会Linux 系统的进程调度方法,并通过一个简单的进程调度模拟程序的实现,加深对进程调度算法,进程切换的理解。 二、实验内容 采用动态优先数的方法,编写一进程调度程序模拟程序。模拟程序只进行相应的调度模拟操作,不需要实际程序。 [提示]: (1) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为: 进程名 指针 要求运行时间 优先数 状态 其中,进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。 指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。 要求运行时间——假设进程需要运行的单位时间数。 优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。 状态——可假设有两种状态,“就绪”状态和“结束”状态。五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。 (2) 在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。 (3) 为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。 (4) 处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优先数就减“1”。由于本实习是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行: 优先数-1 要求运行时间-1 来模拟进程的一次运行。 提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。在这里省去了这些工作。 (5) 进程运行一次后,若要求运行时间?0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间=0,则把它的状态修改成“结束”(E),且退出队列。 (6) 若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,

操作系统课程设计(文件系统)

操作系统课程设计 班级: 姓名: 学号: 使用语言:C++ 指导老师: 学院:

一、系统要求 1、实验目的 通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。 2、实验内容 为linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条); login 用户登陆 dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 (2)列目录时要列出文件名、物理地址、保护码和文件长度; (3)源文件可以进行读写保护。 二、系统分析 1、设计思想 本文件为二级文件系统,即要实现对文件的增删改查,同时又具备登陆系统、注册用户的功能,各个用户之间的文件系统互不干扰。 本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。 系统采用结构体来存储用户、文件目录、文件数据内容: 0 48*5 48*5+44*50 48*5+44*50+264*200 每个分区都是由结构体组成,每个个去的结构体的个数由格式化系统是决定。整个系统的编码构成主要分为:

Allstruct.h 定义了每个分区的结构体; Mysys.h 声明了对系统操作的各种方法; Myuserfile.h 声明了对文件操作的各种方法; Mymain.cpp 整个系统的主函数,操作入口; Mysys.cpp 包含了mysys.h,实现了操作系统的各种方法;Myuserfile.cpp 包含了myuserfile.h,实现了操作文件的各种方法; 2、主要数据结构 Allstruct.h文件的内容: struct s_user //用户区结构体 { long isuse; //是否使用 char name[20]; //用户名 char psd[20]; //密码 long address; //目录地址 }; struct s_list //目录结构体 { long isuse; //是否使用 char name[20]; //文件名字 long myaddress; //本条目录地址 long pointaddress; //指向的文件的地址 long isfile; //是否锁定 long pointsize; //目标文件的大小 long nextaddress; //下条目录的地址 }; struct s_file //文件结构体 { long isuse; //是否使用 char content[256]; //文件内容 long next; //下个文件块地址 };

相关主题