文档库 最新最全的文档下载
当前位置:文档库 › 【精选】操作系统课程设计(文件系统管理)文件

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

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

评定等级

操作系统课程设计

文件系统管理

学院计算机学院

专业计算机科学与技术

班级

姓名

学号

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 );在主文件目录中,每个用户目录文件都占有一个目录项,其目录项中包括用户名和指向该用户目

录的指针。

本设计主要实现下面几个数据结构:

M D F U F D A F D 用户名文件名打开文件名

文件目录指针保护码打开保护码

用户名文件长度读写指针

文件目录指针文件名

·

·

·

总体的流程图如下:

六、详细设计

主要数据结构:

1.MFD (Master File Directory ),主要用以存放用户,可以增加存放密码的字符数组,本设

计没有保密安全方面的忧虑,为了使用时操作更简单省去密码。所以,MFD 结构仅包括用户名和指向子目录的一个指针,以及指向下一用户的连接点,为线性结构。

struct MFD

{

char name[20]; //用户名

UFD *bst_pointer; //文件目录指针

MFD *link;

};

2. UFD (User File Directory ),用于存放文件的数据结构。由于本设计为了加快检索速度,

使用了二叉排序树的结构,所以UFD 结构中相应加入了用于树结构的parent,leftchild ,和rightchild 记录链接情况。

当本文件为普通文件时,为下级记录申请AFD (file ),folder 为空。同样,当本文件为文件

夹时,为它申请相应的空间,AFD 为空。以此来达到无穷级别目录的存储。

struct UFD

{

UFD *parent;

UFD *leftchild;

UFD *rightchild;

UFD *folder; //作为文件夹时指向下一层,文件时为空

UFD *pre_folder; //指向上一层目录(文件夹时用到)

AFD *file; //作文文件时文件的具体内容

char name[30]; //文件(夹)名字

int length; //作为文件时文件的长度,默认为0

char rw; //读写标志r or w

char share; //共享标志y or n

char file_folder; //指示此文件是文件或文件夹, f 为文件,o 为文件夹

};

3.AFD ,存放文件的内容的结构,比较简单,文件内容用一个字符数组存储,为顺序结构,

最多可存放99 个字符

struct AFD

{

char afd_file[100];

int read; //读指针

int write; //写指针

};

4.REC

struct REC //UFD 的线性链,用于记录共享文件和已打开文件

{

UFD *file;

REC *link;

};

关键函数说明:

void Log_in(); //登陆

void Init_user(); //创建用户

void Check_user(); //查看用户

以上三个函数为开始时管理用户创建和登陆的函数。开始时没有用户,需要创建后才可登陆。创建用户即自动分配一个存放用户文件的UFD ,此时的UFD 为空,需要后续的创建

文件以及文件夹的分配。

UFD *operations(UFD *fileBST); //文件夹的操作调用

用户登陆后即开始对该用户文件UFD 的操作,同时,若在文件夹中创建一个文件夹,

它同样可以分配得到一个UFD ,对用户文件的操作可以重复调用,以此来达到无穷级目录

的操作。在里层文件的操作和外层的是一样的,但若要退回外层文件夹就需要逐层返回,不能立即跳到某一层某地址。操作完毕后返回改变后的文件存储状态。

void fcreate(UFD *fileBST); //对文件夹的六个基本操作

UFD *fdelete(UFD *fileBST);

void fopen(UFD *fileBST);

void fclose(UFD *fileBST);

void fread_write(UFD *fileBST,char f); //读写操作。按选择f=5 为读6 为写以上五个函数为对文件的六个基本操作,其中读文件和写文件部分代码相同,所以由一个函数完成。在create五个函数中,分别对文件夹fileBST 做了相应的处理,由于删除文件

的函数可能会删除到头结点,所以需要一个返回值。

void insertBST(UFD *fileBST,UFD *newBST); //在fileBST 中插入新的结点newBST

UFD *searchBST(UFD *fileBST,char name); //在fileBST 树中查找名字为name 的结

//点并返回该结点,文件不存在则返回空void BSTtraverse(UFD *fileBST); //遍历二叉树

UFD *deleteBST(UFD *fileBST,char name[30]); //删除name 结点,返回删除后的结点由于该设计的存储结构用到了二叉排序树,所以把相关的操作写成函数,供基本操作的函数调用。insert 函数在fileBST 中插入新的结点newBST;search 函数在fileBST 树中查找名字为name 的结点并返回该结点,文件不存在则返回空;还有traverse 和delete 函数对二叉排序树做了基本的操作。

void print_path(UFD *fileBST); //输出当前路径

void print_open_file(); //输出已打开的文件

为了在文件系统中使用户看出路径及一些相关的状态,设置了输出文件路径的函数,路径由每个文件的结构体中pre_folder 记录上一层的文件夹名字,这样逐层输出即可达到目的。

每执行一次操作就输出一次已打开的文件的具体情况,打开的文件应及时关闭,否则删除时会有删除失败提示。

UFD *check_share(char name[30]); //在共享链中检查是否有name 文件,有则

//返回该UFD ,没则NULL

void del_in_share(UFD *node); //在共享链中删除node 结点以上两个函数为对共享文件的处理函数,当打开或读写文件时在本层文件中未找到相应

的文件时,就用check_share 函数在共享文件中查找,如果存在就返回该文件的UFD,不存在就返回NULL ,而del_in_share 函数是伴随着删除文件的函数出现的,目的是为了删除文

件以后不会在共享链中再存在。

具体代码如下:

filesysterm.h

struct AFD

{

char afd_file[100];

int read; //读指针

int write; //写指针

};

struct UFD

{

UFD *parent;

UFD *leftchild;

UFD *rightchild;

UFD *folder; //作为文件夹时指向下一层,文件时为空

UFD *pre_folder; //指向上一层目录(文件夹时用到)

AFD *file; //作文文件时文件的具体内容

char name[30]; //文件(夹)名字

int length; //作为文件时文件的长度,默认为0

char rw; //读写标志r or w

char share; //共享标志y or n

char file_folder; //指示此文件是文件或文件夹, f 为文件,o 为文件夹

};

struct MFD

{

char name[20]; //用户名

UFD *bst_pointer; //文件目录指针

MFD *link;

};

struct REC //UFD 的线性链,用于记录共享文件和已打开文件

{

UFD *file;

REC *link;

};

void Log_in(); //登陆

void Init_user(); //创建用户

void Check_user(); //查看用户

UFD *operations(UFD *fileBST); //文件夹的操作调用,user 不为空时为第一层

void fcreate(UFD *fileBST); //对文件夹的六个基本操作

UFD *fdelete(UFD *fileBST);

void fopen(UFD *fileBST);

void fclose(UFD *fileBST);

void fread_write(UFD *fileBST,char f); //代码有重复,合并读写操作。按选择s=5 为读6 为写

void insertBST(UFD *fileBST,UFD *newBST); //新文件插入到user 文件树中

UFD *searchBST(UFD *fileBST,char name); //在fileBST 树中查找名字为name 的结点并返回该结点

//文件不存在则返回空

void BSTtraverse(UFD *fileBST); //遍历二叉树

UFD *deleteBST(UFD *fileBST,char name[30]); //删除成功返回1,失败返回0

void print_path(UFD *fileBST); //输出当前路径

void print_open_file(); //输出已打开的文件

UFD *check_share(char name[30]); //在共享链中检查是否有name 文件,有则返回UFD ,没则NULL

void del_in_share(UFD *node); //在共享链中删除node 结点

main.cpp

#include

#include

#include"filesystem.h"

MFD *mfd_link=NULL; //用户链表

MFD *pre_user; //当前操作用户

UFD *pre_opera_folder=NULL; //当前操作文件夹

int folder_depth=0; //记录当前文件深度(用于辅助pre_folder 的初始化)REC *share_file=NULL;

REC *open_file=NULL;

void print_path(UFD *fileBST) //输出路径

{

if(fileBST->pre_folder!=NULL)

{ print_path(fileBST->pre_folder);

printf("/%s",fileBST->pre_folder->name);

}

else

printf("/%s",pre_user->name);

}

void print_open_file()

{

REC *temp;

int i=5;

temp=open_file;

while(temp!=NULL)

{

printf("%s\t%d\t\t",temp->file->name,temp->file->length);

if(temp->file->rw=='r')printf(" 只读\t");

else printf(" 可读写\t");

if(temp->file->share=='y')printf(" 是\t");

else printf(" 否\t");

for(i=0;i<5;i++)

{

if(temp->file->file->afd_file[i]!='\0')

printf("%c",temp->file->file->afd_file[i]);

else break;

}

if(temp->file->file->afd_file[i]!='\0'&&i==5) printf("..");

printf("\n");

temp=temp->link;

}

}

void BSTtraverse(UFD *fileBST) //遍历二叉树(前序遍历){

UFD *left,*right;

printf("%s",fileBST->name);

if(fileBST->file_folder=='o') //输出..以区分文件夹

printf("..\t");

else

printf("\t");

if(fileBST->leftchild!=NULL) //递归

{

left=fileBST->leftchild;

BSTtraverse(left);

}

if(fileBST->rightchild!=NULL)

{

right=fileBST->rightchild;

BSTtraverse(right);

}

}

UFD *searchBST(UFD *fileBST,char name[30])// 在fileBST 树中查找名字为name 的结点并返回该结点

{ //文件不存在则返回空

int flag;

flag=strcmp(fileBST->name,name);

if(flag==0)

return fileBST; //查找成功

else if(flag>0)

{

if(fileBST->leftchild==NULL) return NULL; //查找失败

else

searchBST(fileBST->leftchild,name); //递归调用

}

else

{

if(fileBST->rightchild==NULL) return NULL;

else

searchBST(fileBST->rightchild,name);

}

}

void insertBST(UFD *fileBST,UFD *newBST) // 将结点newBST 插入原二叉树fileBST 中

{

int flag;

flag=strcmp(fileBST->name,newBST->name);

if(flag>0)

{

if(fileBST->leftchild==NULL) //插入

{

fileBST->leftchild=newBST;

newBST->parent=fileBST;

}

else

insertBST(fileBST->leftchild,newBST); //递归调用

}

else

{

if(fileBST->rightchild==NULL) //插入

{

fileBST->rightchild=newBST;

newBST->parent=fileBST;

}

else

insertBST(fileBST->rightchild,newBST); //递归调用

}

/*flag=0 的情况已在创建时排除*/

}

UFD *deleteBST(UFD *fileBST,char name[30])// 删除名字问name 的文件结点

{

UFD *parent_file=NULL,*del_file=NULL;

UFD *move_file=NULL,*move_file_parent;

del_file=searchBST(fileBST,name);

if(del_file==NULL)

{

printf(" 没有此文件,删除失败!\n");

getch();

return fileBST; //查找失败

}

if(del_file->file_folder=='o'&&strcmp(del_file->folder->name,"NULL")!=0)

{ printf(" 注意,本系统未能实现级联删除,请先逐个删除文件!");

printf(" 文件夹非空,删除失败!\n");

getch();

return fileBST;

}

if(del_file->share=='y') //先在共享链中删除

del_in_share(del_file);

parent_file=del_file->parent;

if(del_file->leftchild==NULL&&del_file->rightchild==NULL) // 被删除结点为子叶结点

{

if(del_file==fileBST) //只有一个结点

{

strcpy(fileBST->name,"NULL");

}

else if(parent_file->leftchild==del_file)

{

parent_file->leftchild=NULL;

free(del_file);

}

else

{

parent_file->rightchild=NULL;

free(del_file);

}

}

else if(del_file->leftchild==NULL||del_file->rightchild==NULL) //被删除结点没有做孩子或右孩子

{

if(del_file->leftchild==NULL) //没有左孩子

{

if(parent_file==NULL) //删除的为根结点

{

fileBST=del_file->rightchild;

del_file->rightchild->parent=NULL;

}

else if(parent_file->leftchild==del_file) //右孩子接上

{

parent_file->leftchild=del_file->rightchild;

del_file->rightchild->parent=parent_file;

}

else //右孩子接上

{

parent_file->rightchild=del_file->rightchild;

del_file->rightchild->parent=parent_file;

}

}

else //没有右孩子

{

if(parent_file==NULL) //删除的为根结点

{

fileBST=del_file->leftchild;

del_file->leftchild->parent=NULL;

}

else if(parent_file->leftchild==del_file) //左孩子接上

{

parent_file->leftchild=del_file->leftchild;

del_file->leftchild->parent=parent_file;

}

else //左孩子接上

{

parent_file->rightchild=del_file->leftchild;

del_file->leftchild->parent=parent_file;

}

}

free(del_file);

}

else //左右孩子都有{

move_file_parent=del_file->leftchild;

move_file=move_file_parent->rightchild;

if(move_file==NULL) //被删除结点的左孩子没有右孩子

{

if(parent_file==NULL) //删除的为根结点

{

fileBST=move_file_parent;

fileBST->rightchild=del_file->rightchild;

fileBST->parent=NULL;

}

else if(parent_file->leftchild==del_file)

parent_file->leftchild=move_file_parent;

else

parent_file->rightchild=move_file_parent;

move_file_parent->parent=parent_file;

move_file_parent->rightchild=del_file->rightchild;

}

else

{

while(move_file->rightchild!=NULL) //寻找右边最底下的结点

{

move_file=move_file->rightchild;

move_file_parent=move_file_parent->rightchild;

}

move_file_parent->rightchild=NULL;

move_file->leftchild=del_file->leftchild;

move_file->rightchild=del_file->rightchild;

if(move_file->rightchild!=NULL)

move_file->rightchild->parent=move_file; //右孩子的双亲也要改变

move_file->parent=del_file->parent;

if(fileBST==del_file) //删除的为根结点

fileBST=move_file;

free(del_file);

}

}

printf(" 成功删除文件%s\n",name);

getch();

return fileBST;

}

void del_in_share(UFD *node)

{

REC *first,*second;

first=share_file;

second=share_file->link;

if(second==NULL)

{share_file=NULL;free(first);}

else

do

{

if(second->file==node)

{first->link=second->link;free(second);}

else

{

first=first->link;

second=second->link;

}

}while(second!=NULL);

}

void fcreate(UFD *fileBST) //在fileBST 的同一层创建文件

{

char s;

char name[30];

int flag=0;

UFD *newfile,*temp=NULL;

REC *stemp;

system("cls");

printf("----------------------------------------------------------------\n");

printf("------------------- 文件系统/创建文件---------------------\n");

printf("----------------------------------------------------------------\n\n");

do

{

printf(" 1. 创建文件\n");

printf(" 2. 创建文件夹\n");

printf(" 3. 取消\n");

printf(" 请选择:\n");

scanf("%c",&s);

fflush(stdin);

if(s=='3')return;

if(s!='1'&&s!='2')

printf(" 输入错误,请重新输入!\n");

}while(s!='1'&&s!='2');

if(strcmp(fileBST->name,"NULL")==0) //节点已有(未赋值)用于本层文件夹的第一个文件的特殊情况

newfile=fileBST;

else{

newfile=(UFD*)malloc(sizeof(UFD)); //创建树节点

newfile->leftchild=NULL;

newfile->rightchild=NULL;

}

printf(" 请输入文件(夹)名:");

scanf("%s",name);

fflush(stdin);

//搜索二叉树,文件重名就创建失败

temp=searchBST(fileBST,name);

if(temp!=NULL)

{

printf(" 已存在该文件(夹),创建失败!\n");

strcpy(newfile->name,"NULL");

return;

}

strcpy(newfile->name,name);

if(folder_depth==1)

newfile->pre_folder=NULL;

else

newfile->pre_folder=pre_opera_folder;// 指向正在操作文件夹

while(1) //读写否,共享否

{

printf(" 只读r 还是可读写w:");

scanf("%c",&(newfile->rw));

fflush(stdin);

printf(" 是否共享y/n:");

scanf("%c",&(newfile->share));

fflush(stdin);

if((newfile->rw=='r'||newfile->rw=='w')&&(newfile->share=='y'||newfile->share=='n')) break;

printf(" 输入有误,请重新输入!\n");

}

//*********** 以下为文件和文件夹初始化中不同的地方****************** if(s=='1')

{

newfile->file_folder='f';

newfile->folder=NULL;

newfile->file=(AFD*)malloc(sizeof(AFD));

printf(" 请输入文件的内容(<100):");

scanf("%s",newfile->file->afd_file);

fflush(stdin);

newfile->length=strlen(newfile->file->afd_file);

}

else //文件夹的初始化{

newfile->file_folder='o';

newfile->file=NULL;

newfile->length=0;

newfile->folder=(UFD*)malloc(sizeof(UFD)); //连上一个空文件节点

newfile->folder->pre_folder=newfile;

newfile->folder->leftchild=NULL;

strcpy(newfile->folder->name,"NULL");

newfile->folder->rightchild=NULL;

}

//****************************************************************

if(fileBST!=newfile)

insertBST(fileBST,newfile); // 初始化完成后插入到二叉树中else

newfile->parent=NULL;// 第一个结点略去插入,其双亲结点为空

if(newfile->share=='y') //接入共享链

{

stemp=((REC*)malloc(sizeof(REC)));

stemp->file=newfile;

stemp->link=share_file;

share_file=stemp;

}

}

UFD *fdelete(UFD *fileBST) //在fileBST 的同一层删除文件

{

char name[30];

REC *temp;

printf(" 请输入要删除的文件:");

scanf("%s",name);

fflush(stdin);

temp=open_file; //检查文件是否打开,打开则删除失败while(temp!=NULL)

{

if(strcmp(temp->file->name,name)==0)

{ printf(" 文件打开中,请关闭后再删除!");

getch();

return fileBST;

}

else temp=temp->link;

}

fileBST=deleteBST(fileBST,name);

return fileBST;

}

void fopen(UFD *fileBST)

{

char name[30];

UFD *temp=NULL,*temp1=NULL;

printf(" 请输入要打开的文件的名字:");

scanf("%s",name);

fflush(stdin);

temp=searchBST(fileBST,name);

if(temp==NULL)

{

printf(" 文件不存在!\n");

temp=check_share(name);

if(temp==NULL)

{ printf(" 文件不存在!\n");

return;

}

}

//******************* 找到文件,以下为打开部分********************** if(temp->file_folder=='o') //打开文件夹

{

folder_depth++;

temp1=pre_opera_folder; //保护正在操作文件

pre_opera_folder=temp;

temp->folder=operations(temp->folder);

pre_opera_folder=temp1; //写回

folder_depth--;

}

else //打开文件

{

REC *newopen;

newopen=((REC*)malloc(sizeof(REC)));// 接入打开链

newopen->file=temp;

newopen->link=open_file;

open_file=newopen;

printf(" 已成功打开问%s!\n",temp->name);

getch();

}

}

void fclose()

{

char name[30];

REC *first=NULL,*second=NULL;

printf(" 请输入要关闭的文件:");

scanf("%s",name);

fflush(stdin);

first=open_file;

if(first==NULL)

{

printf(" 没有打开的文件\n");

getch();

return;

}

else second=first->link;

if(second==NULL&&strcmp(first->file->name,name)==0)

{

free(first); open_file=NULL;

printf(" 成功关闭文件%s\n!",name);

return;

}

else

{

while(second!=NULL)

{

if(strcmp(second->file->name,name)==0)

{

first->link=second->link; free(second);

printf(" 成功关闭文件%s\n!",name);

return;

}

else

{first=first->link;second=second->link;}

}

}

printf(" 没有找到问件%s,关闭失败!\n",name);

}

void fread_write(UFD *fileBST,char f)

{

char s;

char name[30];

char newfile[100];

UFD *temp=NULL;

if(f=='5')

printf(" 请输入要读取的文件的名字:");

else

printf(" 请输入要写入的文件的名字:");

scanf("%s",name);

fflush(stdin);

temp=searchBST(fileBST,name);

if(temp==NULL)

{

printf(" 文件不存在!\n");

temp=check_share(name);

if(temp==NULL)

{ printf(" 文件不存在!\n");

return;

}

}

if(temp->file_folder=='o')

{

printf(" 文件夹不可读写!");

return;

}

printf(" 文件的内容是:%s\n\n\n",temp->file->afd_file);

getch();

if(f=='5')return; //读取文件操作到此结束

if(temp->rw=='r')

{

printf(" 只读文件,不可写入!\n");

return;

}

else //追加或重写

{

do

{

system("cls");

printf(" 1. 追加\n");

printf(" 2. 重写\n");

printf(" 3. 取消\n");

printf(" 请选择:\n");

scanf("%c",&s);

fflush(stdin);

if(s=='3')return;

if(s!='1'&&s!='2')

printf(" 输入错误,请重新输入!\n");

}while(s!='1'&&s!='2');

printf(" 请输入要重写或追加的内容(<100):");

scanf("%s",newfile);

fflush(stdin);

if(s=='1') //修改strcat(temp->file->afd_file,newfile);

else

strcpy(temp->file->afd_file,newfile);

temp->length=strlen(temp->file->afd_file);

}

}

UFD *check_share(char name[30])

{

char s;

UFD *temp=NULL;

REC *stemp=NULL;

printf(" 共享文件夹为:\n");

stemp=share_file;

while(stemp!=NULL)

{ printf("%s",stemp->file->name);

if(stemp->file->file_folder=='f')printf("\t");

else printf("..\t");

stemp=stemp->link;

}

printf("\n 是否尝试在共享文件夹中打开(y/n):");

do

{

s=getchar();

if(s=='n'||s=='N')return NULL;

else if(s=='y'||s=='Y')break;

else printf(" 输入错误,请重新输入:");

}while(s!='y'&&s!='n'&&s!='Y'&&s!='N');

stemp=share_file;

while(stemp!=NULL)

{

if(strcmp(stemp->file->name,name)==0)

{temp=stemp->file;break;}

stemp=stemp->link;

}

return temp;

}

UFD *operations(UFD *fileBST)

{

while(1)

{

char s;

system("cls");

if(open_file!=NULL)

{

printf(" 已打开文件,请及时关闭!\n");

printf(" 文件名\t 文件长度\t 读写\t 共享\t 内容");

printf("\n");

print_open_file();

printf("\n");

}

printf(" 当前路径:");

print_path(fileBST);

printf("\n");

if(strcmp(fileBST->name,"NULL")==0)

printf(" 本层文件为空!\n");

else

{ printf(" 本文件夹包含以下文件:\n");

BSTtraverse(fileBST);

}

printf("\n");

printf(" 1. 创建文件create \n");

printf(" 2. 删除文件delete \n");

操作系统课程设计报告书

题目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

操作系统课程设计

课程设计报告 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 -

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

操作系统课程设计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);在主文件目录中,每个用户目录文件都占有一个目

操作系统课程设计报告

操作系统课程设计报告

东莞理工学院 操作系统课程设计报告 学院:计算机学院 专业班级: 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<

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

目录 第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;

操作系统课程设计报告

上海电力学院 计算机操作系统原理 课程设计报告 题目名称:编写程序模拟虚拟存储器管理 姓名:杜志豪.学号: 班级: 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

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

评定等级 操作系统课程设计 文件系统管理 学院计算机学院 专业计算机科学与技术 班级 姓名 学号 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 );在主文件目录中,每个用户目录文件都占有一个目录项,其目录项中包括用户名和指向该用户目 录的指针。

操作系统课程设计报告

东莞理工学院 操作系统课程设计报告学院:计算机学院 专业班级: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<

操作系统课程设计报告

; 一、概述 课程设计目的、意义: 课程设计目的使学生熟悉文件管理系统的设计方法;加深对所学各种文件操作的了解及其操作方法的特点。通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。 主要任务: 模拟文件系统设计是设计和实现一个简单的文件系统。内容包括: 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;

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

操作系统课程设计报告 专业:计算机信息处理 学号: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<

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

操作系统课程设计 班级: 姓名: 学号: 使用语言: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; //下个文件块地址 };

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

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

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

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

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

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

操作系统课程设计报告

操作系统课程设计实验报告 实验名称:进程控制 姓名/学号: 一、实验目的 学习、理解和掌握Linux与windows的进行控制系统调用的功能,熟悉主要的几个系统调用命令的格式和如何利用系统调用命令进行编程。通过学习,理解如何创建一个进程、改变进程执行的程序、进程和线程终止以及父子进程的同步等,从而提高对进程和线程控制系统调用的编程能力。 二、实验内容 设计并实现Unix的“time”命令。“mytime”命令通过命令行参数接受要运行的程序,创建一个独立的进程来运行该程序,并记录程序运行的时间。 三、实验环境 CPU: Inter ×2 2.10GHz RAM: 3.00GB Windows 7 旗舰版 Linux Ubuntu 10.04 编译: VS2010 四、程序设计与实现 4.1进程控制系统的调用 4.1.1 windows进程控制调用程序中使用的数据结构及主要符号说明 SYSTEMTIME starttime,endtime; //进程开始时间和结束时间 PROCESS_INFORMATION pi //该结构返回有关新进程及 //其主线程的信息 STARTUPINFO si //该结构用于指定新进程的主窗口特性4.1.2 linux进程控制调用程序中使用的数据结构及主要符号说明 struct timeval starttime,endtime //进程开始时间和结束时间 pid_t pid //进程标志符

4.2 程序流程图 图1 windows进程控制调用图2 linux进程控制调用程序运行流程图程序运行流程图 五、实验结果和分析 5.1 windows实验结果和分析

操作系统课程设计论文

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

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

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

摘要 此系统实现了存储管理、设备管理和进程管理。 存储管理部分主要实现主存空间的分配和回收。存储管理采用可移动的可变分区存储管理方式。采用数组来模拟主存,大小为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

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

操作系统课程设计模拟文 件系统 Newly compiled on November 23, 2020

目录第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;

计算机操作系统课程设计

计算机操作系统课程设计 班级:计091-1 姓名: 学号: 使用语言: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; //目录地址 };

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

中国石油大学(华东)操作系统课程设计报告 姓名: 学号: 成绩: 目录

实验一、螺旋矩阵 (3) 实验二、用Shell程序实现文件的批量管理 (4) 实验三、驱动下的螺旋矩阵程序 (7) 实验四、哲学家进餐问题 (10) 实验五、NCURSE程序框架 (14) 实验一、螺旋矩阵

一、实验任务 用C语言编写一个螺旋矩阵程序,实现输入行数和列数即可形成A~Z的螺旋矩阵,并用Makefile完成编译。 二、实验环境和工具 VMware Workstation红帽子 Linux-2.4.20-8 三、关键代码 1、螺旋矩阵实现代码(SpiralMatrix.c) #include #define N 10 int main() { int row,col,i,j,x,y,startNum; int dx[4]={0,1,0,-1};//方向 int dy[4]={1,0,-1,0}; int Matrix[N][N]; printf("请输入行数和列数:"); scanf("%d %d",&row,&col); for (i=0;i=0&&x=0&&y

操作系统课程设计题目

操作系统课程设计 一、课程设计题目 实现一个模拟操作系统。 二、课程设计的目的 通过模拟操作系统原理的实现,加深对操作系统工作原理理解,进一步了解操作系统的实现方法,并可练习合作完成系统的团队精神和提高程序设计能力。 三、小组人数 建议3~4人一组共同完成模拟系统的实现。 四、编程语言 建议使用VC、VB、C#、Java等Windows环境下的程序设计语言,以借助这些语言环境来模拟硬件的一些并行工作。 五、课程设计内容 模拟采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存储管理、设备管理、文件管理和用户接口四部分。 六、课程设计具体要求和内容 1.文件管理和用户接口 文件管理和用户接口部分实现的主要是单用户的磁盘文件管理部分,包括文件的逻辑结构、物理结构、目录、磁盘分配回收、文件的保护和用户接口的实现。 ⑴文件的逻辑结构 文件的逻辑结构采用流式结构; 文件的内容均采用文本文件; 系统中有两种文件,一种是存放任意字符的文件,一种是可执行文件。可执行文件的内容就是模拟系统内进程的程序体。 文件中要有一种特定命令的“可执行”文件,该文件中的命令有: x=?; 给x赋值一位数 x++; x加1 x--; x减1 !??;第一个?为A,B,C中某个设备,第二个?为一位数,表示使用设备的时间(由于没有实际设备,所以无法知道设备何时工作完成,所以假定一个数,这个数随着系统时间增加而递减,减到0时,认为是设备工作完成); end. 表示文件结束,同时将结果写入文件out,其中包括文件路径名和x的值。 ⑵磁盘模拟 用一个文件disk1模拟磁盘c,用一个文件disk2模拟磁盘d。两个磁盘一样大小,磁盘的每个盘块64字节,模拟磁盘共有128块。第0、1块存放文件分配表,第2块存放根目录,其余存放子目录和文件。 ⑶目录结构 目录结构采用树型目录结构。 ①目录项内容(8个字节): 目录名、文件名:3个字节; 扩展名:2个字节(可执行文件扩展名为ex,目录没有扩展名); 目录、文件属性:1字节(1位标识是文件还是目录,1位标识只读还是非只读,1位是隐藏属性,标识显示还是不显示); 起始盘块号:1个字节; 文件长度:1字节(目录没有长度)。

相关文档