操作系统实验报告模板 联系客服

发布时间 : 星期五 文章操作系统实验报告模板更新完毕开始阅读030dc12d4b35eefdc8d333e1

【实验截图】

在linux下运行结果

【实验心得体会】

这次的上机内容是有关我们上课学习的PV操作实现进程同步和互斥模型。在我看来,这是进一步展开操作系统的整个进程机制。在此次实验中,我在Linux系统里用C语言实现了课本上有关司机和售票员同步运行的过程,以此来模拟进程的同步互斥模型。

首先,这是我第一次在Linux系统环境下进行编程,也是我第一次接触Linux系统。因此,一开始,总觉得很不方便,所有的操作得在终端中运行,就像Windows系统下的DOS环境一样。但是我觉得只要掌握了几个命令其实也是很方便的。由于Linux中支持P、V操作的一些结构体,所以很简单就可以写出P,V操作得函数。

总之,此次实验不但帮我进一步理解了进程同步和互斥模型,还使我了解Linux系统下的C编程。

实验三 文件系统的设计与基本操作的实现

【实验目的】

理解文件系统的组织结构 理解文件系统的描述结构 【实验软硬件环境】

Linux 、Windows98、Windows2000 【实验内容】

选择一种操作系统(UNIX),理解其文件系统结构。

设计并实现文件系统的描述结构; 显示文件系统中文件的属性;

给出文件系统最基本操作的仿真实现。

【实验程序及分析】 程序中带有详细的解释。

整体编程思路为: 首先建立文件系统的基本存储部分,包括结构体变量等等的定义,主要利用数组的存储功能模拟文件系统。除了基本的目录查看,目录创建、删除,文件创建、删除外,我还增加了文件的读写的函数,实现了文件的读出与写入。但由于用的是数组存储,所以有长度限制,具体可参加程序注释。#include #include #include #include using namespace std;

//1代表普通文件2代表目录文件0表示空文件

//基本变量常量定义去 #define GENERAL 1 #define DIRECTORY 2 #define NULL 0 int OpenFileCount = 0; struct FCB {

char fname[16]; //文件名 char type; int size; //文件大小

int fatherBlockNum; //当前的父目录盘块号

int currentBlockNum; //当前的盘块 void initialize()

{

strcpy(fname,\ type = NULL; size =0; fatherBlockNum = currentBlockNum = 0; } };

/*常量设置*/

const char* FilePath = \ const int BlockSize = 512; //盘块大小 const int OPEN_MAX = 5; //能打开最多的文件数

const int BlockCount = 128; //盘块数 const int DiskSize = BlockSize*BlockCount; //磁盘大小

const int BlockFcbCount =

BlockSize/sizeof(FCB);//目录文件的最多FCB数

struct OPENLIST //用户文件打开表 {

int files; //当前打开文件数 FCB f[OPEN_MAX]; //FCB拷贝 OPENLIST() {

files=0;

for(int i=0;i

f[i].type=GENERAL; } } };

/*-------------目录文件结构---------------*/ struct dirFile {

struct FCB fcb[BlockFcbCount]; void init(int _FatherBlockNum,int _CurrentBlockNum,char *name)//父块号,当前块号,目录名 {

strcpy(fcb[0].fname,name); //本身的FCB

fcb[0].fatherBlockNum=_FatherBlockNum;

fcb[0].currentBlockNum=_CurrentBlockNum;

fcb[0].type=DIRECTORY; //标记目录文件

for(int i=1;i

fcb[i].fatherBlockNum=_CurrentBlockNum; //标记为子项

fcb[i].type=NULL; // 标记为空白项 } } };

/**********************************************************************/ struct DISK {

int FAT1[BlockCount]; //FAT1 int FAT2[BlockCount]; //FAT2 struct dirFile root; //根目录 char data[BlockCount-3][BlockSize]; void format() {

memset(FAT1,0,BlockCount); //FAT1

memset(FAT2,0,BlockCount); //FAT2

FAT1[0]=FAT1[1]=FAT1[2]=-2; //0,1,2盘块号依次代表FAT1,FAT2,根目录区

FAT2[0]=FAT2[1]=FAT2[2]=-2; //FAT作备份

root.init(2,2,\根目录区

memset(data,0,sizeof(data));//数据区 } };

/*-----------------全局变量--------------------------*/ FILE *fp; //磁盘文件地址

char * BaseAddr; //虚拟磁盘空间基地址 string currentPath=\ //当前路径 int current=2; //当前目录的盘块号 string cmd; //输入指令

struct DISK *osPoint; //磁盘操作系统指针

char command[16]; //文件名标识 struct OPENLIST* openlist; //用户文件列表指针

/*-----------函数事先申明--------------------*/ int mkdir(char *sonfname); int create(char *name); int listshow(); int delfile(char *name);

//int changePath(char *sonfname); int write(char *name); int exit();

int open(char *file); int close(char *file); int read(char *file);

/*------------初始化-----------------------*/ int format()

{

current = 2;

currentPath=\ //当前路径 osPoint->format();//打开文件列表初始化

delete openlist;

openlist=new OPENLIST;

/*-------保存到磁盘上myfiles--------*/ fp = fopen(FilePath,\

fwrite(BaseAddr,sizeof(char),DiskSize,fp); fclose(fp);

printf(\-------------\\n\\n\ return 1; }

/*-----------------------创建子目录-------------------*/

int mkdir(char *sonfname) {

//判断是否有重名 //寻找空白子目录项 //寻找空白盘块号

//当前目录下增加该子目录项 //分配子目录盘块,并且初始化 //修改fat表 int i,temp,iFAT;

struct dirFile *dir; //当前目录的指