高级OS实验一文件系统
高级OS实验一文件系统实验报告
实验1:Vnod e和Inod e数据结构及缓存一、实验内容及目的为了更好地支持多种类型的文件系统,Solaris操作系统在设计上使用了一种特殊的结构:虚拟文件系统框架。
在虚拟文件系统中,操作系统内核通过vnode来识别每个活动文件,对于一个具体的文件系统,例如UFS,则是由Inode来识别具体的文件。
本实验的目的是观察Solaris操作系统内核中Vnode和Inode数据结构,了解它们之间的关系,同时学习使用mdb 在内核中查找指定的数据结构。
二、实验步骤1.启动一个shell,使用vi编辑器生成文件/work/exp_design/test.txt,内容为字符串“This is a file for UFS testing.”。
2.退出vi编辑器,使用命令#/usr/sfw/bin/gcc file_access.c编译生成可执行程序a.out。
3.运行“mdb -k”,进入内核模块调试程序。
4.启动另一个shell,运行./a.out。
结果为:The file descriptor returned is 3The data read from the file tis This is a5.切换回正在运行mdb的shell,获取进程a.out的地址:> ::ps!grep a.outR 843 804 843 804 0 0x42004000 ffffffff83d25dd8 a.out ffffffff83d25dd8这个地址是proc类型的数据,也就是进程的pcb。
6.使用命令fd获得有关这个进程打开文件的file类型数据结构的地址。
> fffffffff83d25dd8::fd 3ffffffff84ldee387.打印出这个file数据结构的内容。
> ffffffff84ldee38::print struct file{f_tlock = {_opaque = [0]}f_flag = 0xlf_pad = 0xbaddf_vnode = 0xffffffff84181140f_offset = 0x9f_cred = 0xfffffff83a95bd0f_audit_data = 0f_count = 0x1}其中f_vnode就是这个文件的vnode地址。
高级操作系统实验报告
一、实验背景与目的随着计算机技术的飞速发展,操作系统作为计算机系统的核心,其重要性日益凸显。
为了更好地理解操作系统的工作原理和设计思想,我们选择了高级操作系统课程,并完成了以下实验:1. 实验背景本次实验基于Linux操作系统,通过对Linux系统内部结构和操作过程的研究,掌握Linux系统的基本操作、文件系统管理、进程管理、内存管理、设备管理等方面的知识。
2. 实验目的(1)熟悉Linux操作系统的基本操作,包括登录、退出、文件与目录操作等。
(2)掌握Linux系统下的进程管理,包括进程的创建、调度、同步、通信等。
(3)了解Linux系统下的内存管理,包括虚拟内存、页面置换算法等。
(4)学习Linux系统下的设备管理,包括设备驱动程序、I/O调度等。
二、实验内容与步骤1. 实验一:Linux基本操作(1)实验目的:熟悉Linux系统的基本操作。
(2)实验步骤:① 登录Linux系统。
② 使用命令行查看系统信息,如CPU型号、内存大小等。
③ 创建和删除文件与目录。
④ 查看文件内容。
2. 实验二:文件系统管理(1)实验目的:掌握Linux系统下的文件系统管理。
(2)实验步骤:① 使用命令行查看文件系统类型。
② 查看文件系统分区。
③ 使用命令行创建和删除文件系统。
④ 使用命令行挂载和卸载文件系统。
3. 实验三:进程管理(1)实验目的:掌握Linux系统下的进程管理。
(2)实验步骤:① 使用命令行查看系统进程。
② 创建和终止进程。
③ 调整进程优先级。
④ 实现进程同步与互斥。
4. 实验四:内存管理(1)实验目的:了解Linux系统下的内存管理。
(2)实验步骤:① 使用命令行查看内存信息。
② 查看内存分配情况。
③ 实现页面置换算法。
5. 实验五:设备管理(1)实验目的:学习Linux系统下的设备管理。
(2)实验步骤:① 使用命令行查看设备信息。
② 编写简单的设备驱动程序。
③ 实现I/O调度。
三、实验结果与分析1. 实验结果通过本次实验,我们成功完成了以下任务:(1)熟悉了Linux操作系统的基本操作。
操作系统文件管理系统模拟实验
操作系统文件管理系统模拟实验在计算机科学中,操作系统是一种系统软件,负责管理计算机硬件和软件资源,并为用户和应用程序提供接口。
文件管理系统是操作系统的一个重要组成部分,它负责管理计算机系统中的文件和目录,以及提供对它们的访问和操作。
本次实验旨在模拟操作系统中文件管理系统的基本功能和操作。
我们将使用一个虚拟的文件系统,通过命令行界面来模拟用户与文件系统的交互。
以下是实验的具体内容和步骤:1. 创建虚拟文件系统首先,我们需要创建一个虚拟的文件系统。
文件系统由文件和目录组成,可以通过树状结构来表示。
我们可以使用一个数据结构来模拟文件系统的存储和管理。
2. 初始化文件系统在开始操作文件系统之前,我们需要初始化文件系统。
这包括创建根目录和设置当前目录为根目录。
3. 文件和目录的创建与删除文件和目录是文件系统的基本单位。
我们可以通过命令来创建和删除文件和目录。
例如,使用"mkdir"命令创建一个目录,使用"touch"命令创建一个空文件,使用"rm"命令删除文件或目录。
4. 文件和目录的访问权限文件和目录可以设置不同的访问权限,以保护文件系统的安全性。
我们可以使用"chmod"命令来修改文件或目录的权限。
权限通常包括读、写和执行权限。
5. 文件和目录的重命名和移动我们可以使用"mv"命令来重命名文件或目录,使用"cp"命令来复制文件或目录,使用"mv"命令来移动文件或目录。
6. 文件和目录的查找和显示我们可以使用"ls"命令来显示当前目录下的文件和目录,使用"cd"命令来切换当前目录,使用"pwd"命令来显示当前目录的路径。
此外,我们还可以使用"find"命令来查找文件或目录。
7. 文件和目录的读写操作文件可以被读取和写入。
OS实验报告(1)
(4)作业中指令的访问次序按下述原则生成:
•50%的指令是顺序执行的。
•25%的指令是均匀分布在前地址部分。
•25%的指令时均匀分布在后地址部分。
具体实施办法参见实验指导书。
3实验结果(给出编写的程序源代码和运行结果的截图)
(2)假设初始状态下,可用的内存空间为640KB,并有下列的请求序列:
•作业1申请130KB。
•作业2申请60KB。
•作业3申请100KB。
•作业2释放60KB。
•作业4申请200KB。
•作业3释放100KB。
•作业1释放130KB。
•作业5申请140KB。
•作业6申请60KB。
•作业7申请50KB。
计算机操作系统
实验报告
学号:
姓名:
提交日期:
XXXX-XX-XX
成绩:
东北大学秦皇岛分校
实验1使用动态优先权的进程调度算法的模拟
1实验目的
(1)加深对进程概念的理解
(2)深入了解系统如何组织进程,创建进程
(3)进一步认识如何实现处理机调度
2实验内容
(1)实现对N个进程采用动态优先权优先算法的进程调度。
(2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:
进程标识ID。
进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。
进程已占用的CPU时间CPUTIME。
进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。
进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,将进入阻塞状态。
1实验目的
文件系统 实验报告
文件系统实验报告引言文件系统是操作系统中的一部分,用于管理计算机中的文件和目录。
它提供了数据的存储、访问、组织和管理功能,是操作系统的基础之一。
本实验通过实现一个简单的文件系统来深入理解文件系统的原理和实现方式。
实验目的1. 了解文件系统的基本概念和原理;2. 学习文件系统的设计和实现方法;3. 掌握文件系统的基本操作。
实验环境本次实验使用的是Ubuntu 20.04操作系统。
实验步骤1. 文件系统的设计在开始实现文件系统之前,我们首先需要设计文件系统的结构和功能。
1.1 文件系统的结构文件系统通常由三个主要部分组成:文件控制块、目录和数据块。
文件控制块用于存储文件的属性和元数据,目录用于组织文件和子目录,数据块用于存储文件的实际内容。
1.2 文件系统的功能文件系统需要提供以下功能:- 文件的创建、读取、修改和删除;- 目录的创建、读取、修改和删除;- 文件和目录的查找;- 文件的权限管理。
2. 文件系统的实现2.1 文件系统的初始化在实现文件系统之前,我们首先需要初始化文件系统。
包括创建超级块、位图和根目录,并将它们写入磁盘。
2.2 文件和目录的操作在文件系统中,我们需要实现文件和目录的基本操作,包括创建文件、创建目录、读取文件内容、修改文件内容和删除文件。
2.3 文件系统的其他操作除了基本的文件和目录操作之外,文件系统还需要实现其他一些功能,如文件查找、权限管理等。
3. 文件系统的测试在完成文件系统的实现后,我们需要对其进行测试,以验证其功能是否正常。
3.1 创建文件和目录我们首先创建一些文件和目录,检查它们是否被正确地写入磁盘,并且能够被正确地读取。
3.2 读取和修改文件我们随机选择一些文件,读取它们的内容,并对其内容进行修改。
修改后,我们再次读取文件,确保修改成功。
3.3 删除文件和目录我们尝试删除一些文件和目录,并检查它们是否被成功地删除。
4. 结果与讨论经过测试,我们发现我们实现的文件系统功能正常,能够按照我们的预期进行文件和目录的创建、读取、修改和删除等操作。
OS实验思考题参考答案
int execv(const char *path,char *const argv[]);
int execvp(const char *file,char *const argv[]):
(2)进程的控制实验
pid_t wait(int *stat_loc);
pid_t waitpid(pid_t pid,int *stat_loc,int options);
wait 系统调用会使父进程阻塞直到一个子进程结束或者是父进程接受到了一个信号.如 果没有父进程没有子进程或者他的子进程已经结束了 wait 回立即返回.成功时(因一个子进 程结束)wait 将返回子进程的 ID,否则返回-1,并设置全局变量 errno.stat_loc 是子进程的退出状 态.子进程调用 exit,_exit 或者是 return 来设置这个值. 为了得到这个值 Linux 定义了几个宏来 测试这个返回值.
当 fork 掉用失败的时候(内存不足或者是用户的最大进程数已到)fork 返回-1,否则 fork 的返回值有重要的作用.对于父进程 fork 返回子进程的 ID,而对于 fork 子进程返回 0.我们 就是根据这个返回值来区分父子进程的.
父进程创建一个子进程的目的是由于 Linux 是一个多用户操作系统,在同一时间 会有许多的用户在争夺系统的资源.有时进程为了早一点完成任务就创建子进程来争夺资源. 一旦子进程被创建,父子进程一起从 fork 处继续执行,相互竞争系统的资源.有时候我们希望 子进程继续执行,而父进程阻塞直到子进程完成任务.这个时候我们可以调用 wait 或者 waitpid 系统调用.
操作系统虚拟文件系统实验报告
操作系统虚拟文件系统实验报告一、实验目的本实验旨在帮助学生理解操作系统中虚拟文件系统的概念和工作原理,通过实际操作来深入学习和掌握相关知识。
二、实验环境本次实验使用的操作系统为Linux,实验工具为虚拟机软件VMware Workstation。
三、实验步骤1. 创建虚拟机:首先启动VMware Workstation,创建一个新的虚拟机并安装Linux操作系统。
2. 挂载文件系统:在Linux系统中,使用命令行工具挂载一个文件系统到指定的目录,例如将/dev/sdb1挂载到/mnt目录下。
3. 创建文件:在挂载后的文件系统中,通过命令行工具创建若干个文件和目录,可以使用touch和mkdir命令。
4. 编辑文件内容:使用vim或者其他文本编辑工具,在创建的文件中添加一些内容。
5. 查看文件系统信息:使用df命令查看当前系统的文件系统使用情况,通过ls命令查看文件和目录的信息。
6. 卸载文件系统:使用umount命令卸载之前挂载的文件系统。
7. 实验总结:对本次实验的操作过程和结果进行总结,思考在实际应用中虚拟文件系统的意义和作用。
四、实验结果分析通过本次实验,我深入理解了操作系统中虚拟文件系统的概念和原理。
在实际操作过程中,我掌握了如何挂载和卸载文件系统,创建和编辑文件内容,以及查看文件系统信息的方法。
这些基本操作对于日常的系统管理和开发工作具有重要意义,能够有效地提高工作效率和便捷性。
五、实验感想本次实验虽然只是简单的操作演示,但对我理解操作系统的文件系统和虚拟化技术有着重要的意义。
通过亲身操作,我对虚拟文件系统的工作原理有了更加直观的认识,对操作系统中文件管理的流程和方式也有了更深入的理解。
这对我今后的学习和工作都具有积极的促进作用,我会继续学习和提升相关知识和技能,努力成为一名优秀的操作系统工程师。
六、实验总结通过本次操作系统虚拟文件系统的实验,我进一步巩固了相关知识,增强了对操作系统的理解和掌握。
文件系统实验报告
一、实验目的1. 理解文件系统的基本概念和组成。
2. 掌握文件系统的创建、删除、修改和查询等基本操作。
3. 了解文件系统的性能分析和优化方法。
4. 提高对文件系统原理的理解和实际操作能力。
二、实验环境1. 操作系统:Windows 102. 文件系统:NTFS3. 实验软件:Windows资源管理器、Notepad++等三、实验内容1. 文件系统的基本概念和组成(1)文件:存储在文件系统中的数据单元,可以是程序、文档、图片等。
(2)目录:用于组织文件的结构,类似于文件夹。
(3)文件系统:管理存储设备上文件和目录的数据结构。
2. 文件系统的创建、删除、修改和查询等基本操作(1)创建文件:使用Notepad++创建一个名为“test.txt”的文本文件。
(2)创建目录:在Windows资源管理器中,创建一个名为“test”的目录。
(3)删除文件:选中“test.txt”文件,按Delete键删除。
(4)删除目录:选中“test”目录,按Delete键删除。
(5)修改文件:使用Notepad++打开“test.txt”文件,修改内容后保存。
(6)查询文件:在Windows资源管理器中,通过路径或搜索功能查找“test.txt”文件。
3. 文件系统的性能分析和优化方法(1)查看磁盘空间使用情况:在Windows资源管理器中,选中磁盘分区,查看磁盘空间使用情况。
(2)清理磁盘:使用Windows自带的磁盘清理工具清理磁盘垃圾文件。
(3)优化文件系统:使用Windows自带的磁盘碎片整理工具优化文件系统。
四、实验结果与分析1. 创建文件和目录实验结果显示,使用Notepad++创建了一个名为“test.txt”的文本文件,使用Windows资源管理器创建了一个名为“test”的目录。
2. 删除文件和目录实验结果显示,成功删除了“test.txt”文件和“test”目录。
3. 修改文件实验结果显示,使用Notepad++修改了“test.txt”文件的内容,并成功保存。
操作系统文件管理系统模拟实验
操作系统文件管理系统模拟实验1. 实验目的本实验旨在通过模拟操作系统的文件管理系统,深入理解操作系统中文件的组织结构、文件的创建、读写和删除操作,以及文件系统的管理策略。
2. 实验背景操作系统是计算机系统中的核心软件,负责管理计算机的资源并提供用户与计算机硬件之间的接口。
文件管理系统是操作系统的重要组成部分,用于管理计算机中的文件和目录结构,提供文件的读写、创建和删除等操作。
3. 实验环境本实验可以在任何支持操作系统模拟的计算机上进行,如使用虚拟机软件搭建的操作系统环境或在线操作系统模拟器。
4. 实验步骤4.1 文件系统初始化在模拟实验开始之前,需要对文件系统进行初始化。
可以选择创建一个空的文件系统或使用预先定义好的文件系统。
4.2 文件的创建在文件系统中创建一个新文件。
可以指定文件的名称、大小、属性等信息。
文件创建成功后,可以在文件系统中查看该文件的相关信息。
4.3 文件的读取选择一个已经存在的文件,并从文件系统中读取该文件的内容。
可以通过指定文件的路径或名称来进行读取操作。
读取文件时,可以选择按字节、按行或按块进行读取。
4.4 文件的写入选择一个已经存在的文件,并向该文件中写入内容。
可以选择覆盖原有内容或在文件末尾追加新内容。
写入文件时,可以选择按字节、按行或按块进行写入。
4.5 文件的删除选择一个已经存在的文件,并从文件系统中删除该文件。
删除文件后,文件系统中将不再存在该文件的相关信息。
5. 实验结果分析在完成实验步骤后,可以对实验结果进行分析和总结。
可以比较不同文件的读写操作所消耗的时间和资源,评估不同文件系统管理策略的性能优劣。
6. 实验注意事项6.1 在进行文件操作时,务必注意文件的权限和保护机制,避免误操作导致数据丢失或系统崩溃。
6.2 在进行文件读写操作时,要注意文件的大小和系统资源的限制,避免因为文件过大或系统资源不足而导致操作失败。
6.3 在进行文件删除操作时,要谨慎操作,避免误删重要文件或系统关键文件,导致系统无法正常运行。
操作系统实验-文件系统扩展实验报告
实验报告要求1.实验名称:文件系统扩展实验2.实验要求:对【程序5_9】进行扩展,要求参数为目录名,且其下至少有三层目录,分别用深度遍历及广度遍历两种方法对此目录进行遍历,输出此目录下所有文件的大小及修改时间。
3.实验目的:(在实验过程中应用的操作系统理论知识)1.熟悉和应用深度优先和广度优先遍历算法2.熟练掌握linux 系统下关于文件系统的API3.掌握有关数据结构和指针的应用4.掌握使用gdb 调试的方法5.掌握实际运用中堆栈的内存分配4.实验内容:(为完成实验,如何进行程序设计)DFS:整体思路: 从所给的目录进入,按照reddir打开指针的顺序开始逐个遍历,遇到文件就按照规定格式输出信息。
遇到目录就对该目录进行DFS,之后返回上一级继续遍历。
当当前目录没有文件时返回流程图:重点部分: 重点是DFS 对退出循环和回溯时间点的把握。
这里退出循环的时间点是当前目录没有可读文件或者目录。
回溯时间点是当读到的文件为目录时,进入下一层DFS BFS:整体思路:利用队列,参考二叉树的层次遍历。
先将根目录入队,循环出队列。
进入目录后,当读取到文件时,输出信息;当读取到目录时,将目录入队,继续读取下一个文件;当当前目录的文件遍历完成时,退出此目录循环,从队列中弹出一个目录,再进入循环。
当队列为空时,退出。
流程图:重点部分: 1. 队列的建立,队列使用链表连接,存放字符串数据,要注意内存的分配和释放2.入队出队的时机;先将根目录入队,退出循环的条件为队列为空。
入队的条件为当前文件为目录。
出队的条件为一个目录遍历完毕。
5.程序:(较之已有程序有修改的、新增的程序段加下划线)#include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<sys/types.h>#include<sys/stat.h>#include<dirent.h>#include<time.h>#include<string.h>#include<ctype.h>/*辅助函数输出文件的大小和最后修改时间*/static int get_file_size_time(const char *filename){struct stat statbuf;if(stat(filename,&statbuf)==-1) //取filename 的状态{printf("Get stat on %s Error:%s\n",filename,strerror(errno));return(-1);}if(S_ISDIR(statbuf.st_mode))return(1); //判断是否是目录文件if(S_ISREG(statbuf.st_mode)) //判断是否是普通文件printf("\t size:%ld bytes\t modifiedate: %s\n",statbuf.st_size,ctime(&statbuf.st _mtime)); //输出文件的大小和最后修改时间return(0);}/******************************** BFS 利用队列********************************************/// 在strcpy 指针前要先申请空间struct node {char* data;struct node* next;// struct node* pre;} *head,*tail,*tmp; // 头节点,尾节点,临时节点count++; }6.运行结果:(进行反白处理后截图)DFS:BFS7.实验总结:编程、调试过程中遇到的问题及解决办法。
操作系统虚拟文件系统实验报告
操作系统虚拟文件系统实验报告1. 引言本报告旨在总结并分析我们小组在操作系统虚拟文件系统实验中的经验和发现。
操作系统是计算机系统中非常重要的一个组成部分,负责管理计算机硬件和软件资源。
而虚拟文件系统(Virtual File System,VFS)则是操作系统中一个关键的抽象层,为用户和应用程序提供了统一的文件操作接口。
通过对虚拟文件系统的实验,我们深入了解了操作系统的内部实现原理,加深了对文件系统的理解。
2. 实验目的本次实验的主要目的是对操作系统的虚拟文件系统进行实践探索,通过实际操作和观察,加深对虚拟文件系统的理解,并熟悉常见的文件系统操作。
3. 实验环境我们使用了一台以Linux操作系统为基础的计算机作为实验平台,并采用虚拟机技术搭建了多个虚拟机实例,以便进行并行的多任务操作。
4. 实验过程与结果4.1 文件系统的创建与挂载首先,我们使用命令行工具创建了一个新的文件系统,并将其挂载到操作系统的指定目录上。
通过这一步骤,我们成功地在操作系统上创建了一个虚拟的文件系统,并使其能够被操作系统识别并访问。
4.2 文件的创建、读取和写入在实验过程中,我们创建了多个文件,并测试了文件的读取和写入功能。
我们发现,在虚拟文件系统下,文件的读取和写入操作是非常高效和稳定的。
通过在文件中写入不同类型的数据并进行读取,我们验证了文件系统的正确性和可靠性。
4.3 目录的创建和遍历除了文件操作外,我们还对虚拟文件系统中的目录进行了创建和遍历实验。
通过创建多层次的目录结构并遍历其中的所有文件和子目录,我们验证了虚拟文件系统对目录的管理和访问功能。
4.4 文件系统的扩展与压缩为了进一步探索虚拟文件系统的性能和可扩展性,我们对文件系统进行了动态扩展和压缩实验。
通过添加和删除大量文件,我们观察到文件系统的性能表现良好,并且在文件数量不断增加的情况下能够有效地管理和访问这些文件。
5. 实验总结与思考通过本次虚拟文件系统的实验,我们对操作系统的底层实现原理有了更深入的了解。
文件系统实验报告
试验四文件系统一、实验目的1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
2、要求设计一个n个用户的文件系统,每次用户可以保存M个文件。
用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有create、delete、open、close、read、write等命令。
二、实验题目:采用二级目录结构实现磁盘文件操作。
要求:1.普通文件的目录项包括文件名,文件类型,文件长度,指向文件内容的指针内容。
2.目录文件的目录项包括目录名,指向下一级目录块的指针内容。
假定每个目录文件最多只能占用一个块;3.程序功能方面的要求:需要实现一个命令行操作界面,包含如下命令:4.程序实现方面的要求:(1)、对于重名(创建时),文件不存在(删除时),目录不存在(改变目录时)等错误操作情况,程序应该做出相应处理并给出错误信息,但是程序不得因此而退出。
(2)、界面友好,程序强壮。
(3)、设置界面的提示符,提示的命令以及调试的方法应和前面的要求一致。
不要自己设计命令或者附加不要求的功能。
三.实验源程序文件名:执行文件名:四.实验分析1)总论:该系统是一个多用户、多任务的实时操作系统。
对用户和用户的文件数目并没有上限。
也就是说该系统允许任何用户申请空间,而且在其目录下的文件数目并不做任何的限制。
该系统的操作命令如下:①、bye-用户注销命令。
当使用该命令时,用户退出系统。
命令格式:run\bye↙系统注销该用户并回到登陆界面。
②、close-删除用户注册信息命令。
执行该命令后,用户在系统中的所有信息,包括该用户目录下的所有文件都被删除。
命令格式:run\close↙.完成后返回登陆界面。
③、create-在当前目录下创建一个文件,且该文件不能跟系统中的文件重名。
该文件的管理信息登录到用户文件信息管理模块中。
命令格式:run\create>file1↙。
操作系统文件系统实验报告
操作系统文件系统实验报告操作系统文件系统实验报告引言操作系统是计算机系统中的重要组成部分,负责管理计算机的硬件和软件资源,为用户提供一个友好的界面和高效的资源管理。
文件系统作为操作系统的一个重要组成部分,负责管理计算机中的文件和目录,提供文件的读写和存储功能。
本实验旨在深入了解操作系统文件系统的原理和实现方式,并通过实际操作来加深对文件系统的理解。
一、实验背景操作系统中的文件系统是一个层次化的结构,它将计算机中的存储空间划分为若干个逻辑单元,用来存储和管理文件和目录。
文件系统的设计和实现涉及到文件的组织方式、文件的存储结构、文件的访问方式等多个方面。
本实验将以Linux操作系统为例,通过使用Linux文件系统的一些基本命令和操作,来深入了解文件系统的原理和实现方式。
二、实验目的1. 了解文件系统的基本概念和原理。
2. 掌握Linux文件系统的基本命令和操作。
3. 熟悉文件的读写和存储方式。
4. 加深对文件系统的理解和应用。
三、实验内容1. 文件系统的基本概念和原理文件系统是操作系统中用来管理文件和目录的一种机制,它将计算机中的存储空间划分为若干个逻辑单元,用来存储和管理文件和目录。
文件系统的基本概念包括文件、目录、路径等,文件是计算机中存储数据的基本单位,目录是用来组织和管理文件的一种方式,路径是用来定位文件和目录的一种方式。
2. Linux文件系统的基本命令和操作Linux操作系统是一个开源的操作系统,它提供了丰富的文件系统命令和操作。
通过使用这些命令和操作,可以对文件和目录进行创建、删除、复制、移动等操作。
例如,可以使用"mkdir"命令来创建一个新的目录,使用"rm"命令来删除一个文件,使用"cp"命令来复制一个文件,使用"mv"命令来移动一个文件等。
3. 文件的读写和存储方式文件的读写是文件系统的一项重要功能,它可以通过读取和写入文件来实现对文件内容的访问和修改。
文件系统模拟实验(C-实验教材)
文件系统实验1.1实验目的和要求1.1.1实验目的通常把文件与管理信息资源的管理程序的集合称为文件系统,它是操作系统中负责存取和管理信息资源的模块,采用统一的方法管理用户信息和系统信息的存储、检索、更新、共享和保护,并为用户提供一套行之有效的文件使用及操作方法。
本实验利用高级语言编写程序模拟文件系统,了解文件系统的基本结构和文件的各种操作方法,加深理解文件系统的内部功能及内部实现,从而帮助学生对各种文件操作命令的实质内容和执行过程有比较深入的了解。
1.1.2实验要求1.采用高级语言编写程序模拟文件系统,文件系统采用多级目录结构,实现对文件和目录的创建、删除、重命名、变更权限、显示文件内容、修改文件内容等操作。
2.撰写实验报告,报告应包含以下内容:(1)实验目的;(2)实验内容;(3)设计思路;(4)程序流程图;(5)程序中主要数据结构和函数说明;(6)带注释的源程序代码;(7)程序运行结果及分析(8)实验收获与体会1.2预备知识1.2.1文件和文件系统1.文件概念现代计算机系统中都配置了外存,大量的程序和数据以文件的形式存放在外存。
如果由用户直接管理文件,不仅要求用户熟悉外存特性,了解各种文件的属性,以及它们在外存上的位置,而且多用户环境下还必须能保持数据的安全性和一致性,这是用户不能胜任的。
因而,现代操作系统中都配备文件系统,以适应系统资源管理和用户使用信息的需要。
文件是指由创建者所定义的、具有文件名的一组相关元素的集合。
用户通过文件名就可对文件进行访问,文件名是由字母或数字组成的字母或数字串,其格式和长度都因系统而异。
操作系统提供文件系统的优点有:(1)便于用户使用。
(2)文件安全可靠。
(3)系统能有效利用存储空间,优化安排不同属主文件的位置。
(4)文件系统还能提供文件共享功能。
2.文件命名在不同的操作系统中对文件名的规定有所不同,文件名的格式和长度因系统而异。
一般来说,文件名由文件名和扩展名两部分组成,前者用于标识文件,后者用于区分文件类型,中间用“.”分割开来,它们都是字母或数字所组成的字母数字串。
操作系统文件系统实验报告
操作系统文件系统实验报告1. 实验目的本实验旨在深入了解操作系统中的文件系统,掌握文件系统的基本原理和操作。
2. 实验环境本实验使用Linux操作系统作为实验环境,其中包括以下软件和工具: - 操作系统:Ubuntu 20.04 - 文件系统:EXT4 - 终端模拟器:GNOME Terminal3. 实验步骤3.1 创建虚拟硬盘首先,我们需要创建一个虚拟硬盘,作为文件系统的存储介质。
可以使用以下命令来创建一个大小为1GB的虚拟硬盘:$ dd if=/dev/zero of=disk.img bs=1M count=10243.2 格式化虚拟硬盘接下来,我们需要使用mkfs命令来格式化虚拟硬盘,使其支持EXT4文件系统:$ mkfs.ext4 disk.img3.3 挂载虚拟硬盘格式化完成后,我们可以将虚拟硬盘挂载到系统中的一个目录上,以便我们可以访问其中的文件:$ mkdir /mnt/disk$ mount disk.img /mnt/disk3.4 创建文件现在,我们可以在挂载的虚拟硬盘上创建文件,可以使用touch命令来创建一个空文件:$ touch /mnt/disk/file.txt3.5 写入文件我们可以使用echo命令向文件中写入一些内容:$ echo "Hello, World!" > /mnt/disk/file.txt3.6 读取文件可以使用cat命令来读取文件的内容:$ cat /mnt/disk/file.txt3.7 卸载虚拟硬盘完成实验后,我们可以卸载虚拟硬盘,以便之后的实验使用:$ umount /mnt/disk4. 实验总结通过本次实验,我们深入了解了操作系统中的文件系统,并学会了如何创建、格式化、挂载和访问文件系统。
文件系统是操作系统中非常重要的一部分,它负责管理和组织计算机上的文件和目录,为用户提供了方便的文件操作接口。
掌握文件系统的基本原理和操作对于进一步学习和理解操作系统的工作原理具有重要意义。
操作系统实验文件系统报告
操作系统实验文件系统报告简介本文档是操作系统实验报告的文件系统部分。
在这个实验中,我们将通过实现一个简单的文件系统来了解文件系统的基本原理和实现方式。
本文档将介绍文件系统的设计和实现,以及在实验中遇到的问题和解决方案。
设计和实现文件系统结构我们的文件系统采用了简单的单级目录结构。
每个文件都有一个唯一的文件名和文件扩展名,以及相应的文件内容。
文件系统中的所有文件都存储在一个文件中,我们通过偏移量来访问每个文件。
文件系统接口我们实现了以下文件系统接口来对文件系统进行操作:•create_file(filename, extension): 创建一个新文件。
•delete_file(filename, extension): 删除一个文件。
•open_file(filename, extension): 打开一个文件。
•close_file(file): 关闭一个文件。
•read_file(file, offset, length): 从文件中读取数据。
•write_file(file, data): 向文件中写入数据。
•seek_file(file, offset): 设置文件指针的位置。
通过这些接口,我们可以对文件进行创建、删除、读取和写入操作,以及设置文件指针的位置。
文件系统实现我们的文件系统是在操作系统内核中进行实现的。
在内存中维护了一个文件控制块(FCB)表,用于记录文件的元数据信息,比如文件名、扩展名、大小和位置等。
文件内容存储在一个独立的数据块中。
为了实现文件的持久化,我们将文件系统的存储映射到了一个文件中。
在系统启动时,我们会将这个文件读取到内存中,并建立起文件控制块表和数据块的映射关系。
文件的创建、删除和读写操作都是通过操作文件控制块表和数据块来完成的。
具体实现涉及到文件的分配和释放,以及文件指针的管理等问题。
遇到的问题和解决方案在实验中,我们遇到了一些问题,主要集中在文件的读写和文件指针的管理方面。
操作系统实验-文件系统
用rm命令分别删除这三个文件,再用ls命令看看有何变化?
实例:Ls的功能实现
#include<sys/types.h>
#include<dirent.h>
#include<unistd.h>
int main(int argc,char * argv[ ])
{ DIR * dp;
struct dirent * dirp;
if(argc!=2)
perror(“a single argumen(the directory name) is required”);
if((dp=opendir(argv[1]))==NULL)
perror(“Can’t open %s\n”,argv[1]);
while((dirp=readdir(dp))!=NULL)
西北师范大学计算机科学与工程学院学生实验报告
学号
专业
计算机科学与技术
姓名
课程名称
操作系统
班级
实验名称
文件系统
课程类型
专业课
实验目的:
(1)熟悉和理解文件系统的概念和文件系统的类型。
(2)了解文件系统的功能及实现。
(3)学习文件系统的系统调用及命令。
(4)熟悉和理解文件的共享。
实验内容:
1.使用creat、open、read、write等系统调用,实现cp命令的功能。
324550 -rwx------ 2 sarwar faculty 380 mar 11 14:20 abc.hard
$ ln -s abc.c abc.soft
$ ls -il
324550 -rwx------ 1 sarwar faculty 380 mar 11 14:20 abc.c
文件系统实验报告
文件系统实验报告实验四文件系统实验一.目的要求1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
2、要求设计一个n个用户的文件系统,每次用户可保存m 个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。
二.例题:1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。
2、程序采用二级文件目录和用户文件目录。
另外,为打开文件设置了运行文件目录。
3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。
4、算法与框图:①因系统小,文件目录的检索使用了简单的线性搜索。
②文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。
③程序中使用的主要设计结构如下:主文件目录和用户文件目录打开文件目录文件系统算法的流程图如下:三. 实验题:1、增加2~3个文件操作命令,并加以实现。
#include#include#include#include#define MAXSIZE 100#define ADDSIZE 50#define PT elem+l-> length#define N 4typedef 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/*动态分配存储空间*/{l-> elem=malloc);l-> length =0;l-> size=MAXSIZE;}void input/*输入学生的信息*/{lnode *newbase,*p;char cla[10],ter[10],ch;int n,i;if{newbase=realloc*sizeof);/*追加存储空间*/ l-> elem =newbase;l-> size +=ADDSIZE;}p=l-> elem;do{printf;gets;gets;printf;scanf;printf;for{scanf;strcpy;strcpy;++l-> length ;}printf “);ch=getchar;}while;}void change/*修改学生的信息*/{lnode *p;lnode e;int flag=1,i;char s1[10],num1[10];printf:\n “);gets;gets;p=l-> elem ;while && flag==1)/*查找要修改的学生的信息*/ {if==0&&strcmp==0)flag=0;/*找到了*/p++;}p--;if printf;printf;forprintf;printf;printf;scanf;forscanf;*p=e;}void same /*把学期和班级相同的学生信息放在结构体数组tt 中*/ {int i=0;lnode *p,*q;q=t;p=l-> elem ;while{if==0&&strcmp==0){*q=*p;q++;i++;}p++;*k=i;}void sort/*按学生成绩从高到低排序函数*/ {int i;lnode *q,temp;for{q-> total =0;forq-> total =q-> total +q-> course [i];q-> average =q-> total /N;}forforif-> total){temp=*q;*q=*;*=temp;}}void print/*输出学生的成绩*/lnode *p;p=q;for{printf;forprintf;printf;printf;}}void stat/*统计学生的成绩*/ {lnode tt[50];char ter[10],clas[10];int i,k;printf:\n “);forter[i]=getchar;forclas[i]=getchar;same;/*把学期和班级相同的学生信息放在结构体数组tt中*/ sort;/*按学生成绩从高到低排序函数*/print;/*输出学生的成绩*/}void search1/*按学号查*/{lnode *p;char ter1[10];int i,flag=1;p=l-> elem;printf;gets;for{if==0){flag=0;printf;printf;forprintf;printf;printf;}}if printf;}void search2/*按姓名查*/ {lnode *p;char ter1[10];int i,flag=1;p=l-> elem;printf;gets;for{if==0){flag=0;printf;printf;forprintf;printf;}}if printf ;}void search/*查找学生的成绩*/ {char ch;do{printf;ch=getchar;switch{case ‘1 ‘:search1;break;case ‘2 ‘:search2;break;default:}printf “);ch=getchar;} while;}void fail/*查找不及格及学生名单*/ {int i;lnode *p;for{forif{printf;forprintf;printf;printf;}}}void output/*按班级输出学生的成绩单*/{lnode tt[50];int k;char clas[10],ter1[10];printf; gets;gets;same;/*把学期和班级相同的学生信息放在结构体数组tt中*/ print;/*输出学生的成绩*/}试验四文件系统一、实验目的1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
操作系统 文件系统 实验程序
— . 实验目的用高级语言编写和调试一种简朴的文献系统,模拟文献管理的工作过程。
从而对多个文献操作命令的实质内容和执行过程有比较进一步的理解。
二、实验规定规定设计一种 n 个顾客的文献系统,每次顾客可保存 m 个文献,顾客在一次运行中只能打开一种文献,对文献必须设立保护方法,且最少有 Create 、delete 、open 、close 、 read 、write 等命令。
程序采用二级文献目录(即设立主目录[MFD])和顾客文献目录(UFD )。
另外,为打开文献设立了运行文献目录(AFD )。
在执行读写命令时,需改读写指针。
因系统小,文献目录的检索使用了简朴的线性搜索。
文献保护简朴使用了三位保护码:允许读写执行、对应位为 1,对应位为 0,则表达不允许读写、执行。
程序中使用的重要设计构造以下:主文献目录和顾客文献目录(MFD 、UFD )、打开文献目录(AFD )(即运行文献目录)文献系统算法的流程图以下:#include<stdio.h>#include<string.h>#define N 10#define L 10#define S 6struct mfd_type{char uname[20];int uaddr;};struct ufd_type{char fname[20];char fattr[10];int recordl;int addrf;};struct uof_type{char fname[20];char fattr[10];int recordl;char fstatue;//1:建立0:打开int readp;int writep;};int fdph[N*L];//寄存文献在磁盘上的第一种空间编号int fdpt[N*L];//寄存文献在磁盘上的最末一种空间编号int disk[400];//寄存磁盘空闲块号int diskt,diskh;//空闲块的尾、首指针最末struct mfd_type mfd[N];struct ufd_type ufd[N *L];struct uof_type uof[N *S];int temp,mi,ni,uno ,ucounter;void create(char cfname[20],int crecordl,char cfattr[10]){int cltemp1=uno*L,cltemp2=(uno+1)*L,frd;while ((cltemp1<cltemp2)&&(strcmp(ufd[cltemp1].fname,cfname)!=0))cltemp1++;if(strcmp(ufd[cltemp1].fname,cfname)!=0){cltemp1=uno*L;while ((cltemp1<cltemp2)&&(strcmp(ufd[cltemp1].fname,"")!=0)) cltemp1++;if(strcmp(ufd[cltemp1].fname,"")==0){frd=cltemp1;cltemp1=uno*S;cltemp2=(uno+1)*S;while ((cltemp1<cltemp2)&&(strcmp(uof[cltemp1].fname,"")!=0)) cltemp1++;if(strcmp(uof[cltemp1].fname,"")==0){if (disk[diskh]!=-1){strcpy(uof[cltemp1].fname,cfname);strcpy(uof[cltemp1].fattr,cfattr);uof[cltemp1].recordl=crecordl;uof[cltemp1].fstatue=1;uof[cltemp1].readp=disk[diskh];uof[cltemp1].writep=disk[diskh];fdph[frd]=disk[diskh];fdpt[frd]=disk[diskh];strcpy(ufd[frd].fname,cfname);strcpy(ufd[frd].fattr,cfattr);ufd[frd].recordl=crecordl;ufd[frd].addrf=disk[diskh];diskh=disk[diskh];printf("%s\n","文献建立成功!");}else printf("%s\n","磁盘没有空间,不能建文献!");}else printf("%s\n","没有空的登记拦1,不能建文献");}else printf("%s\n","没有空的登记拦2,不能建文献");}else printf("%s\n","同名文献不能建立!");};void open(char pfname[20],char ooptype[10]){int cltemp1=uno*L,cltemp2=(uno+1)*L;int cltemp3=uno*S,cltemp4=(uno+1)*S;while ((cltemp1<cltemp2)&&(strcmp(ufd[cltemp1].fname,pfname)!=0)) cltemp1++;if(strcmp(ufd[cltemp1].fname,pfname)==0){while ((cltemp3<cltemp4)&&(strcmp(uof[cltemp3].fname,pfname)!=0)) cltemp3++;if(strcmp(uof[cltemp3].fname,pfname)==0)//有文献{if(uof[cltemp3].fstatue==0) printf("%s\n","文献已打开!");else printf("%s\n","此文献正在建立,不能打开!");}else//无文献{开!");if(strcmp(ufd[cltemp1].fattr,ooptype)!=0) printf("%s\n","操作不正当,不能打else{cltemp3++; cltemp3=uno*S;while ((cltemp3<cltemp4)&&(strcmp(uof[cltemp3].fname,"")!=0))if(strcmp(uof[cltemp3].fname,""))printf("%s\n","在已开表中没有空拦,不能打开文献!");} } elseelse{}}strcpy(uof[cltemp3].fname,pfname);uof[cltemp3].recordl=ufd[cltemp1].recordl;strcpy(uof[cltemp3].fattr,ufd[cltemp1].fattr);uof[cltemp3].readp=ufd[cltemp1].addrf;uof[cltemp3].writep=ufd[cltemp1].addrf;uof[cltemp3].fstatue=0;printf("%s\n","打开文献成功!");printf("%s\n","此文献已不存在,不能打开!");};void write(char wfname[20],int wrecordno){int cltemp1=uno*L,cltemp2=(uno+1)*L;int cltemp3=uno*S,cltemp4=(uno+1)*S;while ((cltemp3<cltemp4)&&(strcmp(uof[cltemp3].fname,wfname)!=0)) cltemp3++;if(strcmp(uof[cltemp3].fname,wfname)) printf("文献没有建立或打开,不能写");//在已开文献中没有次文献,不能写else//文献建立或打开{if(uof[cltemp3].fstatue)//建立{printf("%s%d%s","写第",uof[cltemp3].writep,"块空间!");if(disk[diskt]==-1)printf("%s\n","没有空闲块不能写!");else{} } uof[cltemp3].writep=disk[diskt]; diskt=disk[diskt];printf("%s\n","写文献成功!");else//打开{if(strcmp(uof[cltemp3].fattr,"r")==0)printf("%s\n","操作不正当,不能写!");else{if(disk[diskt]==-1)printf("%s\n","没有空闲块不能写!");else{printf("%s%d%s\n","写第",uof[cltemp3].writep,"块空间!");uof[cltemp3].writep=disk[uof[cltemp3].writep];printf("%s\n","写文献成功!");}}}}};void read(char rfname[20],int rreadl){int cltemp1=uno*S,cltemp2=(uno+1)*S,frd;while ((cltemp1<cltemp2)&&(strcmp(uof[cltemp1].fname,rfname)!=0)) cltemp1++;if(strcmp(uof[cltemp1].fname,rfname)==0){printf("%s%d%s\n"," 第",uof[cltemp1].readp,"块读");frd=fdph[uno*L];while ((cltemp2!=disk[frd])&&(disk[frd]!=-1)) frd=disk[frd];uof[cltemp1].readp=disk[frd];printf("%s\n","文献读成功"); }else printf("%s\n","文献未打开不能读");};void close(char cofname[20]){int cltemp1=uno*S,cltemp2=(uno+1)*S;while ((cltemp1<cltemp2)&&(strcmp(uof[cltemp1].fname,cofname)!=0)) cltemp1++;if(strcmp(uof[cltemp1].fname,cofname)==0){printf("uof[cltemp1].fname=%s,cofname%s\n",uof[cltemp1].fname,cofname);cltemp2=uof[cltemp1].fstatue;printf("uof[cltemp1].fstatue=%d\n",cltemp2);switch (cltemp2){} } else case 1:printf("%s\n","写文献结束符。
操作系统实验---文件系统
实验报告实验题目:文件系统姓名:学号:课程名称:操作系统所在学院:信息科学与工程学院专业班级:计算机任课教师:实验项目名称文件系统一、实验目的与要求: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命令,回车,输入文件名,回车,即会在当前目录文件下删除一个名为刚刚输入的文件名的数据文件。
在该删除过程中要判断该目录中是否存在该文件,如果不存在就没有必要执行该操作了,还要判断在该目录下有没有删除文件的权限,有权限才可以删除。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第九章文件系统9.1 概述操作系统作为计算机最重要的系统软件必须提供数据存储、数据处理、数据管理的基本功能。
数据存储通常是以文件形式存放在磁盘或其他外部存储介质上,因此文件系统在操作系统中占有非常重要的地位。
为了同时支持多个文件系统,Solaris操作系统实现了一个虚拟的文件系统框架,并在此框架下实现了多个文件系统类型,例如UFS文件系统和NFS文件系统。
我们设计的文件系统实验分为四个部分:①观察Vnode和Inode数据结构,熟悉文件在操作系统内部的控制结构;②观察VFS文件系统cache,学习操作系统中文件系统缓存的设计;③观察UFS的文件数据在磁盘上的组织方式,了解文件系统真正的存储结构;④观察ZFS的文件数据在磁盘上的组织方式,了解Sun公司下一代文件系统的存储结构。
9.2 实验1:Vnode和Inode数据结构及缓存9.2.1 实验内容及目的为了更好地支持多种类型的文件系统,Solaris操作系统在设计上使用了一种特殊的结构:虚拟文件系统框架。
在虚拟文件系统中,操作系统内核通过vnode来识别每个活动文件,对于一个具体的文件系统,例如UFS,则是由Inode来识别具体的文件。
本实验的目的是观察Solaris操作系统内核中Vnode和Inode数据结构,了解它们之间的关系,同时学习使用mdb在内核中查找指定的数据结构。
9.2.2 预备知识Solaris操作系统通过VFS接口来使用文件系统,因此Solaris可以支持多个不同的文件系统,Vnode代表内核中一个活动文件,它定义了对文件操作的接口,并且将所有对文件的操作定向到相应的特定文件系统函数上。
对每一个活动文件、每一个目录和每一个安装的文件系统都分配唯一的Vnode。
Vnode代表内核中的一个文件,作为对象,它封装了文件的状态和对此文件执行的操作。
Vnode对象隐藏了每个具体文件系统对这些操作的实现,并将独立于文件系统的数据和对文件的操作暴露给内核的其他部分。
因此,Vnode (/usr/include/sys/vnode.h)包含三个重要元素(如图9-1所示):●独立于文件系统的数据------Vnode自身的信息,如类型(v_type)、状态标志(v_flags)、执行的文件系统、引用记数等。
●实现文件方法的函数------指向文件系统相关函数集的指针。
●特定文件系统数据-----指向具体文件系统的数据。
在UFS中,所有文件相关的信息都保存在一个称为Inode (/usr/include/sys/fs/ufs_inode.h)的索引节点中。
Inode节点有2种,一种保存在磁盘上,称为on-disk inode;另一种称为in-core inode,在某一具体文件被打开时在内核中创建。
Inode的结构如图9-2所示。
204 第9章图9-1 Vnode 数据结构图9-2 在in-core inode 中包含on-disk inode在图9-2中,struct icomon 就是on-disk inode ,它的大小是128字节。
当in-core inode 被创建的时候,on-disk inode 的信息被包含在其中(也就是struct icomon )。
实验的过程:打开一个磁盘文件,用mdb 在内核中通过进程控制块查找vnode 和相应的inode 。
9.2.3 实验步骤1)启动一个shell ,使用vi 编辑器生成文件/work/exp_design/test.txt ,内容为字符串“Thisis a___文件系统205file for UFS testing.”。
2)退出vi编辑器,使用命令#/usr/sfw/bin/gcc file_access.c编译生成可执行程序a.out。
3)运行“mdb -k”,进入内核模块调试程序。
4)启动另一个shell,运行./a.out。
The file descriptor returned is 3The data read from the file tis This is a5)切换回正在运行mdb的shell,获取进程a.out的地址:> ::ps!grep a.outR 843 804 843 804 0 0x42004000 ffffffff83d25dd8 a.outffffffff83d25dd8这个地址是proc类型的数据,也就是进程的pcb。
6)使用命令fd获得有关这个进程打开文件的file类型数据结构的地址。
> fffffffff83d25dd8::fd 3ffffffff84ldee387)打印出这个file数据结构的内容。
> ffffffff84ldee38::print struct file{f_tlock = {_opaque = [0]}f_flag = 0xlf_pad = 0xbaddf_vnode = 0xffffffff84181140f_offset = 0x9f_cred = 0xfffffff83a95bd0f_audit_data = 0f_count = 0x1}其中f_vnode就是这个文件的vnode地址。
8)打印出vnode结构的内容。
> ffffffff84181140::print struct vnode{v_lock = { _opaque = [ 0 ]}v_flag = 0x10000v_count = 0x2v_data = 0xfffffff8417f7a8v_vfsp = rootv_stream = 0v_type = 1 (VREG)v_rdev = 0xffffffffffffffffv_vfsmountedhere = 0206 第9章v_op = 0xffffffff80dda0c0v_pages = 0xfffffffffabbe0b0v_npages = 0v_msnpages = 0v_scanfront = 0v_scanback = 0v_filocks = 0v_shrlocks = 0v_nbllock = {_opaque = [ 0 ]}v_cv = {_opaque = 0}v_locality = 0v_femhead = 0v_path = 0xffffffff83ed8b88 “/work/exp_design/test/txt”v_rdcnt = 0x1v_wrcnt = 0v_mmap_read = 0v_mmap_write = 0v_mpssdata = 0v_scantime = 0v_mset = 0v_msflags = 0v_msnext = 0v_msprev = 0v_mslock = {_opaque = [0]}}从v_path可以看到,当前的Vnode节点就是我们所打开的文件/work/exp_design/test.txt。
9)Vnode结构中,v_data数据项就是当前Vnode下层的文件系统节点地址,因为我们打开的是一个UFS磁盘数据文件,所以这里指向的是一个内核Inode。
使用print 命令打印这个Inode节点的内容。
> ffffffff8417f7a8::print struct inode{ i_chain = [ 0xffffffff810721b0, 0xfffffff810721b0 ]i_freef = 0xffffffff8417f7a8i_freeb = 0xffffffff8417f7a8i_ic = {ic_smode = 0x8180ic_nlink = 0x1ic_suid = 0ic_sgid = 0ic_lsize = 0x2cic_atime = { tv_sec = 0x45f654f4tv_usec = 0xbe42e___文件系统207 }ic_mtime = {tv_sec = 0x45a71fa6tv_usec = 0x4fc3b}ic_ctime = {tv_sec = 0x45c14e2etv_usec = 0xbea5f}ic_db = [ 0x366745, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]ic_ib = [ 0, 0, 0 ]ic_flags = 0ic_blocks = 0x2ic_gen = 0x1e6e850eic_ahadow = 0ic_uid = 0ic_gid = 0ic_oeftflag = 0}i_vnode = 0xffffffff84181140i_devvp = 0xffffffff80e51c40i_dev = 0x6600000000i_number = 0x6671bi_diroff = 0i_ufsvfs = 0xffffffff80e4e400i_dquot = 0i_rwlock = {_opaque = [ 0 ]}i_contents = {_opaque = [ 0 ]}i_tlock = {_opaque = [ 0 ]}i_nextr = 0x1000i_flag = 0x40i_seq = 0xffi_cachedir = 1 (CD_ENABLED)i_mapcnt = 0i_map = 0i_rdev = 0i_delaylen = 0i_delayoff = 0i_nextrio = 0x1000i_wrirtes = 0i_wrcv = {_opaque = 0}i_doff = 0xd8090d80i_ufs_acl = 0208 第9章i_danchor = {dca_dircache = 0dca_lock = {_opaque = [ 0 ]}}i_writer = 0}可以看到,Inode结构中有一项i_vnode指向对应的Vnode,i_ic指向on-disk inode。
9.3 实验2:观察VFS文件系统cache9.3.1 实验内容和目的由于文件系统设计大量的I/O操作,因此成为现代操作系统的一个性能瓶颈。
操作系统中改善文件系统性能的一个重要方法是设计文件系统cache。
本实验的目的是观察Solaris操作系统内核中VFS文件系统的文件数据cache、vnode/文件名cache(dnlc)/inode cache。
通过这个实验,我们可以学习文件系统的cache设计。
9.3.2 预备知识在Solaris操作系统内核中,所有的物理页都映射为vnode/offset对。
对于文件来说,如果一个文件的数据被操作系统读入内存,数据所存放的页和这个文件对应同一个vnode,offset则是物理页中数据在文件中的偏移。