当前位置:文档之家› 操作系统大作业-ufs文件系统

操作系统大作业-ufs文件系统

操作系统大作业-ufs文件系统
操作系统大作业-ufs文件系统

操作系统课程设计

一个用户级文件系统的设计

目录

1、课程设计的主要目的-------------------------------------------3

2、相关的技术背景-----------------------------------------------3

2.1. 文件系统简介--------------------------------------------3

2.2. FUSE简介-----------------------------------------------3

2.3. 解压FUSE-----------------------------------------------4

2.4. 编译并安装FUSE-----------------------------------------5

3、主要思想和技术路线-------------------------------------------5

3.1. 数据结构定义--------------------------------------------5

3.2. 主要函数定义--------------------------------------------5

3.2.1.u_fs函数-------------------------------------------6

3.2.2.base函数-------------------------------------------8

4、测试结果-----------------------------------------------------9

4.1. 创建文件系统-------------------------------------------9

4.2. 文件夹测试--------------------------------------------10

4.3. 文件测试----------------------------------------------11

4.4. 测试格式化功能----------------------------------------12

4.5. 卸载文件系统------------------------------------------12

5、源代码的目录结构及存放位置----------------------------------13

6、运行环境----------------------------------------------------13

1课程设计的主要目的

更加深入地理解文件系统的原理和设计,了解在linux平台下的编程,加强学生动手能力,丰富代码经验。

实现两层目录系统,有以下的要求和限制:

1.根目录可以包含子目录和普通文件

2.子目录只能包含普通文件,不能包括其他子目录

3.所有文件都能可读写(改变模式0666),忽略权限

4.许多文件属性如创建和修改时间不需要准确地储存,

5.文件不能被截断

6.目录看成是文件

2.相关的技术背景

2.1文件系统

文件系统是一种用来存储和组织计算机文件、目录及其包含的数据的方法,它

使文件、目录以及数据的查找和访问得到简化。文件系统能提供丰富的扩展能力。

它可以编写成底层文件系统的一个封装程序,从而对其中的数据进行管理,并提供一个增强的、具有丰富特性的文件系统。

2.2FUSE简介

FUSE是linux平台下使用用户空间的文件系统。我们不需要了解linux内核模块的编程知识,只要利用FUSE提供的文件系统框架,就可以创建自己的功能完备的文件系统。

FUSE主要是由以下的三部分构成:

●内核模块FUSE

●用户空间库libfuse

●mount/umount程序fusermount

在FUSE 中创建一个文件系统,先安装一个FUSE 内核模块,然后使用FUSE 库和API 。

用户空间进程在执行操作文件的系统调用的时候,在内核空间,VFS就会调用各文件系统定义的对应操作函数。FUSE内核模块中被定义的操作函数把和它对应的请求送到实现文件系统的用户空间进程(FUSE文件系统,也就是后台程序),并等待回应。FUSE内核模块和FUSE文件系统间的通信是通过设备文件/dev/fuse进行的。FUSE文件系统把定义的FUSE操作函数群的地址登录到fuse_operations结构体中,并通过把fuse_operations的地址作为参数,调fuse_main()函数

以下的图指出在example/hello的例子中,文件系统调用的路径。

1.打开设备文件/dev/fuse

2.挂载FUSE文件系统

3.做成FUSE文件系统句柄

4.登录FUSE操作函数到FUSE文件系统句柄中

5.登录信号处理器

6.执行事件循环

A) 从设备文件/dev/fuse中读取来自内核模块的请求

B) 执行和这个请求对应的操作函数

C) 写入返回给内核模块的应答到设备文件/dev/fuse中

7.卸载FUSE文件系统

在库函数fuse_main()中,执行以下的动作。

API库里定义的接口如getattr, mknod,mkdir,unlink等包含在./include/fuse.h头文件里。

2.3解压FUSE

要开发一个文件系统,首先请下载FUSE 的源代码并展开这个包:tar -zxvf fuse-2.7.0.tar.gz。这会创建一个 FUSE 目录,其中保存的是源代码。fuse-2.7.0 目录的内容如下:

./doc包含了与 FUSE 有关的文档。现在,这只有一个文件 how-fuse-works。

./kernel包含了 FUSE 内核模块的源代码(对于使用 FUSE 开发文件系统来说,您当然不用懂得这些代码的机制)。

./include包含了 FUSE API 头,您需要这些文件来创建文件系统。您现在唯一需要的就是 fuse.h。

./lib中存放的是创建 FUSE 库的源代码,您需要将它们与您的二进制文件链接在一起来创建文件系统。

./util中存放的是 FUSE 工具库的源代码。

./example当然包含的是一些供您参考的例子,例如 fusexmp.null 和 hello 文件系统。

2.4编译并安装FUSE

在 fuse-2.7.0 目录中运行 configure 脚本: ./configure。这会创建所需要的makefile 等内容。

运行 ./make 来编译库、二进制文件和内核模块。查看kernel 目录中的文件 ./kernel/fuse.ko ——这是内核模块文件。还要查看 lib 目录中的 fuse.o、mount.o 和 helper.o。

运行 ./make install 完成 FUSE 的安装。

重要提示:在编译 FUSE 时,系统中需要有内核头文件或源代码。为了简单起见,请确保将内核源代码放到 /usr/src/ 目录中。

3主要思想和技术路线

3.1数据结构定义

测试时分配了1K * 5K = 5M空间,共10240块。

超级块super block

超级块一定是文件系统的第一块,描述了整个文件系统,结构定义如下:

struct sb {

long fs_size; //整个文件系统的块数

long first_blk; //根目录所在的第一块

long bitmap; //位图块大小

}

目录Directory

目录应看做文件。每个目录下包含一个u_fs_directory_entry结构的表。在本文件系统没有对目录个数作出限制,但要注意文件名不得超过8字节,拓展名不超过3字节。

struct u_fs_file_directory {

char fname[MAX_FILENAME + 1]; //文件名

char fext[MAX_EXTENSION + 1]; //拓展名

size_t fsize; //大小

long nStartBlock; //起始块

int flag; //类型:0-未使用 1-文件 2-目录}

文件Files

文件存储在单一、预分配的虚拟磁盘上,每个虚拟块大小为512字节。

struct u_fs_disk_block {

size_t size; //该块用了多少字节

long nNextBlock; //下一块的指针

char data[MAX_DATA_IN_BLOCK]; //可用的虚拟存储空间

};

3.2主要函数定义

3.2.1.u_fs函数定义

fuse_operation 结构中用到的函数

struct fuse_operations {

int (*getattr) (const char *, struct stat *);

int (*readdir) (const char *, fuse_dirh_t, fuse_dirfil_t);

int (*mknod) (const char *, mode_t, dev_t);

int (*mkdir) (const char *, mode_t);

int (*unlink) (const char *);

int (*rmdir) (const char *);

int (*open) (const char *, struct fuse_file_info *);

int (*read) (const char *, char *, size_t, off_t, struct fuse_file_info *);

int (*write) (const char *, const char *, size_t, off_t,struct fuse_file_info *);

int (*flush) (const char *, struct fuse_file_info *);

int (*truncate) (const char *, off_t);

int (*init) (struct fuse_conn_info *);

};

int (*getattr) (const char *, struct stat *);

/*这个函数与 stat() 类似。st_dev 和 st_blksize 域都可以忽略。st_ino 域也会被忽略,除非在执行 mount 时指定了 use_ino 选项。*/

int (*readdir) (const char *, fuse_dirh_t, fuse_dirfil_t);

/*这个函数会读取一个目录中的内容。这个操作实际上是在一次调用中执行 opendir()、readdir()、closedir() 序列。对于每个目录项来说,都应该调用 filldir() 函数。*/

int (*mknod) (const char *, mode_t, dev_t);

/*这个函数会创建一个文件节点。此处没有 create() 操作;mknod() 会在创建非目录、非符号链接的节点时调用。*/

int (*mkdir) (const char *, mode_t);

int (*rmdir) (const char *);

/*这两个函数分别用来创建和删除一个目录。 */

int (*unlink) (const char *);

/*这个函数用来删除一个文件。 */

int (*open) (const char *, struct fuse_file_info *);

/*这是文件的打开操作。对 open() 函数不能传递创建或截断标记(O_CREAT、O_EXCL、O_TRUNC)。这个函数应该检查是否允许执行给定的标记的操作。另外,open() 也可能在fuse_file_info 结构中返回任意的文件句柄,这会传递给所有的文件操作。)*/

int (*read) (const char *, char *, size_t, off_t, struct fuse_file_info *);

/*这个函数从一个打开文件中读取数据。除非碰到 EOF 或出现错误,否则 read() 应该返回所请求的字节数的数据;否则,其余数据都会被替换成 0。一个例外是在执行 mount 命令时指定了 direct_io 选项,在这种情况中 read() 系统调用的返回值会影响这个操作的返回值。*/

int (*write) (const char *, const char *, size_t, off_t, struct fuse_file_info *); /*这个函数将数据写入一个打开的文件中。除非碰到 EOF 或出现错误,否则 write() 应该返回所请求的字节数的数据。一个例外是在执行 mount 命令时指定了 direct_io 选项(这于 read() 操作的情况类似)。*/

int (*flush) (const char *, struct fuse_file_info *);

/*这表示要刷新缓存数据。它并不等于 fsync() 函数——也不是请求同步脏数据。每次对一个文件描述符执行 close() 函数时,都会调用 flush();因此如果文件系统希望在close() 中返回写错误,并且这个文件已经缓存了脏数据,那么此处就是回写数据并返回错误的好地方。由于很多应用程序都会忽略 close() 错误,因此这通常用处不大。*/

int (*truncate) (const char *, off_t);

/*这个函数用来修改文件的大小。*/

int (*init) (struct fuse_conn_info *);

/*这个函数用来对加载的文件系统初始化,如:获得文件系统的大小。*/

3.2.2.base函数定义

为u_fs的FUSE用户操作提供底层操作,在base.c定义供u_fs调用。

int op_read_blk(long blk,u_fs_disk_block * content);

//读取块中的内容

int op_write_blk(long blk,u_fs_disk_block * content);

//往块中写入内容

int op_search_free_blk(int num,long* start_blk);

//寻找空闲块,采用首次匹配法

int op_set_blk(long blk,int flag);

//设置块的flag位

int op_create(const char *, int flag);

op_create( )

//函数把创建目录和文件统一起来。

int op_open(const char * org_path, u_fs_file_directory *attr);

op_open( )

/*返回要打开的目录或文件的u_fs_file_directory记录,根据此记录可以知道目录或文件所在的数据块,大小等属性,以备调用的函数使用。*/

int op_setattr(const char* org_path, u_fs_file_directory * attr);

op_setattr( )

/*更改文件或目录的u_fs_file_directory记录。在删除文件或目录,使用此函数可使flag 设为0。在写文件时,调用此函数可以更改文件的大小。*/

int op_rm(const char *path,int flag);

op_rm( )

/*函数把删除目录和文件统一起来。删除时,要把对应的数据块释放;把u_fs_file_directory记录的flag标记为0。*/

4测试结果

注意:

cy采用宏定义,即在u_fs.h里对路径进行定义。

现定义为#define UFS_ISO “/home/chenyue/aimao/ufs_iso”

此值应根据不同系统改成对应的绝对路径。

4.1创建文件系统

1.分配磁盘空间

dd bs=1K count=5K if=/dev/zero of=./ufs_iso

2.格式化磁盘空间

./u_fs_init

3.创建装载位置

mkdir cy 装载ufs_iso文件系统到cy文件夹,发现在位置一栏新增了“cy”盘。./u_fs cy

4.查看cy文件夹内容,发现为空

ls –al cy

4.2文件夹测试

5.进入文件系统

cd cy

6.创建超长文件夹,操作不允许

mkdir abcdefighijk

7.创建普通文件夹

mkdir rootdir

8.进入刚创建的dir文件夹

cd rootdir

9.创建子文件夹,操作不允许

mkdir leftdir

4.3文件测试

10.退回到根目录,查看不存在的文件,提示错误

cd ..

cat file

11.创建并编辑文件,添加“Hello,world!!!”内容

gedit hello

12.查看hello文件

cat hello

13.测试获取文件列表的功能

ls –al

14.删除不存在的文件nofile

rm nofile

15.删除存在的文件hello,并查看

rm hello

ls –al

4.4格式化功能测试

16.回到文件系统父目录,查看已有文件

ls –al cy

17.格式化

./u_fs_init

18.再次查看,发现已经清空

ls –al cy

4.5卸载文件系统

19.卸载文件系统

fusermount –u cy

文件系统已经卸载

5源代码的目录结构及存放位置源码包含:

6运行环境

系统:Ubuntu9.04

编译器:gcc

附加库:fuse-2.7.0

(完整版)操作系统毕业课程设计说明书-基于Linux的模拟文件系统的设计与实现

中北大学 操作系统课程设计 说明书 学院、系:软件学院 专业:软件工程 学生姓名:徐春花学号: 设计题目:基于Linux的模拟文件系统的设计与实现 起迄日 期: 2014年6月14日- 2014年6月26日指导教薛海丽

师: 2014 年 6月 26 日 前言 简单地说,Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intel x86系列CPU的计算机上。这个系统是由世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。 Linux不仅为用户提供了强大的操作系统功能,而且还提供了丰富的应用软件。用户不但可以从Internet上下载Linux及其源代码,而且还可以从Internet上下载许多Linux的应用程序。可以说,Linux本身包含的应用程序以及移植到Linux上的应用程序包罗万象,任何一位用户都能从有关Linux的网站上找到适合自己特殊需要的应用程序及其源代码,这样,用户就可以根据自己的需要下载源代码,以便修改和扩充操作系统或应用程序的功能。这对Windows NT、Windows98、MS-DOS或OS2

等商品化操作系统来说是无法做到的。 Linux具有:稳定、可靠、安全的优点,并且有强大的网络功能。其中有对读、 写进行权限控制、审计跟踪、核心授权等技术,这些都为安全提供了保障。在相关软 件的支持下,可实现WWW、FTP、DNS、DHCP、E-mail等服务,还可作为路由器 使用,利用IPCHAINSIPTABLE网络治理工具可构建NAT及功能全面的防火墙。 Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系 统。Linux操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑 器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的X-Windows图形 用户界面,如同我们使用Windows NT一样,允许我们使用窗口、图标和菜单对系 统进行操作。 目录 1需求分析 (3) 1.1 功能介绍 (3) 1.2 目的及意义 (5) 1.2.1 目的 (5) 1.2.2 意义 (6) 1.3 设计成果 (7) 2总体设计 (8) 2.1功能介绍 (8) 2.2模块关联 (9) 3详细设计 (12)

2020批次操作系统大作业

20200415批次操作系统 1.现代操作系统一般都提供多任务的环境,试回答以下问题。 (1) 为支持多进程的并发执行,系统必须建立哪些关于进程的数据结构? (2) 为支持进程的状态变迁,系统至少应该供哪些进程控制原语? (3) 当进程的状态变迁时,相应的数据结构发生变化吗? (1)为支持多进程的并发执行,系统必须建立哪些关于进程的数据结构? 答:为支持进程的并发执行,系统必须建立“进程控制块(PCB)”, PCB的组织方式常用的是链接方式。 (2)为支持进程的状态变迁,系统至少应该供哪些进程控制原语? 答:进程的阻塞与唤醒原语和进程的挂起与激活原语。 (3)当进程的状态变迁时,相应的数据结构发生变化吗? 答:创建原语:建立进程的PCB,并将进程投入就绪队列。; 撤销原语:删除进程的PCB,并将进程在其队列中摘除; 阻塞原语:将进程PCB中进程的状态从运行状态改为阻塞状态,并将进 程投入阻塞队列; 唤醒原语:将进程PCB中进程的状态从阻塞状态改为就绪状态,并将进 程从则色队列摘下,投入到就绪队列中。 现代操作系统一般都提供多进程(或称多任务)运行环境,回答以下问题: 为支持多进程的并发执行,系统必须建立哪些关于进程的数据结构 正确答案 为支持多进程的并发执行,系统为每个进程建立了一个数据结构:进程控制块(PCB),用于进程的管理和控制。PCB中记录了有关进程的一些描述信息和控制信息,包括进程标识符、进程当前的状态、优先级、进程放弃CPU时的现场信息,以及指示组成进程的程序和数据在存储器中存放位置的信息、资源使用信息、进程各种队列的连接指针和反映进程之间的隶属关系的信息等。 现代操作系统一般都提供多进程(或称多任务)运行环境,回答以下问题: 为支持进程状态的变迁,系统至少应提供哪些进程控制原语

操作系统文件管理实验报告

操作系统实验报告实验名称:文件管理 专业班级:网络工程1301 学号: 姓名: 2015 年6 月16 日

实验一文件管理 一、实验目的 文件管理是操作系统的一个非常重要的组成部分。学生应独立用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。 二、预备知识 1.VS2010的使用 2.C#的学习 3.文件主目录与子目录的理解 三、实验容与步骤 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。要求设计一个10 个用户的文件系统,每次用户可保存10 个文件,一次运行用户可以打开5 个文件。系统能够检查打入命令的正确性,出错时能显示出错原因。对文件必须设置保护措施,例如只能执行,允许读等。在每次打开文件时,根据本次打开的要求,在此设置保护级别,即有二级保护。文件的操作至少有Create、delete、open、close、read、write 等命令。 所编写的程序应采用二级文件目录,即设置主文件目录和用户文件目录。前者应包含文件主及它们的目录区指针;后者应给出每个文件占有的文件目录,即文件名,保护码,文件长度以及它们存放的位置等。另外为打开文件设置运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。 程序流程图:

逻辑设计: 使用线性数组表表示MFD,泛型数组表示UFD,每个元素包括用户ID、保存的文件数、再使用线性表表示文件信息,每个元素包括文件名,文件属性(保护码),文件的状态等信息。 物理设计: //主目录 private FileUser[] mfd; //当前用户 private FileUser currentuser; ///

/// 文件 /// public class FileObject { public string filename; public int size=20; public int read=0; public int write = 0; public string author; } /// /// 文件系统用户 /// public class FileUser { public string username;

操作系统简单文件系统设计及实现

简单文件系统的设计及实现 一、实验目的: 1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解 2、要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。 二、实验内容: 1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。 2、程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。 3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作 4、算法与框图 ?因系统小,文件目录的检索使用了简单的线性搜索。 ?文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。 ?程序中使用的主要设计结构如下:主文件目录和用户文件目录( MFD、UFD); 打开文件目录( AFD)(即运行文件目录) 文件系统算法的流程图如下

三、工具/准备工作: 在开始本实验之前,请回顾教科书的相关内容。并做以下准备: 1) 一台运行Windows 2000 Professional或Windows 2000 Server的操作系统的计算机。 2) 计算机中需安装Visual C++ 6.0专业版或企业版 四、实验要求: (1)按照学校关于实验报告格式的要求,编写实验报告(含流程图); (2)实验时按两人一组进行分组,将本组认为效果较好的程序提交检查。

大工19秋《操作系统》大作业题目及要求

学习中心: 专业: 年级:年春/秋季 学号: 学生: 题目: 1.谈谈你对本课程学习过程中的心得体会与建议? 2.《操作系统》课程设计,从以下5个题目中任选其一作答。 《操作系统》课程设计 注意:从以下5个题目中任选其一作答。 总则:不限制编程语言,可以选用C/C++等(具体工具平台及语言可以自己根据自己的习惯选用,不必完全按照上述技术要求) 作业提交: 大作业上交时文件名写法为:[姓名奥鹏卡号学习中心](如:戴卫东101410013979浙江台州奥鹏学习中心[1]VIP) 以附件word文档形式上交离线作业(附件的大小限制在10M以内),选择已完成的作业(注意命名),点提交即可。如下图所示。

注意事项: 独立完成作业,不准抄袭其他人或者请人代做,如有雷同作业,成绩以零分计! 题目一:页面置换算法FIFO算法 要求:(1)撰写一份word文档,里面包括(算法思路、算法数据结构、主要函数代码、测试案例)章节。 (2)算法思路:FIFO为先进先出算法,简单介绍该算法 的基本思想,100字左右即可。 (3)算法数据结构:列出主要用的数据结构,比如存储页 面号序列page[],存储装入物理块中的页面memery[]等, 只需要列出数据结构名称即可。 (4)主要函数代码:列出先进先出页面置换算法的代码。 不需要列出主函数。 (5)给出一个测试案例即可,比如设置物理块个数为3, 页面序号7 0 1 2 3 0 4 2 3,代码应列出算法 置换的具体细节。 题目二:页面置换算法LRU算法 要求:(1)撰写一份word文档,里面包括(算法思路、算法数据结构、主要函数代码、测试案例)章节。 (2)算法思路:LRU为最近最久未使用算法,简单介绍

操作系统实验5文件系统:Linux文件管理

实验5 文件系统:Linux文件管理 1.实验目的 (1)掌握Linux提供的文件系统调用的使用方法; (2)熟悉文件和目录操作的系统调用用户接口; (3)了解操作系统文件系统的工作原理和工作方式。 2.实验内容 (1)利用Linux有关系统调用函数编写一个文件工具filetools,要求具有下列功能:*********** 0. 退出 1. 创建新文件 2. 写文件 3. 读文件 4. 复制文件 5. 修改文件权限 6. 查看文件权限 7. 创建子目录 8. 删除子目录 9. 改变当前目录到指定目录 10. 链接操作 *********** 代码: #include #include #include #include #include #include #include #include void menu(void); void openfile(void); void writefile(void); void readfile(void); void copyfile(void); void chmd(void); void ckqx(void); void cjml(void); void scml(void); void ggml(void); void ylj(void); int main() { int choose; int suliangjin=1;

menu(); scanf("%d",&choose); while(choose!=0) { switch(choose) { case 1:openfile();break; case 2:writefile();break; case 3:readfile();break; case 4:copyfile();break; case 5:chmd();break; case 6:ckqx();break; case 7:cjml();break; case 8:scml();break; case 9:ggml();break; case 10:ylj();break; } menu(); scanf("%d",&choose); } return 0; } void menu(void) { printf("文件系统\n"); printf("1.创建新文件\n"); printf("2.写文件\n"); printf("3.读文件\n"); printf("4.复制文件\n"); printf("5.修改文件权限\n"); printf("6.查看文件权限\n"); printf("7.创建子目录\n"); printf("8.删除子目录\n"); printf("9.改变目前目录到指定目录\n"); printf("10.链接操作\n"); printf("0.退出\n"); printf("请输入您的选择...\n"); } void openfile(void) { int fd; if((fd=open("/tmp/hello.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0) perror("open");

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

操作系统课程设计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)给出数据定义和详细说明; struct block_s{ /* 该块的实际长度,不包括block_s的大小。 */ int length; /* 申请该块的作业,为0表示该块空闲。 */ int owner; /* 当该块是空闲块时,offset表示下一空闲块的偏移,offset为TOTAL_BYTE表示该块是最后一个空闲块。 当该块非空闲块时,offset表示作业实际申请的大小。 */ int offset; }; 2)给出实现思想和设计流程; 该算法遍历空闲链表,找第一个大小能满足要求的块。 然后,若找到的块足够大,再把该块切成两块,返回第一块给调用者;把第二块加到空闲区链表中。

该算法遍历整个空闲链表,找一个大小能满足要求的块。并且该块是所有能满足要求的空闲块中,大小最小的块。 然后,若找到的块足够大,再把该块切成两块,返回第一块给调用者;把第二块加到空闲区链表中。 3)调试完成源程序; #include "stdio.h" #include #include #define n 10 /*假定系统允许的最大作业为n,假定模拟实验中n值为10*/

#define m 10 /*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/ #define minisize 100 struct { float address; /*已分分区起始地址*/ float length; /*已分分区长度,单位为字节*/ int flag; /*已分配区表登记栏标志,用"0"表示空栏目*/ }used_table[n]; /*已分配区表*/ struct { float address; /*空闲区起始地址*/ float length; /*空闲区长度,单位为字节*/ int flag; /*空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配*/ }free_table[m]; /*空闲区表*/ allocate(char J,float xk) { /*采用最优分配算法分配xk大小的空间*/ int i,k; float ad; k=-1; for(i=0;i=xk&&free_table[i].flag==1) if(k==-1||free_table[i].length

实验四 文件系统实验报告

实验四文件系统实验 一 . 目的要求 1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。 2、要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。 二 . 例题: 1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。 2、程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。 3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。 4、算法与框图: ①因系统小,文件目录的检索使用了简单的线性搜索。 ②文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。 ③程序中使用的主要设计结构如下: 主文件目录和用户文件目录( MFD、UFD) 打开文件目录( AFD)(即运行文件目录)

文件系统算法的流程图如下: 三 . 实验题: 1、增加 2~3个文件操作命令,并加以实现。(如移动读写指针,改变文件属性,更换文件名,改变文件保护级别)。 #include #include #include #include #define MAXSIZE 100 #define ADDSIZE 50 #define PT elem+l-> length #define N 4 typedef struct term{/*班级和学期的结构体*/ char class1[10]; char term1[10]; }term; typedef struct student{/*学生成绩信息的结构体*/ term st;/*班级和学期结构体放于此结构体中*/ char num[10]; char name[12]; float course[4]; float total; float average; int bit; }lnode,*stu; typedef struct{ lnode *elem;/*指向上个结构体的指针*/ int size;/*最大能放lnode结构体成员的个数*/ int length;/*当前长度*/ }sqack,*sq; sqack *l; void init(void)/*动态分配存储空间*/ { l-> elem=(stu)malloc(MAXSIZE*sizeof(lnode)); l-> length =0; l-> size=MAXSIZE; } void input(void)/*输入学生的信息*/ { lnode *newbase,*p; char cla[10],ter[10],ch; int n,i; if(l-> length> =l-> size){ newbase=(stu)realloc(l-> elem,(l-> size +ADDSIZE)*sizeof(lnode));/*追加存储空间*/ l-> elem =newbase; l-> size +=ADDSIZE; } p=l-> elem; do { printf( "输入班级和学期(学期用这种格式,如2005年上学期2005 1,2005年下学期2005 2;先输入班级,回车后再输入学期)\n "); gets(cla); gets(ter); printf( "要输入多少个名单?"); scanf( "%d ",&n); printf( "输入学生的成绩\n学号\t姓名\t科目1\t科目2\t科目3\t科目4\n "); for(i=0;i num ,p-> name,p-> course[0],p-> course[1],p-> course[2],p-> course[3]); strcpy(p-> st.class1,cla); strcpy(p-> st.term1,ter); ++l-> length ; } printf( "要继续吗?(y/n) ");

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

目录 第1章需求分析 (1) 第2章概要设计 (1) 系统的主要功能 (1) 系统模块功能结构 (1) 运行环境要求 (2) 数据结构设计 (2) 第3章详细设计 (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个默认的用户名,前面是用户名,后面为密码,用户登陆时只要输入正确便可进入系统,否则提示失败要求重新输入。 users usrarray[8] = { "usr1","usr1", "usr2","usr2", "usr3","usr3", "usr4","usr4",

计算机控制系统大作业 - 副本

计算机控制系统大作业 农电2013级 (答题纸作答,附图粘在答题纸上,答案要求全部手写)1、简述开环控制系统、闭环控制系统的定义。(6分) 如果系统的输出端与输入端之间不存在反馈,也就是控制系统的输出量不对系统的控制产生任何影响,这样的系统称开环控制系统。 由信号正向通路和反馈通路构成闭合回路的自动控制系统,称为闭环控制系统。 二者相比,开环控制系统的结构要简单的多,同时也比较经济。闭环系统也具有一系列优点,由于闭环控制系统拥有反馈通路,不管出于什么原因(外部扰动或系统内部变化),只要被控制量偏离规定值,就会产生相应的控制作用去消除偏差。因此,它具有抑制干扰的能力,对元件特性变化不敏感,并能改善系统的响应特性。 2、简述计算机控制系统的组成与基本工作原理。(10分) 计算机控制系统由控制部分和被控对象组成,其控制部分包括硬件部分和软件部分,这不同于模拟控制器构成的系统只由硬件组成。计算机控制系统软件包括系统软件和应用软件。系统软件一般包括操作系统、语言处理程序和服务性程序等,它们通常由计算机制造厂为用户配套,有一定的通用性。应用软件是为实现特定控制目的而编制的专用程序,如数据采集程序、控制决策程序、输出处理程序和报警处理程序等。它们涉及被控对象的自身特征和控制策略等,由实施控制系统的专业人员自行编制。 计算机控制系统的工作原理: 实时数据采集:对来自测量变送装置的被控量的瞬时值进行检测和输入 实施控制决策:对采集到的被控量进行分析和处理并按已定的控制规律决定将要采取的控制行为。 实时控制输入:根据控制决策,实时的对执行机构发出控制信号,完成控制任务 3、列举计算机控制系统的典型型式。(6分) (1)操作指导控制系统优点:结构简单,控制灵活,安全。缺点:由人工操作,速度受到限制,不能控制多个对象。 (2)直接数字控制系统(DDS)优点:实时性好,可靠性高,适应性强。 (3)监督控制系统(SCC)优点:生产过程始终处于最优工况。 (4)分散控制系统(DCS)优点:分散控制、集中操作、分级管理、分而自治和综合协调。 (5)现场总线控制系统(FCS)优点:与DCS相比,降低了成本,提高了可靠性。国际标准统一后,可实现真正的开放式互联系统结构。 4、什么是串模干扰,有哪些抑制方法(12分) 所谓串模干扰就是干扰源Vc串联于信号源Vs之中。或者简单地认为它是与被测信号迭加在一起的干扰。在输入回路中它与被测信号所处的地位完全相同。串模干扰也称横向干扰或差模干扰。

操作系统实验---文件系统

实验报告 实验题目:文件系统 姓名: 学号: 课程名称:操作系统 所在学院:信息科学与工程学院 专业班级:计算机 任课教师:

实验项目名称文件系统 一、实验目的与要求: 1、通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及其内部实现。 2、熟悉文件管理系统的设计方法,加深对所学各种文件操作的了解及其操作方法的特点。 3、通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。 4、通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。 二、实验设备及软件: 一台PC(Linux系统) 三、实验方法(原理、流程图) 试验方法 (1)首先应当确定文件系统的数据结构:主目录、子目录以及活动文件等。主目录和子 目录都以文件的形式存放于磁盘,这样便于查找和修改。 (2)用户创建文件,可以编号存储于磁盘上。如file0,file1,file2…并以编号作为物理地 址,在目录中登记。 文件系统功能流程图 图1.文件系统总体命令分析

图 2.登录流程图图 3. ialloc流程图 图4.balloc流程图图5.密码修改流程图

图6.初始化磁盘 图 7.显示所有子目录 dir/ls 操作流程图

图8.创建文件 creatfile 、创建目录 mkdir 流程图 图9.改变当前路径 cd 操作流程图

实验原理 1.文件操作 ◆mkdir 创建目录文件模块,输入 mkdir 命令,回车,输入文件名,回车,即会在当前目录文件下创建一个名为刚刚输入的文件名的目录文件。在该创建过程中首先要判断该目录中有没有同名的文件,如果有的话就创建失败,还要判断在该目录下有没有创建文件的权限,有权限才可以创建。具体流程图查看第二节,系统流程图设计部分。 ◆del 删除文件模块,输入 del命令,回车,输入文件名,回车,即会在当前目录文件下删除一个名为刚刚输入的文件名的数据文件。在该删除过程中要判断该目录中是否存在该文件,如果不存在就没有必要执行该操作了,还要判断在该目录下有没有删除文件的权限,有权限才可以删除。具体流程图查看第二节,系统流程图设计部分。 ◆ls 显示当前目录下所有目录的模块,输入 ls 命令,回车 ,即会在屏幕上显示当前目录下的所有目录。在该过程中要判断该目录中是否为空,如果为空就没有必要执行该操作了。执行操作时,要调用 readdir (INode inode )函数 ,先读入文件内容到 content 里面,然后直接输出。如果子目录里面还有子目录,则通过递归,一并输出来。具体流程图查看第二节,系统流程图设计部分。 ◆chmod 改变文件权限模块,输入 chmod 命令,回车,输入文件名,回车,即会根据不同类别的用户在屏幕上提示要改变哪一类用户的权限。如果是文件拥有者执行该操作,他可以选择修改自己、其他用户的权限;如果是文件所属组成员执行该操作,他可以选择修改自己、其他用户的权限;如果是其他用户执行该操作,他只能选择修改自己的权限;在该过程中要判断该目录中是否存在该文件,如果不存在就没有必要执行该操作了。执行操作时,要判断对该文件有没有执行写操作的权利,没有就不能进行。具体流程图查看第二节,系统流程图设计部分。 ◆cd 改变当前所在目录的模块。输入 cd,回车,相应的字符串,回车,则会根据输入字符串的不同跳转到不同的目录下。如果字符串是‘ .’ ,则到当前目录;如果字符串是‘ ..’ ,则到父目录;如果字符串是‘/’ ,则到根目录;如果字符串是当前目录下的子目录,则到该子目录;如果字符串是一个决定路径,则到该绝对路径。当然在执行的时候要判断有没有该子目录或者该绝对路径,如果没有的话,就不能执行。具体流程图查看第二节,系统流程图设计部分。 2. 用户操作 ◆login 用户注销模块,输入 login ,回车,当前用户就退出了,需要重新登录。 ◆pw 用户修改口令模块,输入 pw ,回车,则会提示输入原始密码,输入正确了才可以提示输入新密码,并且要求新密码输入两次,两次一样了才能通过修改密码成功。具体流程图查看第二节,系统流程图设计部分。 ◆logout 用户退出系统模块,输入 logout ,回车,系统自动退出。

操作系统大作业

操作系统实验报告

进程调度实验 一.实验题目 用C语言编写和调试一个进程调度程序,模拟进程调度过程。调度算法采用优先数算法和先来先服务算法。 二.目的要求 1.把理论与实践紧密结合,加深对进程的概念及进程调度算法的理解。取 得较好的学习效果 2.加深对操作系统课程的理解。使学生更好地掌握操作系统的基本概念、 基本原理、及基本功能,具有分析实际操作系统、设计、构造和开发现代 操作系统的基本能力。 3.培养学生的系统程序设计能力。 三.实验内容 设计一个有N个进程并行的进程调度程序。其中: 1)进程调度算法:采用最高优先数优先的调度算法分配处理机和先来先服 务算法来排队,总的过程采用时间片轮转算法。 2)每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息: 进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态。 3)进程的优先数及需要的运行时间可以事先人为地指定。进程的到达时间 为进程输入的时间。 4)进程的运行时间以时间片为单位进行计算。 5)每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish) 三种状态之一。 6)就绪进程获得CPU后都只能运行一个时间片。用已占用CPU时间加1来 表示。 7)果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间, 则撤消该进程;如果运行一个时间片后进程的已占用CPU时间还未达所 需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数 减1(即降低一级),然后把它插入相应优先级就绪队列等待CPU。 8)每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。 9)重复以上过程,直到所要进程都完成为止。

操作系统实验文件管理C 代码

#include #include #include #include #include using namespace std; #define BLKSIZE 512 // 数据块的大小 #define BLKNUM 512 // 数据块的块数 #define INODESIZE 32 // i节点的大小 #define INODENUM 32 // i节点的数目 #define FILENUM 8 // 打开文件表的数目//用户 typedef struct { char user_name[10]; // 用户名 char password[10]; // 密码 } User; //i节点 typedef struct { short inum; // 文件i节点号 char file_name[10]; // 文件名

char type; // 文件类型 char user_name[10]; // 文件所有者 short iparent; // 父目录的i节点号 short length; // 文件长度 short address[2]; // 存放文件的地址 } Inode; //打开文件表 typedef struct { short inum; // i节点号 char file_name[10]; // 文件名 short mode; // 读写模式(1:read, 2:write, // 3:read and write) } File_table; // 申明函数 void login(void); void init(void); int analyse(char *); void save_inode(int); int get_blknum(void); void read_blk(int); void write_blk(int);

操作系统大作业

操作系统试验报告 姓名: 学号: 学院:

实验一 实验要求: 获得当前系统中正在运行的所有进程的优先级。 实验程序: //实验一:获取当前系统的所有优先级 # include # include # include // 当在用户模式机内核模式下都提供所耗时间时,在内核模式下进行所耗时间的64位计算的帮助方法 DWORD GetKernelModePercentage(const FILETIME & ftKernel, const FILETIME & ftUser) { // 将FILETIME结构转化为64位整数 ULONGLONG qwKernel = ( ( (ULONGLONG) ftKernel.dwHighDateTime) << 32) + ftKernel.dwLowDateTime; ULONGLONG qwUser = ( ( (ULONGLONG) ftUser.dwHighDateTime) << 32) + ftUser.dwLowDateTime; // 将消耗时间相加,然后计算消耗在内核模式下的时间百分比 ULONGLONG qwTotal = qwKernel + qwUser; DWORD dwPct = (DWORD) ( ( (ULONGLONG) 100*qwKernel) / qwTotal) ; return(dwPct) ; } // 以下是将当前运行进程名和消耗在内核模式下的时间百分数都显示出来的应用程序 void main() { // 对当前系统中运行的进程拍取"快照" HANDLE hSnapshot = :: CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, // 提取当前进程 0) ; // 如果是当前进程,就将其忽略 // 初始化进程入口 PROCESSENTRY32 pe; :: ZeroMemory(&pe, sizeof(pe) ) ; pe.dwSize = sizeof(pe) ;

计算机操作系统实验-文件管理

哈尔滨工业大学计算机科学与技术学院 实验报告 课程名称:操作系统 课程类型:必修 实验项目名称:文件管理 实验题目:设计一个多用户的文件系统 班级:实验学院一班 学号:6040310110 姓名:张元竞 设计成绩报告成绩指导老师

一、实验目的 随着社会信息量的极大增长,要求计算机处理的信息与日俱增,涉及到社会生活的各个方面。因此,文件管理是操作系统的一个非常重要的组成部分。学生应独立用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。 二、实验要求及实验环境 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。要求设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。系统能够检查打入命令的正确性,出错时能显示出错原因。对文件必须设置保护措施,例如只能执行,允许读等。在每次打开文件时,根据本次打开的要求,在此设置保护级别,即有二级保护。文件的操作至少有Create、delete、open、close、read、write等命令。 所编写的程序应采用二级文件目录,即设置主文件目录和用户文件目录。前者应包含文件主及它们的目录区指针;后者应给出每个文件占有的文件目录,即文件名,保护码,文件长度以及它们存放的位置等。另外为打开文件设置运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。 三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)

操作系统实验-文件系统设计

文件系统设计 1.目的和要求 本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。 实验要求: ①在系统中用一个文件来模拟一个磁盘; ②此系统至少有:Create、delete、open、close、read、write等和部分文件属性的功能。 ③实现这个文件系统。 ④能实际演示这个文件系统。基本上是进入一个界面(此界面就是该文件系统的界面)后,可以实现设计的操作要求。 2.实验内容 1)设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。 2)程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。另外,为打开文件设置了运行文件目录(AFD)。 3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。 4)因系统小,文件目录的检索使用了简单的线性搜索。 5)文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。 6)程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD),打开文件目录(AFD)即运行文件目录。 3.实验环境 VC 6.0 4.实验提示 1) format 格式化

只写打开模拟文件,初始化超级快,初始化dinode 位图 block 位图,初始化主目录,初始化etc 目录,初始化管理员admin 目录,初始化用户xiao 目录,初始化 用户passwd 文件,写入模拟硬盘文件。 2 )install 安装 读写打开模拟文件,读取dinode 位图 block 位图,读取主目录,读取etc 目录,读取管理员admin 目录,读取用户xiao 目录,读取 用户passwd 文件。 3 )login 登陆 用户输入用户名和密码,在passwd 文件中查找是否有此用户,核对密码。正确则登陆成功,当前目录设定到当前用户文件夹下。 Login 登录 结束是,登录成功 输入用户名 查找是否有改 用户名 输入密码是 否 密码是否正确 否 4 )ialloc 申请inode 空间 先检测inode 位图是否加锁,是则退出。加锁,检测inode 空间是否还有已满,是则退出。在inode 位图中顺序查找空闲的inode ,找到则返回inode 地址,block 解锁。函数结束。

操作系统大作业

操作系统大作业 Java语言实现 班级:08级计二班 姓名:湖南科技大学 作业一:生产者与消费者——多线程与同步问题class MyThread { int id; MyThread(int id) { = id; } public String toString() { return"线程" + id; } } class MyStack {tart(); new Thread(c).start(); } } 运行结果截图: 作业二:多级反馈队列调度算法 ; public class Operation { ; public class ProcessPCB { ; import import public class UserFrame extends JFrame{ private static final long serialVersionUID = 1L; JLabel pnamelabel = new JLabel("进程名:"); JTextField pnametext = new JTextField(); JLabel listlabel1 = new JLabel("正在执行的进程:"); JLabel listlabel2 = new JLabel("就绪队列1:"); JLabel listlabel3 = new JLabel("就绪队列2:"); JLabel listlabel4 = new JLabel("就绪队列3:"); JLabel listlabel5 = new JLabel("完成队列:"); JTextArea listarea1 = new JTextArea(); JTextArea listarea2 = new JTextArea(); JTextArea listarea3 = new JTextArea(); JTextArea listarea4 = new JTextArea(); JTextField executingarea = new JTextField(); JButton createbtn = new JButton("创建进程"); JButton dispatchbtn = new JButton("开始调度"); JButton reset = new JButton("清空"); Operation operation = new Operation(); quals("")){

相关主题
相关文档 最新文档