操作系统实验里模拟实现磁盘文件管理

合集下载

操作系统实习报告--文件管理模拟

操作系统实习报告--文件管理模拟

操作系统小学期----文件管理模拟学院:信息科学与技术专业:计算机科学与技术年级:班级:姓名:学号:日期:2011年9月一.问题描述文件管理是操作系统的五大职能之一,主要涉及文件的逻辑组织和物理组织,目录的结构和管理。

主要的磁盘调度算法有:1.先来先服务算法(FCFS);2.最短寻道时间优先算法(SSTF);3.扫描算法(SCAN);4.循环扫描算法(CSCAN)等。

用程序模拟磁盘的调度过程,并计算各磁盘调度算法包括先来先服务算法、最短寻道时间优先算法、扫描算法和循环扫描算法的平均寻道长度。

二.问题分析在多道程序设计的计算机系统中,各个进程可能会不断提出不同的对磁盘进行读/写操作的请求。

由于有时候这些进程的发送请求的速度比磁盘响应的还要快,因此我们有必要为每个磁盘设备建立一个等待队列。

先来先服务(FCFS :afirst-come-first-served)的策略,即先来的请求先被响应。

FCFS策略看起来似乎是相当"公平"的,但是当请求的频率过高的时候FCFS策略的响应时间就会大大延长。

FCFS策略为我们建立起一个随机访问机制的模型,但是假如用这个策略反复响应从里到外的请求,那么将会消耗大量的时间。

为了尽量降低寻道时间,看来我们需要对等待着的请求进行适当的排序,而不是简单的使用FCFS策略。

这个过程就叫做磁盘调度管理。

有时候fcfs也被看作是最简单的磁盘调度算法。

最短时间优先算法(SSTF)选择这样的进程。

要求访问的磁道,与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。

扫描(SCAN)调度算法:该算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。

例如,当磁头正在自里向外移动时,SCAN算法所考虑的下一个访问对象,应是其欲访问的磁道,既在当前磁道之外,又是距离最近的。

这样自里向外的访问,直至再无更外的磁道需要访问时,才将磁道换向自外向里移动。

操作系统文件管理系统模拟实验

操作系统文件管理系统模拟实验

操作系统文件管理系统模拟实验在计算机科学中,操作系统是一种系统软件,负责管理计算机硬件和软件资源,并为用户和应用程序提供接口。

文件管理系统是操作系统的一个重要组成部分,它负责管理计算机系统中的文件和目录,以及提供对它们的访问和操作。

本次实验旨在模拟操作系统中文件管理系统的基本功能和操作。

我们将使用一个虚拟的文件系统,通过命令行界面来模拟用户与文件系统的交互。

以下是实验的具体内容和步骤:1. 创建虚拟文件系统首先,我们需要创建一个虚拟的文件系统。

文件系统由文件和目录组成,可以通过树状结构来表示。

我们可以使用一个数据结构来模拟文件系统的存储和管理。

2. 初始化文件系统在开始操作文件系统之前,我们需要初始化文件系统。

这包括创建根目录和设置当前目录为根目录。

3. 文件和目录的创建与删除文件和目录是文件系统的基本单位。

我们可以通过命令来创建和删除文件和目录。

例如,使用"mkdir"命令创建一个目录,使用"touch"命令创建一个空文件,使用"rm"命令删除文件或目录。

4. 文件和目录的访问权限文件和目录可以设置不同的访问权限,以保护文件系统的安全性。

我们可以使用"chmod"命令来修改文件或目录的权限。

权限通常包括读、写和执行权限。

5. 文件和目录的重命名和移动我们可以使用"mv"命令来重命名文件或目录,使用"cp"命令来复制文件或目录,使用"mv"命令来移动文件或目录。

6. 文件和目录的查找和显示我们可以使用"ls"命令来显示当前目录下的文件和目录,使用"cd"命令来切换当前目录,使用"pwd"命令来显示当前目录的路径。

此外,我们还可以使用"find"命令来查找文件或目录。

7. 文件和目录的读写操作文件可以被读取和写入。

操作系统文件管理系统模拟实验

操作系统文件管理系统模拟实验

操作系统文件管理系统模拟实验操作系统文件管理系统模拟实验一、实验目的本实验旨在通过模拟操作系统的文件管理系统,加深对操作系统文件管理的理解,锻炼操作系统的应用能力。

二、实验环境1、操作系统:Windows/Linux/MacOS2、编程语言:C/C++/Java/Python等三、实验内容1、初始化文件管理系统1.1 创建根目录,并初始化空文件目录1.2 初始化用户目录和权限设置2、文件操作2.1 创建文件2.1.1 检查文件名合法性2.1.2 检查文件是否已存在2.1.3 为新文件分配磁盘空间2.1.4 添加文件元数据信息2.2 打开文件2.2.1 检查文件是否存在2.2.2 检查用户权限2.3 读取文件内容2.3.1 读取文件权限检查2.3.2 读取文件内容2.4 写入文件内容2.4.1 写入文件权限检查2.4.2 写入文件内容2.5 删除文件2.5.1 检查文件是否存在2.5.2 检查用户权限2.5.3 释放文件占用的磁盘空间2.5.4 删除文件元数据信息3、目录操作3.1 创建子目录3.1.1 检查目录名合法性3.1.2 检查目录是否已存在3.1.3 添加目录元数据信息3.2 打开目录3.2.1 检查目录是否存在3.2.2 检查用户权限3.3 列出目录内容3.3.1 列出目录权限检查3.3.2 列出目录内容3.4 删除目录3.4.1 检查目录是否存在3.4.2 检查用户权限3.4.3 递归删除目录下所有文件和子目录3.4.4 删除目录元数据信息四、实验步骤1、根据实验环境的要求配置操作系统和编程语言环境。

2、初始化文件管理系统,创建根目录,并初始化用户目录和权限设置。

3、进行文件操作和目录操作。

五、实验结果分析根据实验步骤进行文件操作和目录操作,观察系统的运行情况并记录相关实验结果。

六、实验结论通过本实验,深入了解了操作系统中文件管理系统的相关原理和实现方式,并且通过实验操作进一步巩固了相应的应用能力。

操作系统试验模拟文件管理系统

操作系统试验模拟文件管理系统

一、实验目的和要求(必填)实验目的:通过在VC平台下编程,设计和调试一个简单的文件系统,通过模拟文件操作命令的执行,来模拟文件系统对文件及目录的管理。

实验要求:两名学生成组结对完成实验,仿真出文件系统中对文件和目录的操作。

二、实验内容(必填)文件管理:实现一个简单的文件系统三、实验原理或实验方法(必填)原理:通过结构体来描述文件和目录,利用链表知识实现目录树结构,通过对链表的操作实现整个文件系统中目录和文件的相关操作。

方法:学生两人结对进行实验,分别实现对文件和目录的操作。

对文件的操作包括:创建文件create、读文件read、写文件write、删除文件delete。

对目录的操作包括:创建目录mkdir、切换目录cd、展示目录内容dir、删除目录rm。

四、主要仪器设备或实验条件Windows操作系统,VC开发环境五、实验步骤(含实验数据记录处理)或操作设计过程记录#include "stdio.h"#include "iostream.h"#include "string.h"#define FILENAME_LENGTH 10 //文件名称长度#define COMMAND_LENGTH 10 //命令行长度#define PATH_LENGTH 30 //参数长度struct filenode{char filename[FILENAME_LENGTH];int isdir;char content[255];filenode *parent;filenode *child;filenode *prev;filenode *next;};filenode *initnode(char filename[],int isdir);void createroot();int run();int findpath(char *topath);void help();int mkdir();int create();int read();int write();int del();int rm();int cd();int dir();filenode *root,*recent,*temp,*ttemp,*temp_child;charpath[PATH_LENGTH],command[COMMAND_LENGTH],temppath[PATH_LENGTH],recen tpath[PATH_LENGTH];//创建文件或目录的存储节点filenode* initnode(char filename[],int isdir){filenode *node=new filenode;strcpy(node->filename,filename);node->isdir=isdir;node->parent=NULL;node->child=NULL;node->prev=NULL;node->next=NULL;return node;}//初始化文件系统根结点void createroot (){recent=root=initnode("/",1);root->parent=NULL;root->child=NULL;root->prev=root->next=NULL;strcpy(path,"/");}void help(){cout<<endl;cout<<"create: 建立文件。

(完整word版)操作系统文件管理系统模拟实验(word文档良心出品)

(完整word版)操作系统文件管理系统模拟实验(word文档良心出品)

文件管理系统模拟1. 实验目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现2. 实验内容为Linux系统设计一个简单的二级文件系统。

要求做到以下几点:(1)可以实现下列几条命令(至少4条)logi n 用户登录dir 列文件目录creat e 创建文件delete删除文件ope n 打开文件close 关闭文件read 读文件write 写文件(2) 列目录时要列出文件名、物理地址、保护码和文件长度;(3) 源文件可以进行读写保护。

3. 实验提示(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。

主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。

(2)用户创建的文件,可以编号存储于磁盘上。

入file0,file1,file2 …并以编号作为物理地址,在目录中进行登记。

4. 源代码#i nclude<stdio.h>#i nclude<stri ng.h>#i nclude<stdlib.h>#defi ne MEM_D_SIZE 1024*1024 //总磁盘空间为1M#defi ne DISKSIZE 1024//磁盘块的大小1K#defi ne DISK_NUM 1024//磁盘块数目1K#defi ne FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT表大小#defi ne ROOT_DISK_NO FATSIZE/DISKSIZE+1//根目录起始盘块号#defi ne ROOT_DISK_SIZE sizeof(struct direct) // 根目录大小#defi ne DIR_MAXSIZE 1024//路径最大长度为1KB#defi ne MSD 5//最大子目录数5 }ope nitem[MOFN];#defi ne MOFN 5 int cur_size; /* 当前打文件的//最大文件深度为5 数目*/#defi ne MAX_WRITE 1024*128 };//最大写入文字长度128KBstruct fatitem *fat; /*FAT 表*/ struct fatitem /* size 8*/ struct direct *root; /* 根目录*/ { struct direct *cur_dir; /* 当前int item; /* 存放文件下一个磁目录*/盘的指针*/ struct ope ntable u_ope ntable; /* char em_disk; /*磁盘块是否空闲文件打开表*/标志位0空闲*/ int fd=-1; /* 文件打开表的序}; 号*/char *bufferdir; /* 记录当前路struct direct 径的名称*/{ char *fdisk; /* 虚拟磁盘起始地/*―一文件控制快信息―一*/址*/struct FCB{ void ini tfile();char n ame[9]; /* 文件/目录void format();名8位*/ void en ter();char property; /* 属性1位void halt();目录0位普通文件*/ int create(char *n ame);int size; /* 文件/目录字int ope n( char *n ame);节数、盘块数)*/ int close(char *n ame);int firstdisk; /* 文件/目int write(i nt fd,char *buf,i nt 录起始盘块号*/ len);int next; /* 子目录起始盘int read(i nt fd,char *buf);块号*/ int del(char *n ame);int sig n; /*1 是根目录0 int mkdir(char *n ame);不是根目录*/ int rmdir(char *n ame);void dir();}directitem[MSD+2]; int cd(char *n ame);void prin t();}; void show();struct opentable void ini tfile(){struct ope {fdisk =(char{ *)malloc(MEM_D_SIZE*sizeof(char)char n ame[9]; /* 文件名*/ );/* 申请1M空间*/int firstdisk; /* 起始盘块format(); 号*/int size; /* 文件的大小*/ }void format() {int i;FILE *fp;fat = (struct fatitem *)(fdisk+DISKSIZE); /* 计算FAT表地址,引导区向后偏移1k)*//*----- 初始化FAT 表----------- */fat[0].item=-1; /*fat[0].em_disk='1'引导块*/for(i=1;i<ROOT_DISK_NO-1;i++)/*存放FAT表的磁盘块号*/{ fat[i].item=i+1; fat[i].em_disk='1';}fat[ROOT_DISK_NO].item=-1;/*存放根目录的磁盘块号*/fat[ROOT_DISK_NO].em_disk='1'for(i=ROOT_DISK_NO+1;i<DISK_N UM;i++){fat[i].item = -1; fat[i].em_disk ='O';} _/* -------------------------------------------- */root = (struct direct*)(fdisk+DISKSIZE+FATSIZE); /* 根目录的地址*//*初始化目录*//* ------- 指向当前目录的目录项----- */root->directitem[0].sig n = 1;root->directitem[0].firstdisk=ROOT_DISK_NO;strcpy(root->directitem[0]. na me,".");root->directitem[0]. next = root->directitem[0].firstdisk;root->directitem[0].property ='1';root->directitem[0].size = ROOT_DISK_SIZE;/* ------ 指向上一级目录的目录项----- */root->directitem[1].sig n = 1;root->directitem[1].firstdisk=ROOT_DISK_NO;strcpy(root->directitem[1]. na me,"..");root->directitem[1]. next = root->directitem[0].firstdisk;root->directitem[1].property='1';root->directitem[1].size = ROOT_DISK_SIZE;if((fp = fope n("disk.dat","wb"))==NULL){prin tf("Error:\n Cannot ope n file \n");return;}for(i=2;i<MSD+2;i++) /*-子目录初始化为空-*/{root->directitem[i].sig n =0;root->directitem[i].firstdisk=-1;strcpy(root->directitem[i]. na me,"");root->directitem[i]. next =-1;root->directitem[i].property='0';root->directitem[i].size =0;}}}if((fp=fope n( "disk.dat","wb"))==NULL){prin tf("Error:\nCannotope n file \n");return;} if(fwrite(fdisk,MEM_D_SIZE,1, fp)!=1) /* 把虚拟磁盘空间保存到磁 盘文件中*/{prin tf("Error:\nFilewrite error! \n");}fclose(fp); }void en ter() {FILE *fp; int i;fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char) );/* 申请1M 空间*/if((fp=fopen( "disk.dat","rb") )==NULL){prin tf("Error:\nCa nnotope n file\n");return; }if(!fread(fdisk,MEM_D_SIZE,1, fp)) /* 把磁盘文件 disk.dat 读入 虚拟磁盘空间(内存)*/{prin tf("Error:\nCa nnotread file\n");exit(0);fat = (struct fatitem *)(fdisk+DISKSIZE); /* 找至U FAT表 地址*/root = (struct direct*)(fdisk+DISKSIZE+FATSIZE);/* 找 到根目录地址*/fclose(fp); /* ------------- 初始化用户打 开表 ----------- */ for(i=0;i<MOFN;i++) {strcpy(u_ope ntable.ope nitem[i ].name,"");u_ope ntable.ope nitem[i].first disk = -1;u_ope ntable.ope nitem[i].size =0;}u_ope ntable.cur_size = 0; cur_dir = root; /* 当前目录为根 目录*/bufferdir = (char *)malloc(DIR_MAXSIZE*sizeof(char ));strcpy(bufferdir,"Root:"); }void halt() {FILE *fp; int i;if((fp=fopen("disk.dat","wb") )==NULL){prin tf("Error:\nCa nnotope n file\n");return;if(!fwrite(fdisk,MEM_D_SIZE,1,fp)) /* 把虚拟磁盘空间(内存)内容读入磁盘文件disk.dat */{prin tf("Error:\nFile writeerror!\n");}fclose(fp);free(fdisk);free(bufferdir); return;}int create(char *n ame){int i,j;if(strle n(n ame)>8) /* 文件名大于8位*/return(-1);for(j=2;j<MSD+2;j++) /* 检查创建文件是否与已存在的文件重名*/{if(!strcmp(cur_dir->directite m[j]. name, name)) break;} if(j<MSD+2) /* 文件已经存在*/return(-4);for(i=2;i<MSD+2;i++) /* 找到第一个空闲子目录*/{if(cur_dir->directitem[i].firstdisk==-1)break;}if(i>=MSD+2) /* 无空目录项*/return(-2); if(u_ope ntable.cur_size>=MOFN) /* 打开文件太多*/return(-3);for(j=ROOT_DISK_NO+1;j<DISK_NUM; j++) /*找到空闲盘块j后退出*/{if(fat[j].em_disk=='O') break;} if(j>=DISK_NUM) return(-5);fat[j].em_disk = '1'; /* 将空闲块置为已经分配*//* ---------- 填写目录项---------------- */strcpy(cur_dir->directitem[i]. name, name);cur_dir->directitem[i].firstdisk=j;cur_dir->directitem[i].size =0;cur_dir->directitem[i]. next =j;cur_dir->directitem[i].property = '0';/* --------------------------------*/fd = ope n(n ame);return 0;}int ope n( char *n ame){int i, j;for(i=2;i<MSD+2;i++) /* 文件是否存在*/{if(!strcmp(cur_dir->directite m[i]. name, name)) break;} if(i>=MSD+2) return(-1);/* ------- 是文件还是目录---------------------- */if(cur_dir->directitem[i].property=='1') return(-4);/* ------ 文件是否打开---------------------- */for(j=0;j<MOFN;j++){if(!strcmp(u_ope ntable.ope nit em[j]. name, name)) break;}if(j<MOFN) /* 文件已经打开*/return(-2);if(u_ope ntable.cur_size>=MOFN) /* 文件打开太多*/return(-3);/* ------ 查找一个空闲用户打开表项--------------- */for(j=0;j<MOFN;j++){if(u_ope ntable.ope nitem[j].fi rstdisk==-1)break;/* ------------- 填写表项的相关信息--------------- */ u_ope ntable.ope nitem[j].firstdisk = cur_dir->directitem[i].firstdiskJ strcpy(u_ope ntable.ope nitem[j].name ,n ame);u_ope ntable.ope ni tem[j].size=cur_dir->directitem[i].size;u_ope ntable.cur_size++;/* ---------- 返回用户打开表表项的序号 ------------------------ */return(j);}int close(char *n ame){int i;for(i=0;i<MOFN;i++){if(!strcmp(u_ope ntable.ope nitem[i]. name, name))break;}if(i>=MOFN)return(-1);/* ---------- 清空该文件的用户打开表项的内容*/strcpy(u_ope ntable.ope ni tem[i].n ame,"");u_ope ntable.ope nitem[i].firstdisk = -1;u_ope ntable.ope nitem[i].size=0;u_ope ntable.cur_size--;}return 0;} int write(i nt fd, char *buf, i nt len) {char *first;int item, i, j, k;int ilen1, ilen2, modlen, temp;/* --------- 用$字符作为空格# 字符作为换行符*/char Space = 32;char En dter= '\n';for(i=0;i<le n;i++){if(buf[i] == '$')buf[i] = Space;else if(buf[i] == '#')buf[i] = En dter; }/* --------- 读取用户打开表对应表项第一个盘块号---------------------- */下标-*//* ---- 找到的item是该文件的最后一块磁盘块*/while(fat[item].item!=-1){item =fat[item].item; /*-查找该文件的下一盘块--*/}/*----- 计算出该文件的最末地址----- */first = fdisk+item*DISKSIZE+u_ope ntable. ope nitem[fd].size%DISKSIZE;/* ----- 如果最后磁盘块剩余的大小大于要写入的文件的大小*/if(DISKSIZE-u_ope ntable.ope ni tem[fd].size%DISKSIZE>le n){ strcpy(first,buf);u_ope ntable.ope ni tem[fd].sizeu_ope ntable.ope nitem[fd].size+le n;item = u_ope ntable.ope nitem[fd].firstdi sk;/* ------------ 找到当前目录所对应表项的序号------------------------- */for(i=2;i<MSD+2;i++){if(cur_dir->directitem[i].firstdisk==item)break;}temp = i; /*- 存放当前目录项的cur_dir->directitem[temp].siz ecur_dir->directitem[temp].size+l en;}else{for(i=0;i<(DISKSIZE-u_ope ntab le.ope nitem[fd].size%DISKSIZE);i ++){/*写一部分内容到最后一块磁盘块的剩余空间(字节)*/first[i] = buf [i];/*----- 计算分配完最后一块磁盘的剩余空间(字节)还剩下多少字节未存储------------- */ile n1 = len-(DISKSIZE-u_ope ntable.ope nitem[fd].size%DISKSIZE);ile n2 = ile n1/DISKSIZE; modlen = ilen 1%DISKSIZE; if(modlen>0)ilen2 = ilen 2+1; /*--还需要多少块磁盘块-*/for(j=0;j<ile n2;j++){for(i=ROOT_DISK_NO+1;i<DISK_N UM;i++)/*寻找空闲磁盘块*/{if(fat[i].em_disk=='O')break;} if(i>=DISK_NUM) /*--如果磁盘块已经分配完了-*/return(-1);first = fdisk+i*DISKSIZE; /*-- 找到的那块空闲磁盘块的起始地址-*/if(j==ile n2-1) /*--如果是最后要分配的一块-*/{for(k=0;k<le n-(DISKSIZE-u_ope ntable.ope nitem[fd].size%DISKSIZE)-j*DISKSIZE;k++)first[k] = buf[k];}else/*-如果不是要最后分配的一块--*/{for(k=0;k<DISKSIZE;k++)first[k]=buf[k];}fat[item].item = i;/*--找到一块后将它的序号存放在上一块的指针中-*/fat[i].em_disk = '1';/*--置找到的磁盘快的空闲标志位为已分配-*/fat[i].item = -1; /*--它的指针为-1 (即没有下一块)-*/}/*--修改长度-*/u_ope ntable.ope ni tem[fd].size u_ope ntable.ope nitem[fd].size+len;cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;}return 0;}int read(i nt fd, char *buf){int len = u_ope ntable.ope nitem[fd].size;char *first;int i, j, item;int ile n1, modle n;item = u_ope ntable.ope nitem[fd].firstdi sk;ile n1 = len/DISKSIZE; modle n =len %DISKSIZE;if(modle n!=0)ilen1 = ilen 1+1; /*-- 计算文件所占磁盘的块数-*/ 项的序号,供释放目录中-*/first = fdisk+item*DISKSIZE;/*--计算文件的起始位置-*/for(i=0;i<ile n1;i++){if(i==ile n1-1) /*-- 最后一个磁盘块-*/{if(cur_dir->directitem[cur_it em].property!='0') /*-- 如果删除的(不)是目录-*/return(-3);for(j=0;j<le n-i*DISKSIZE;j++)buf[i*DISKSIZE+j]= first[j];}else /*-- 不在最后一块磁盘块-*/{for(j=0;j<le n-i*DISKSIZE;j++)buf[i*DISKSIZE+j]= first[j];item = fat[item].item;/*-查找下一盘块-*/first fdisk+item*DISKSIZE;}}return 0;} int del(char *n ame){int i,cur_item,item,temp;for(i=2;i<MSD+2;i++) /*-- 查找要删除文件是否在当前目录中-*/{if(!strcmp(cur_dir->directitem[i]. name, name)) break;}cur_item = i; /*-- 用来保存目录for(i=0;i<MOFN;i++) /*--如果文件打开,则不能删除,退出-*/{if(!strcmp(u_ope ntable.ope nit em[i]. name, name))return(-2);}item = cur_dir->directitem[cur_item].firstdisk;/*-- 该文件的起始盘块号-*/while(item!=-1) /*-- 释放空间,将FAT表对应项进行修改-*/{temp = fat[item].item;fat[item].item = -1;fat[item].em_disk = '0'; item =temp;}/* ---------------- 释放目录项--------------------- */cur_dir->directitem[cur_item].sig n = 0;cur_dir->directitem[cur_item] .firstdi sk = -1;strcpy(u_ope ntable.ope nitem[cur_item]. name,"");cur_dir->directitem[cur_item]. ne xt = -1; cur_dir->directitem[cur_item].prif(i>=MSD+2) /*--目录中-*/ return(-1);如果不在当前如果在operty = 'O';cur_dir->directitem[cur_item].size = 0;return 0;}int mkdir(char *n ame){int i,j;struct direct *cur_mkdir;if(!strcmp( name,"."))return(-4);if(!strcmp( name,".."))return(-4);if(strle n(n ame)>8) /*- 如果目录名长度大于8位-*/return(-1);for(i=2;i<MSD+2;i++) /*-如果有空闲目录项退出-*/{if(cur_dir->directitem[i].firstdisk==-1)break;}if(i>=MSD+2) /*- 目录/ 文件已满-*/ return(-2);for(j=2;j<MSD+2;j++) /*-判断是否有重名-*/{if(!strcmp(cur_dir->directitem[j]. name, name))break;}if(j<MSD+2) /*- 如果有重名-*/return(-3);for(j=ROOT_DISK_NO+1;j<DISK_ N UM;j++) /*-找到空闲磁盘块j后退出-*/ {if(fat[j].em_disk=='0') break;} if(j>=DISK_NUM) return(-5);fat[j].em_disk='1'; /*- 将该空闲块设置为已分配-*//* ------------ 填写目录项--------- */strcpy(cur_dir->directitem[i].n ame ,n ame);cur_dir->directitem[i].firstd isk=j;cur_dir->directitem[i].size=ROOT_DISK_SIZE;cur_dir->directitem[i]. next=jJcur_dir->directitem[i].proper ty='1';/*-所创目录在虚拟磁盘上的地址(内存物理地址)-*/cur_mkdir=(struct direct *)(fdisk+cur_dir->directitem[i].firstdisk*DISKSIZE);/*-初始化目录-*//*-指向当前目录的目录项-*/cur_mkdir->directitem[0].sig n =0;cur_mkdir->directitem[0].firstdisk=cur_dir->directitem[i].fir stdisk;strcpy(cur_mkdir->directitem[ 0]. name,".");cur_mkdir->directitem[0]. next=cur_mkdir->directitem[0].firstd isk;cur_mkdir->directitem[0].property='1';cur_mkdir->directitem[0].size=ROOT_DISK_SIZE;/*-指向上一级目录的目录项-*/cur_mkdir->directitem[1].sig n=cur_dir->directitem[O].sig n;cur_mkdir->directitem[1].firstdisk=cur_dir->directitem[O].fir stdisk;strcpy(cur_mkdir->directitem[ 1]. name,"..");cur_mkdir->directitem[1]. next =cur_mkdir->directitem[1].firstd isk;cur_mkdir->directitem[1].prop erty='1';cur_mkdir->directitem[1].size=ROOT_DISK_SIZE;for(i=2;i<MSD+2;i++) /*-子目录都初始化为空-*/{cur_mkdir->directitem[i].sig n=0;cur_mkdir->directitem[i].firs tdisk=-1;strcpy(cur_mkdir->directitem[ i]. name,"");cur_mkdir->directitem[i]. next=-1;cur_mkdir->directitem[i].prop erty='0';cur_mkdir->directitem[i].size=0;}return 0;}int rmdir(char *n ame){int i,j,item;struct direct *temp_dir;/*-检查当前目录项中有无该目录-*/for(i=2;i<MSD+2;i++){if(!strcmp(cur_dir->directitem[i]. name, name))break;}if(i>=MSD+2) /*- 没有这个文件或目录-*/return(-1);if(cur_dir->directitem[i].property!='1')/*- 删除的不是目录-*/return(-3);/*-判断要删除的目录有无子目录-*/temp_dir=(struct direct *)(fdisk+cur_dir->directitem[i]. next*DISKSIZE);for(j=2;j<MSD+2;j++){if(temp_dir->directitem[j]. ne xt!=-1)break;}if(j<MSD+2) /*- 有子目录或文件-*/ return(-2);/* ----------- 找到起始盘块号并将其释放 ---------- */item=cur_dir->directitem[i].f irstdisk;fat[item].em_disk='0';/*-修改目录项-*/cur_dir->directitem[i].sig n=0Jcur_dir->directitem[i].firstd isk=-1;strcpy(cur_dir->directitem[i].n ame,"");cur_dir->directitem[i]. next=-1;cur_dir->directitem[i].proper ty='0';cur_dir->directitem[i].size=OJreturn 0;}void dir(){int i;for(i=2;i<MSD+2;i++){if(cur_dir->directitem[i].fir stdisk!=-1) /*- 如果存在子目录-*/{prin tf("%s\t",cur_dir->direct item[i]. name);if(cur_dir->directitem[i].property=='0') /*- 文件-*/prin tf("%d\t\t\n",cur_dir->di rectitem[i].size);elseprintf("\t< 目录>\t\n");}}}int cd(char *n ame){int i,j,item;char *str;char *temp,*po in t,*po in t1; structdirect *temp_dir; temp_dir=cur_dir;str= name;if(!strcmp("\\", name)){cur_dir = root;strcpy(bufferdir,"Root:"); return 0;}temp = (char *)malloc(DIR_MAXSIZE*sizeof(char ));/* -最长路径名字分配空间-*/for(i=0;i<(i nt)strle n( str);i+ +)temp[i]=str[i];temp[i]='\0';for(j=0;j<MSD+2;j++) /*-查找该子目录是否在当前目录中-*/{if(!strcmp(temp_dir->directit em[j]. name,temp))break;}free(temp);/* 释放申请的临时空间*///if(temp_dir->directitem[j]. property!='1') /*- 打开的不是目录-*///return(-2);if(j>=MSD+2) /*- 不在当前目录-*/return(-1);item=temp_dir->directitem[j]. firstdisk;/*-当前目录在磁盘中位置-*/temp_dir=(struct direct *)(fdisk+item*DISKSIZE);{if(!strcmp(".." ,n ame))void prin t() {if(cur_dir->directitem[j-1].sig n!=1) /*- 如果上级目录不是根目录 -*/{poi nt=strchr(bufferdir,'\\'); //查找字符串bufferdir 中首次出现 字符\的位置while(poi nt!=NULL) {point 仁point+1; /*- 减去'\'所占的空间,记录下次查找的 起始地址-*/poi nt=strchr(poi nt1,'\\'); }*(poi nt1-1)='\O';/*-将上一级目录删除-*/} }else {〃if(n ame[0] !='\\') bufferdir=strcat(bufferdir,"\\"); /*- 修改当前目录-*/bufferdir=strcat(bufferdir, name);}cur_dir=temp_dir; /*-将当前 目录确定下来-*/return 0; }void show() {prin tf("%s>",bufferdir);**********************************\n");*文 件 统计***********************、n");prin tf("*\t 命令格式说 明*\n");prin tf("*\tcd目录名 更 改当前目录 *\n");prin tf("*\tmkdir 目录名创建子目录*\n");prin tf("*\trmdir目录名删除子目录*\n");prin tf("*\tdir显 示当前目录的子目录 *\n");prin tf("*\tcreate 文件名创建文件 *\n");prin tf("*\tdel文件名删除文件 *\n");prin tf("*\tope n 文件名打开文件*\n");prin tf("*\tclose文件名关闭文件 *\n");prin tf("*\tread读 文件*\n");prin tf("*\twrite写 文件*\n");prin tf("*\texit 退 出系统 *\n");************************************\n")・}void mai n()FILE *fp; char ch;printf('\ *********************char a[100];char code[11][10];char n ame[10];int i,flag,r_size;char *con tect;con tect = (char *)malloc(MAX_WRITE*sizeof(char))Jif((fp=fopen( "disk.dat","rb") )==NULL){prin tf("You have not format,Do you want format?(y/n)"); scanf("%c",&ch);if(ch=='y'){in itfile();prin tf("Successfully format! \n");}else{return;}}en ter();prin t();show();strcpy(code[0],"exit");strcpy(code[1],"create");strcpy(code[2],"ope n");strcpy(code[3],"close");strcpy(code[4],"write");strcpy(code[5],"read"); strcpy(code[ 6],"del");strcpy(code[7],"mkdir");strcpy(code[8],"rmdir");strcpy(code[9],"dir");strcpy(code[10],"cd");while(1){sca nf("%s",a);for(i=0;i<11;i++){if(!strcmp(code[i],a)) break;}switch(i){case 0: //退出文件系统free(contect); halt(); return;case 1: // 创建文件sca nf("%s", name); flag =create( name);if(flag==-1) { prin tf("Error:\n The length is too long !\n");} else if(flag==-2){prin tf("Error: \n The direct item is already full !\n");} else if(flag==-3){prin tf("Error: \n The number of openfile is too much !\n");} else if(flag==-4){prin tf("Error: \n The name is already in the direct !\n");}else if(flag==-5){prin tf("Error: \n show();The disk space is full!' n");Ibreak;} else case 3://关闭文件{ sca nf("%s", name);flag = close( name);prin tf("Successfully create a if(flag == -1)file! \n"); {} prin tf("Error:\nThe file is not ope ned ! \n ”);show(); }break; elsefcase 2://打开文件{sca nf("%s", name); prin tf("Successfullyclose fd = ope n(n ame); \n");if(fd == -1) }{ show();prin tf("Error: \n break;The ope n file not exit! \n ”);} case 4://写文件else if(fd == -2) if(fd ==-1){ {prin tf("Error: \n prin tf("Error:\nThe file have already opened! \n”);The file is not ope ned ! \n ”);} }else if(fd == -3) else{ {prin tf("Error: \n prin tf("PleaseThe number of open file is too much! in put the file con tect:");\n");} scan f("%s",co ntect);else if(fd == -4){ flag=write(fd ,con tect,strle n( prin tf("Error: \n con tect));It is a direct,can not open for read if(flag == 0)or write! \n"); {} else prin tf("Successfullywrite { \n");}prin tf("Successfully ope ned! else\n"); {}prin tf("Error:\n The disk size is not eno ugh! \n ”);}} show(); break;case 5://读文件if(fd ==-1){prin tf("Error:\nThe file is not ope ned ! \n ”);} else{flagread(fd,c on tect);if(flag == 0) {for(i=0;i<u_ope ntable.ope nitem[fd].size;i++){prin tf("%c",co ntect[i]);} prin tf("\t\n");}}show(); break;case 6://删除文件sca nf("%s",name); flag = del( name);if(flag == -1){prin tf("Error:\nThe file not exit! \n");} else if(flag == -2){prin tf("Error:\nThe file is opened,please first close it ! \n");} else if(flag == -3){prin tf("Error:\nThe delete is not file ! \n");} else{prin tf("Successfully delete! \n");} show(); break;case 7:// 创建子目录scanf("%s", name); flag =mkdir( name);if(flag == -1) { printf("Error:\nThe length of nameis to long! \n");} else if(flag == -2){prin tf("Error:\nThe direct item is already full !\n");} else if(flag == -3){prin tf("Error:\nThe nameis already in the direct ! \n");} else if(flag == -4){ prin tf("Error: \n '..' or '.' can not as the n ame of the direct!\n");} else if(flag == -5){prin tf("Error: \n The disk space is full!' n");} else if(flag == 0){prin tf("Successfullymak edircet! \n");} show(); break;case 8://删除子目录sca nf("%s",name); flag = rmdir( name);if(flag == -1) { printf("Error:\n The direct is not exist! \n");} else if(flag == -2){prin tf("Error:\nThe direct has son direct ,please first remove the sondircct!\n");} else if(flag == -3){prin tf("Error:\nThe remove is not direct ! \n ”);} else if(flag == 0){prin tf("Successfully remove dircet! \n");}show(); break;case 9:// 显示当前子目录dir();show(); break;case 10://更改当前目录scanf("%s", name); flag = cd(name); if(flag == -1) {prin tf("Error:\nThe path no correct!\n");} else if(flag == -2){prin tf("Error:\nThe ope ned is not direct!\n");}show(); break;default:prin tf("\n Error!\ncomma nd is wrong! \n");show();}}}The5.程序运行截图:oot: >mkdii* m uccessfull^f nake direct! loot: >cd n :oot: xui>ci'ea ,te 1 uccessFullsf create a file! :oot: \m>writelease input the file connect:hello* uccessfullsf write! :oat: \n>t i ead elloT:oot : Xn>close 1uccessf 11II5P closed*00t :\n>exitress an9 key to cont inue6.实验总结通过这一次计算机操作系统的上机实验,使我对不同环境下的操作系统有了 进一步的了解,使我学到了很多关于 Linux 的操作和相关知识。

模拟磁盘文件管理系统.

模拟磁盘文件管理系统.

模拟磁盘文件管理系统一、任务描述模拟实现一个文件管理系统开发语言:C++、C语言、java开发工具:自选要求1、可以实现一下命令(以下命令至少实现5条):●login 用户登录●dir 列文件目录●create 创建文件●delete 删除文件●open 打开文件●close 关闭文件●cd 改变目录●mkdir 创建目录●rddir 删除目录●halt 退出系统2、列目录要求列出文件名、物理地址、文件大小、读写标识二、任务完成情况⑴自定义磁盘文件管理的数据结构;⑵能够自由创建、修改、删除文件;⑶文件具有一定自定义的属性;⑷能够显示当前系统文件的状态;(5)能够完成任务后退出系统。

三、系统流程图与函数调用关系1、类和主要函数程序中定义了两个类:(1)class file //文件类主要功能是对文件属性的定义,文件在虚拟磁盘地址块的定位。

(2)class fdatabase //文件操作类主要功能是对创建、删除、修改等方法的具体实现。

程序中的主要函数及说明:char *getname( ) //获取文件名int gettag( ) //获取删除标记int getlength() //获取文件大小int getblocknum() // 磁盘块数int getblocksum1() //磁盘块号的始点int getblocksum2() //磁盘块号的终点void setname(char na[ ] )//设置文件名void delwenjian(){ tag=1; } //设置删除标记 1:已删 0:未删void creatfile(char *na,int L,int num,int s1,int s2) //创建文件void deltefile(char *na) {tag=1; strcpy(name,na);} //删除文件void disp( ) //输出文件信息int search(char *fname) //按文件名查找int creatfile(char *na,int L,int num,int s1,int s2)//创建文件时先查找是否存在int deltefile(char *na) //删除文件时先查找是否存在2、函数流程图(1)整体流程图(2)创建文件流程图3、删除文件流程图4、输出文件流程图四、系统使用说明与界面设计(1)、课程设计的模板说明1、初始化,建立文件系统输入磁盘大小(G),每个盘块大小(M),自动建立位示图,位示图字长定为32位输出位示图的行数,以及行号、列号与磁盘块号的转换公式(都从0开始编号)。

操作系统 磁盘空间管理的实验报告

操作系统 磁盘空间管理的实验报告

实验五磁盘存储空间的管理一、实验目的磁盘格式化时,系统把磁盘存储空间分成许多磁道。

每个磁道又分成若干个扇区(又叫做磁盘块)。

之后用fdisk命令对硬盘进行分区,即使只有一个分区,也必须用fdisk命令进行分区。

分区的目的,就是制作文件卷,形成文件系统。

一个文件卷一般都被划分成引导扇区、文件系统管理区和文件数据区。

其中,文件数据区用来存放系统文件和用户文件。

用户可以通过文件系统提供的API,创建、打开、关闭和对文件进行读写。

当用户的文件不再需要时,就应该删除。

把一个文件放到磁盘上时,可以组织成连续文件、链接文件或索引文件等。

因此,磁盘空间的分配方法也有两种,一种是连续空间的分配,一种是不连续空间的分配(又叫动态分配)。

如何充分有效地利用磁盘空间,是操作系统应解决的重要课题之一。

本实验模拟实现磁盘空间的分配与回收,使学生对磁盘空间的管理有一个较深入的理解。

二、实验要求书写实验报告,应该包括以下几项内容:(1)实验题目;(2)程序中使用的数据结构及主要符号说明;(3)程序流程图和带有详细注释的源程序;(4)执行程序名,并打印程序运行时的初值和运行结果;(5)通过实验后的收获与体验及对实验的改进意见和见解三、实验内容(1)假定现有一个磁盘组,共有40个柱面。

每个柱面4个磁道,每个磁道又划分成4个物理记录。

磁盘的空间使用情况用位示图表示。

位示图用若干个字构成,每一位对应一个磁盘道。

“1”表示占用,“0”表示空闲。

为了简单,假定字长为16位,一个字可用来模拟磁盘的一个柱面,其位示图如图5—1所示。

系统设置一个变量S记录当前的空闲磁盘块个数。

位示图的初始状态由户自己设定。

图5-1 位示图(2)申请一个磁盘块时,由磁盘块分配程序查位示图,找出一个为0的位,并计算磁盘的物理地址(即求出它的柱面号、磁道号和扇区号)。

①由位示图计算磁盘的相对块号的公式如下:相对块号=字号*16+位号②再将相对块号转换成磁盘的物理地址:柱面号=(相对块号/16)的商,也即柱面号=字号磁道号=((相对块号/16的余数)/4)的商,也即(位号/4)的商物理块号=(((相对块号/16)的余数)/4)的余数,也即(位号/4)的余数(3)当释放一个相对物理块时,运行回收程序,计算该块在位示图中的位置,再把相应由“1”改为“0”。

磁盘管理实验报告

磁盘管理实验报告

磁盘管理实验报告磁盘管理实验报告一、引言磁盘管理是计算机操作系统中的重要组成部分,它负责管理磁盘上的文件存储和访问。

在本次实验中,我们将通过模拟磁盘管理的过程,探索不同的磁盘调度算法对系统性能的影响。

本报告将介绍实验的背景和目的,并详细讨论实验过程和结果。

二、实验背景和目的磁盘是计算机中常用的存储设备之一,它将数据以磁场的形式存储在磁道上。

磁盘的读写速度较慢,而且在多个进程同时访问磁盘时容易出现冲突。

因此,磁盘管理的优化对于提高系统的性能至关重要。

本次实验的目的是通过模拟不同的磁盘调度算法,比较它们在不同场景下的性能差异。

我们将使用C语言编写模拟程序,通过生成随机的磁盘请求序列,并使用不同的磁盘调度算法进行处理。

通过比较不同算法的平均寻道时间、平均旋转延迟和平均传输时间等指标,评估算法的优劣。

三、实验过程实验的第一步是编写模拟程序,我们使用C语言实现了一个简单的磁盘调度模拟器。

该模拟器可以生成指定数量的磁盘请求,并使用不同的磁盘调度算法进行处理。

我们实现了以下几种磁盘调度算法:1. 先来先服务(FCFS):按照请求的到达顺序进行处理。

2. 最短寻道时间优先(SSTF):选择离当前磁道最近的请求进行处理。

3. 扫描算法(SCAN):按照一个方向进行扫描,直到最边缘,然后改变方向继4. 循环扫描算法(C-SCAN):类似于SCAN算法,但是当到达最边缘时,直接返回到最开始的磁道。

5. 电梯算法(LOOK):类似于SCAN算法,但是当到达最边缘时,改变方向继续扫描。

在模拟程序中,我们使用随机数生成器生成了1000个磁盘请求,并分别使用以上算法进行处理。

在每次处理完一个请求后,我们记录下当前的磁道位置,并计算出寻道时间、旋转延迟和传输时间。

最后,我们计算出每种算法的平均寻道时间、平均旋转延迟和平均传输时间,并进行对比分析。

四、实验结果和分析根据实验结果,我们得到了每种算法的平均寻道时间、平均旋转延迟和平均传输时间。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
cout<<"\t"<<mulu[i].name<<"\t"<<mulu[i].start<<"\t"<<mulu[i].length<<"\t"<<endl;
cout<<endl;
cout<<"\tFAT表(-2表示FDF,-1表示FFF)"<<endl;
for(int j=0;j<10;j++)
int fat_i=0;
void init(){
for(int i=0;i<20;i++){
fat[i].num=i;
fat[i].next=0;
}
fat[0].next=-2;
fat[1].next=-1;
allnum-=2;
}
int getEmpty(){
for(int i=0;i<20;i++){
typedef struct MULU{
string name;
int start;
int length;
}MULU;
typedef struct FAT{
int num;
int next;
}FAT;
MULU mulu[10];
int mulu_i=0;
FAT fat[10];
int allnum=10;
操作系统实验(七)磁盘文件
1.实验内容
使用C++模拟实现磁盘文件存储结构。
2.实验目的
了解磁盘文件的存储物理结构。
3.实验题目
实现磁盘文件写(必做)和插入(选做)操作。
4.程序流程图
5.程序代码和结果
#include <iostream>
#include <string>
using namespace std;
if(fat[i].next==0){
allnum--;
return i;
}
}
return -1;
}
int write(){
cout<<"\n请输入文件名和记录数:";
string name;
int n;
int temp=0;
int next=0;
int s=0;
cin>>name;
cin>>n;
if(n>allnum){
}
temp=next;
}
fat[temp].next=-1;
mulu[mulu_i].name=name;
mulu[mulu_i].start=s;
mulu[mulu_i].length=n;
mulu_i++;
cout<<"\n\t文件目录表"<<endl;
for(i=0;i<mulu_i;i++)
cout<<"你输入的记录数过大!"<<endl(int i=0;i<n*2;i++){
next=getEmpty();
if(next==-1){
cout<<"没有空块!"<<endl;
return -1;
}
if(i==0){
s=next;
}else{
fat[temp].next=next;
cout<<"\t"<<fat[j].num<<"\t"<<fat[j].next<<"\t"<<endl;
return 1;
}
int main(){
init();
int flag=1;
while(flag<5){
write();
flag++;
}
return 0;
}
相关文档
最新文档