搜档网
当前位置:搜档网 › 操作系统实验三--文件管理

操作系统实验三--文件管理

操作系统实验三--文件管理
操作系统实验三--文件管理

《计算机操作系统》课程实验报告

题目文件管理

学院: 计算机学院

专业: 计算机科学与技术

姓名

班级

学号

2016年12月22日

实验三文件管理

1.实验目的:

编写一个简单的二级文件系统实现程序,加深对文件系统的内部功能和内部实现的理解。要求模拟采用二级目录结构的磁盘文件系统的文件操作能实现相应的命令,用输入命令来模拟用户程序中调用的文件操作。

2.实验内容:

最基本的文件操作

(1)创建文件

在创建一个新文件时,系统首先要为新文件分配必要的外存空间,并在文件系统的目录中,为之建立一个目录项。目录项中应该记录新文件的文件名及其在外存的地址等属性。

(2)删除文件

当已不再需要某文件时,可将它从文件系统中删除。在删除时,系统应该先从目录中找到要删除的文件的目录项,使之成为空项,然后回收该文件所占用的存储空间。

(3)读文件

在读一个文件时,须在相应的系统调用中给出文件名和应该读入的内存目标地址。此时,系统同样要查找目录,找到制定的目录项,从中得到被读文件在外存中的位置。在目录项中,还有一个指针用于对文件的读/写。

(4)写文件

在写一个文件时,须在相应的系统调用中给出该文件名及该文件在内存中的(源)地址。为此,也同样须先查找目录,找到指定文件的目录项,在利用目录中的写指针进行写操作。

(5)截断文件

如果一个文件的内容已经陈旧而需要全部更新文件的内容时,一种方法是将此文件删除,再重新创建一个新文件。但如果文件名及其属性均无改变时,则可采取另一种所谓的截断文件的方法,此即将原有文件的长度设置为0,或说放弃原有的文件内容。

(6)设置文件的读/写位置

前述的文件读/写操作,都只提供了对文件顺序存取的手段,即每次都是从文件的始端读或写。设置文件读/写位置的操作,用于设置文件读/写指针的位置,以便每次读/写文件时,不是从其始端而是从所设置的位置开始操作。也正因如此,才能改顺序存取为随机存取。

3.设计实现:

1)流程图

2)详细设计

源代码

#include

#include

#include

#include

#include

#define MaxUser 100 //定义最多有100个用户

#define MaxDisk 512*1024 //定义磁盘空间大小#define commandAmount //对文件操作的指令数//存储空间管理有关结构体和变量

char disk[MaxDisk];// 模拟512K的磁盘存储空间typedef struct distTable //磁盘块结构体

{

int maxlength;

int start;

int useFlag;

distTable *next;

}diskNode;

diskNode *diskHead;

typedef struct //文件快结构体

{

char [10];

int start; //文件在磁盘存储空间的起始地址int length; //文件内容长度

int maxlength;//文件的最大长度

char [3];//文件的属性--读写方式

struct tm *timeinfo;

bool openFlag;//判断是否有进程打开了文件

};

int used = 0;// 定义 MFD 目录中用已有的用户数

//两级目录结构体

typedef struct user_ //用户文件目录文件 UFD {

*file;

user_ *next;

}UFD;

typedef struct master_ //主目录文件

{

char userName[10];

char password[10];

UFD *user;

}MFD;

MFD userTable[MaxUser];

int userID = -1; //用户登录的 ID 号,值为-1 时表示没有用户登录

//文件管理

void (); //创建文件

void (); //删除文件

void (); //写文件

void ();//读文件

void (); //重命名文件

void (); //查询文件

void ();// 显示某一用户所有文件

void (); //关闭已打开的文件

void ();//修改文件的读写方式

int requestDist(int &stratPostion, int maxlength);//磁盘分配查询void initDisk();//初始化磁盘

void freeDisk(int startPostion);//磁盘空间释放

void diskShow();//显示磁盘使用情况

void initFile();

//用户管理

void userCreate();

int login();

void userDelet();

void userFind();

//用户登陆主界面

void webUser();

//用户内部界面

void webFile();

int main()

{

initDisk();

initFile();

webUser();

return 0;

}

void webUser()

{

int i;

while (1)

{

printf("************************************************************\n");

printf("1.创建用户 2.登陆用户

\n");

printf("3.删除用户 4.查看用户

\n");

printf("0.退出系统

\n");

printf("************************************************************\n");

printf("请输入操作号\n");

scanf("%d", &i);

switch (i)

{

case 0:exit(0); break;

case 1:userCreate(); break;

case 2:userID = login();

if (userID != -1)

{

webFile();

}

break;

case 3:userDelet(); break;

case 4:userFind(); break;

default:

printf("您输入的命令有误,请重新选择\n");

system("pause");

system("cls");

break;

}

}

}

void userCreate()

{

char c;

char userName[10];

int i;

if (used

{

printf("请输入用户名:");

for (i = 0; c = _getch(); i++)

{

if (c == 13) break;

else

userName[i] = c;

printf("%c", c);

}

userName[i] = '\0';

for (i = 0; i

{

if (!strcmp(userTable[i].userName, userName))

{

printf("\n");

printf("该用户名已存在,创建用户失败\n");

system("pause");

system("cls");

return;

}

}

strcpy(userTable[used].userName, userName);

printf("\n");

printf("请输入密码:");

for (i = 0; c = _getch(); i++)

{

if (c == 13) break;

else

userTable[used].password[i] = c;

printf("*");

}

userTable[userID].password[i] = '\0';

printf("\n");

printf("创建用户成功\n");

used++;

system("pause");

system("cls");

}

else

{

printf("创建用户失败,用户已达到上限\n");

system("pause");

system("cls");

}

fflush(stdin);

}

int login()

{

char name[10], psw[10];

char c;

int i, times;

printf("请输入用户名:");

for (i = 0; c = _getch(); i++)

{

if (c == 13) break;

else

name[i] = c;

printf("%c", c);

}

name[i] = '\0';

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

{

if (!strcmp(userTable[i].userName, name)) break;

}

if (i == used)

{

printf("\n 您输入的用户名不存在\n");

system("pause");

system("cls");

return -1;

}

for (times = 0; times<3; times++)

{

memset(psw, '\0', sizeof(psw));

printf("\n 请输入密码:");

for (i = 0; c = _getch(); i++)

{

if (c == 13) break;

else

psw[i] = c;

printf("*");

}

printf("\n");

for (i = 0; i

{

if (!strcmp(psw, userTable[i].password))

{

printf("用户登录成功\n");

system("pause");

system("cls");

break;

}

}

if (i == used)

{

printf("您输入的密码错误,您还有%d 次输入机会\n", 2 - times);

if (times == 2) exit(0);

}

else break;

}

fflush(stdin);

return i;

}

void userDelet()

{

int statePos;

UFD *q;

char name[10], psw[10];

char c;

int i, times, j;

printf("请输入用户名:");

for (i = 0; c = _getch(); i++)

{

if (c == 13) break;

else

name[i] = c;

printf("%c", c);

}

name[i] = '\0';

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

{

if (!strcmp(userTable[i].userName, name)) break;

}

if (i == used)

{

printf("\n 您输入的用户名不存在\n");

system("pause");

system("cls");

}

else

{

q = userTable[i].user->next;

while (q)

{

if (q-> NULL)

{

statePos = q->file->start;

}

freeDisk(statePos);

q = q->next;

}

for (i, j = i+1; i <= used; j++, i++)

{

userTable[i] = userTable[j];

}

printf("\n 用户删除成功\n");

system("pause");

system("cls");

used--;

}

}

void userFind()

{

int i;

printf("用户列表:\n");

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

{

printf("%s\n", userTable[i].userName); }

system("pause");

system("cls");

}

void webFile()

{

int i;

char name[10], kind[3];

printf("********************************************************\n"); printf(" 1.创建 2.删除 \n"); printf(" 3.写入文件 4.查看文件内容 \n"); printf(" 5.重命名 6.查看文件属性 \n"); printf(" 7.查看用户文件 8.关闭文件 \n"); printf(" 9.修改文件权限 10.查看磁盘使用情况 \n"); printf(" 11.返回上级目录 12.退出系统 \n"); printf("*********************************************************\n"); printf("请输入操作号:");

scanf("%d", &i);

while (1)

{

switch (i)

{

case 1:

();

break;

case 2:

();

break;

case 3:

();

break;

case 4:

();

break;

case 5:

();

break;

case 6:

();

break;

case 7:

();

break;

case 8:

();

break;

case 9:

();

break;

case 10:

diskShow();

break;

case 11:

system("cls");

webUser();

break;

case 12:

exit(0);

break;

default:

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

break;

}

scanf("%d", &i);

}

}

void ()

{

time_t rawtime;

int startPos;

char c;

char [10], [10], [10];

char command[50];

int length;

//int i, k,j;

printf(" 创建文件格式为名称长度权限(r、w、rw):");

fflush(stdin);

gets(command);

int i, k, j;

for (i = 0, k = 0; command[i] != ' '; i++, k++)

[k] = command[i];

[k] = '\0';

k = i;

for (i = k + 1, k = 0; command[i] != ' '; i++, k++)

[k] = command[i];

[k] = '\0';

k = i;

j = 1;

length = 0;//初始化文件长度

for (i = strlen() - 1; i >= 0; i--)//把字符串转换为十进制

{

length += ([i] - 48)*j;

j *= 10;

}

for (i = k + 1, k = 0; command[i] != ' '&&command[i] != '\0'; i++, k++) [k] = command[i];

[k] = '\0';

UFD *, *p;

for (p = userTable[userID].user->next; p != NULL; p = p->next) {

if (!strcmp(p->file->, ))

{

printf("文件重名,创建文件失败\n");

system("pause");

return;

}

}

if (requestDist(startPos, length))

{

= (UFD*)malloc(sizeof(UFD));

>file = (*)malloc(sizeof());

strcpy(>file->, );

strcpy(>file->, );

>file->maxlength = length;

>file->start = startPos;

>file->openFlag = false;

time(&rawtime);

>file->timeinfo = localtime(&rawtime);

>next = NULL;

if (userTable[userID].user->next == NULL)

userTable[userID].user->next = ;

else

{

p = userTable[userID].user->next;

while (p->next) p = p->next;

p->next = ;

}

printf("创建文件成功\n");

system("pause");

}

else

{

printf("磁盘空间已满或所创建文件超出磁盘空闲容量,磁盘空间分配失败\n");

system("pause");

}

}

void initDisk()

{

diskHead = (diskNode *)malloc(sizeof(diskNode));

diskHead->maxlength = MaxDisk;

diskHead->useFlag = 0;

diskHead->start = 0;

diskHead->next = NULL;

}

void initFile()

{

int i;

for (i = 0; i

{

userTable[i].user = (UFD *)malloc(sizeof(UFD));

userTable[i].user->next = NULL;

}

}

int requestDist(int &startPostion, int maxLength)

{

int flag = 0; //标记是否分配成功

diskNode *p, *q, *temp;

p = diskHead;

while (p)

{

if (p->useFlag == 0 && p->maxlength>maxLength)

{

startPostion = p->start;

q = (diskNode *)malloc(sizeof(diskNode));

q->start = p->start;

q->maxlength = maxLength;

q->useFlag = 1;

q->next = NULL;

diskHead->start = p->start + maxLength;

diskHead->maxlength = p->maxlength - maxLength;

flag = 1;

temp = p;

if (diskHead->next == NULL) diskHead->next = q;

else

{

while (temp->next) temp = temp->next;

temp->next = q;

}

break;

}

p = p->next;

}

return flag;

}

void freeDisk(int startPostion)

{

diskNode *p;

for (p = diskHead; p != NULL; p = p->next)

{

if (p->start == startPostion)

break;

}

p->useFlag = false;

}

void ()

{

char [10], command[50];

int i, k;

fflush(stdin);

printf(" 输入文件名称:");

gets(command);

for (i = 0, k = 0; command[i] != '\0'; i++, k++) [k] = command[i];

[k] = '\0';

UFD *p, *q, *temp;

q = userTable[userID].user;

p = q->next;

while (p)

{

if (!strcmp(p->file->, )) break;

else

实验 文件管理(二)

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

三、调度算法的流程图 四、文件管理源程序 #include<> #include<> #include<> #include<> typedef struct ufd { char filename[10];/*文件名*/ char procode[8];/*属性*/

int length;/*文件长度*/ struct ufd *nextfile;/*指向下一个文件*/ }UFD; typedef struct mfd { char username[10];/*用户名*/ struct ufd *link;/*指向该用户的第一个文件*/ }MFD; typedef struct protected_flag { char code[4]; }PRO; typedef struct afd/*运行文件目录*/ { char filename[10];/*打开文件名*/ char procode[4]; int rwpointer;/*读写指针*/ }AFD; PRO flag[3]={"100",/*只读*/ "110",/*读写*/ "001"/*可执行*/ }; UFD *rw_pointer;/*读写指针*/ AFD *afd=NULL; MFD filesystem[10]; int num;/*当前用户个数*/ void displayallfile() { int i; UFD *p; for(i=0;ifilename); printf("文件属性: %s\t||",p->procode); printf("文件长度: %d\n\n",p->length); p=p->nextfile; } }

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

操作系统实验报告实验名称:文件管理 专业班级:网络工程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;

操作系统实验报告三

课程实验报告 课程名称姓名实验名称实验目的及要求 实验3进程并发与同步 1、加深对进程概念的理解,区分进程并发执行与串行执行; 2、掌握进程并发执行的原理,理解进程并发执行的特点; 3、了解fork()系统调用的返回值,掌握用fork()创建进程的方法;熟悉wait、exit等系统调用; 4、能利用相应的系统调用实现进程树与进程间的同 步。 实 验操作系统:linux Un bu ntu 11.10 环 境实验工具:Vmware 实验内容 1、编写一C语言程序,实现在程序运行时通过系统调用fork()创建两个子进程,使父、子三进程并发执行,父亲进程执行时屏幕显示“I am father ”,儿子进 程执行时屏幕显示“ I am son ",女儿进程执行时屏幕显示“ I am daughter ”。 要求多次连续反复运行这个程序,观察屏幕显示结果的顺序,直至出现不一样的情况为止。要求有运行结果截图与结果分析 2、连续4个fork()的进程家族树,family1-1.c 程序清单如下: #in clude main () { fork(); fork(); fork(); fork(); printf( A\n ”); } 请根据程序运行结果,画出进程家族树,并分析原 因。

3、 修改程序1,在父、子进程中分别使用 wait 、exit 等系统调用“实现”其同 步推进,父进程必须等待儿子进程与女儿进程结束, 才可以输出消息。 写出相应的同 步控制,并分析运行结果。 4、 创建一个子进程,并给它加载程序,其功能是调用键盘命令“ ls -I ”,已知 该键盘命令的路径与文件名为: /bin/ls 。父进程创建子进程, 并加载./child2 程序。 写出相应的程序代码并分析程序运行结果。 1、编写一 C 语言程序,实现在程序运行时通过系统调用 fork()创建两个子进 程,使父、子三进程并发执行,父亲进程执行时屏幕显示“ I am father ”, 儿子进程执行时屏幕显示“ I am son ”,女儿进程执行时屏幕显示“ I am daughter "。并且反复的测试,观察每一次的执行的顺序有什么不同 2、修改程序1,在父、子进程中分别使用 wait 、exit 等系统调用“实现”其同 步推进,父进程必须等待儿子进程与女儿进程结束,才可以输出消息。 4、创建一个子进程,并给它加载程序,其功能是调用键盘命令“ ls -I ”,已知 该键盘命令的路径与文件名为: /bin/ls 。父进程创建子进程, 并加载./child2 程序。 法 描 述 及 实 验 步 骤 调 试过 程及实 验结果

操作系统实验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");

操作系统实验实验1

广州大学学生实验报告 1、实验目的 1.1、掌握进程的概念,明确进程的含义 1.2、认识并了解并发执行的实质 2.1、掌握进程另外的创建方法 2.2、熟悉进程的睡眠、同步、撤消等进程控制方法 3.1、进一步认识并发执行的实质 3.2、分析进程竞争资源的现象,学习解决进程互斥的方法 4.1、了解守护进程 5.1、了解什么是信号 5.2、INUX系统中进程之间软中断通信的基本原理 6.1、了解什么是管道 6.2、熟悉UNIX/LINUX支持的管道通信方式 7.1、了解什么是消息 7.2、熟悉消息传送的机理 8.1、了解和熟悉共享存储机制 二、实验内容 1.1、编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统 中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。试观察记录屏幕上的显示结果,并分析原因。 1.2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及 'son ……',父进程显示'parent ……',观察结果,分析原因。 2.1、用fork( )创建一个进程,再调用exec( )用新的程序替换该子进程的内容 2.2、利用wait( )来控制进程执行顺序 3.1、修改实验(一)中的程序2,用lockf( )来给每一个进程加锁,以实现进程之间的互斥 3.2、观察并分析出现的现象 4.1、写一个使用守护进程(daemon)的程序,来实现: 创建一个日志文件/var/log/Mydaemon.log ; 每分钟都向其中写入一个时间戳(使用time_t的格式) ; 5.1、用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child process1 is killed by parent! Child process2 is killed by parent! 父进程等待两个子进程终止后,输出如下的信息后终止: Parent process is killed! 5.2、用软中断通信实现进程同步的机理

3-实验三-表空间及数据文件管理

实验三表空间及数据库文件管理 实验报告 姓名:班级:学号: 一、实验目的 1)理解Oracle数据库的体系结构 2)掌握表空间的概念及其管理方法 3)掌握数据文件的作用及其管理 4)掌握控制文件的作用及其管理 5)掌握重做日志文件的工作方式及其管理 6)掌握数据库归档模式设置及归档管理 二、预习内容(参考教材第5章、第6章的内容) 1)什么是Oracle数据库的物理结构,具体包括哪几类文件? 2)什么是Oracle数据库的逻辑结构,如何表现? 3)数据库、表空间、数据文件、数据库对象之间的关系如何? 三、实验环境 32位Windows XP/Windows Server2000/Windows Server2003 +Oracle10g环境 四、实验内容 1)在SQL*PLUS环境下,使用SQL命令创建一个本地管理方式下自动分区管理的表空间USERTBS1,其对应的数据文件为usertbs1_1.DBF,大小为20MB。 2)使用SQL命令创建一个本地管理方式下自动分区管理的表空间USERTBS2,要求每个分区大小为512KB。 3)修改USERTBS1表空间的大小为30MB,将其数据文件改为自动扩展方式,每次扩展5MB,最大值为100MB。 4)使用SQL命令创建一个本地管理方式下的临时表空间TEMPTBS,并将该表空间作为当前数据库实例的默认临时表空间。 5)使用SQL命令对USERTBS1表空间进行联机和脱机状态转换。 6)创建一个回滚表空间UNDOTBS,并作为数据库的撤销表空间。 7)删除表空间USERTBS2,同时删除该表空间的内容以及对应的操作系统文件。 8)为USERS表空间添加一个数据文件users03.DBF,大小为50MB。 9)为EXAMPLE表空间添加一个数据文件,文件名为example02.dbf,大小为20M。 10)将表空间USERS中的数据文件users03.DBF更名为userdata03.dbf,将表空间EXAMPLE中的数据文件example02.dbf更名为example03.dbf。 11)修改USER表空间的userdata03为自动扩展方式,每次扩展5MB,最大为100MB。 12)查询当前数据库中所有表空间及其对应的数据文件信息。 13)将数据库的控制文件以二进制文件的形式备份。 14)为数据库ORCL添加一个重做日志文件组,组内包含两个成员文件,分别为redo4a.log和redo4b.log,大小分别为5MB。 15)为新建的重做日志文件组添加一个成员完文件,名称为redo4c.log。 16)将数据库设置为归档模式,并采用自动归档方式。 17)设置数据库归档路径为D:\ORACLE\BACKUP。

Windows操作系统实验三实验报告

Windows操作系统C/C++ 程序实验 姓名:___________________ 学号:___________________ 班级:___________________ 院系:___________________ ______________年_____月_____日

实验三Windows 2000/xp线程同步 一、背景知识 二、实验目的 在本实验中,通过对事件和互斥体对象的了解,来加深对Windows 2000/xp线程同步的理解。 1) 回顾系统进程、线程的有关概念,加深对Windows 2000/xp线程的理解。 2) 了解事件和互斥体对象。 3) 通过分析实验程序,了解管理事件对象的API。 4) 了解在进程中如何使用事件对象。 5) 了解在进程中如何使用互斥体对象。 6) 了解父进程创建子进程的程序设计方法。 三、工具/准备工作 在开始本实验之前,请回顾教科书的相关内容。 您需要做以下准备: 1) 一台运行Windows 2000/xp Professional操作系统的计算机。 2) 计算机中需安装V isual C++ 6.0专业版或企业版。 四、实验内容与步骤 1. 事件对象 清单4-1程序展示了如何在进程间使用事件。父进程启动时,利用CreateEvent() API创建一个命名的、可共享的事件和子进程,然后等待子进程向事件发出信号并终止父进程。在创建时,子进程通过OpenEvent() API打开事件对象,调用SetEvent() API使其转化为已接受信号状态。两个进程在发出信号之后几乎立即终止。 步骤1:登录进入Windows 2000/xp Professional。 步骤2:在“开始”菜单中单击“程序”-“Microsoft V isual Studio 6.0”–“Microsoft V isual C++ 6.0”命令,进入V isual C++窗口。 步骤3:在工具栏单击“打开”按钮,在“打开”对话框中找到并打开实验源程序3-1.cpp。 步骤4:单击“Build”菜单中的“Compile 3-1.cpp”命令,并单击“是”按钮确认。系统

实验三 文件系统实验

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

(2)保护码 (3)文件长度 (4)文件名 AFD (1)打开文件名 (2)打开保护码 (3)读写指针 文件系统算法的流程图如下:

三.实验题: 1.增加2~3个文件操作命令,并加以实现。(如移动读写指针,改变文件属性, 更换文件名,改变文件保护级别)。 2.编一个通过屏幕选择命令的文件管理系统,每屏要为用户提供足够的选择信 息,不需要打入冗长的命令。 3.设计一个树型目录结构的文件系统,其根目录为root,各分支可以是目录, 也可以是文件,最后的叶子都是文件。 4.根据学校各级机构,编制一文件系统。

操作系统实验文件管理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);

操作系统文件管理_答案

第六部分文件管理 1、文件系统的主要目的就是( )。 A、实现对文件的按名存取 B、实现虚拟存储 C、提供外存的读写速度 D、用于存储系统文件 2、文件系统就是指( )。 A、文件的集合 B、文件的目录集合 C、实现文件管理的一组软件 D、文件、管理文件的软件及数据结构的总体 3、文件管理实际上就是管理( )。 A、主存空间 B、辅助存储空间 C、逻辑地址空间 D、物理地址空间 4、下列文件的物理结构中,不利于文件长度动态增长的文件物理结构就是( )。 A、顺序文件 B、链接文件 C、索引文件 D、系统文件 5、下列描述不就是文件系统功能的就是( )。 A、建立文件目录 B、提供一组文件操作 C、实现对磁盘的驱动调度 D、实现从逻辑文件到物理文件间的转换 6、文件系统在创建一个文件时,为它建立一个( )。 A、文件目录 B、目录文件 C、逻辑结构 D、逻辑空间 7、索引式(随机)文件组织的一个主要优点就是( )。 A、不需要链接指针 B、能实现物理块的动态分配 C、回收实现比较简单 D、用户存取方便 8、面向用户的文件组织机构属于( )。 A、虚拟结构 B、实际结构 C、逻辑结构 D、物理结构 9、按文件用途来分,编译程序就是( )。 A、用户文件 B、档案文件 C、系统文件 D、库文件 10、将信息加工形成具有保留价值的文件就是( )。 A、库文件 B、档案文件 C、系统文件 D、临时文件 11、文件目录的主要作用就是( )。 A、按名存取 B、提高速度 C、节省空间 D、提高外存利用率 12、如果文件系统中有两个文件重名,不应采用( )。 A、一级目录结构 B、树型目录结构 C、二级目录结构 D、A与C 13、文件系统采用树型目录结构后,对于不同用户的文件,其文件名( )。 A、应该相同 B、应该不同 C、可以不同,也可以相同 D、受系统约束 14、文件系统采用二级文件目录可以( )。 A、缩短访问存储器的时间 B、实现文件共享 C、节省内存空间 D、解决不同用户间的文件命名冲突

操作系统实验

操作系统实验报告

实验一进程控制与描述 一、实验目的 通过对Windows 2000编程,进一步熟悉操作系统的基本概念,较好地理解Windows 2000的结构。通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows 2000中进程的“一生”。 二、实验环境 硬件环境:计算机一台,局域网环境; 软件环境:Windows 2000 Professional、Visual C++ 6.0企业版。 三、实验内容和步骤 第一部分(共三个程序): Windows 2000 Professional下的GUI应用程序,使用Visual C++编译器创建一个GUI 应用程序,代码中包括了WinMain()方法,该方法GUI类型的应用程序的标准入口点。 程序1-1 # include # pragma comment(lib, “user32.lib” ) int APIENTRY WinMain(HINSTANCE /* hInstance */ , HINSTANCE /* hPrevInstance */, LPSTR /* lpCmdLine */, int /* nCmdShow */ ) { :: MessageBox( NULL, “Hello, Windows 2000” , “Greetings”, MB_OK) ; return(0) ; } 实验结果 然后改变参数,运行结果如下:

1-2显示了当前进程的优先级: 1-3进一步显示进程的具体情况: 第二部分:进程的“一生”(共三个程序) 1、创建进程 本程序展示的是一个简单的使用CreateProcess() API函数的例子。首先形成简单的命令行,提供当前的EXE文件的指定文件名和代表生成克隆进程的号码。大多数参数都可取缺省值,但是创建标志参数使用了:BOOL bCreateOK标志,指示新进程分配它自己的控制台,这使得运行示例程序时,在任务栏上产生许多活动标记。然后该克隆进程的创建方法关闭传

实验五 文件管理

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

2.逻辑设计 使用线性表表示UFD,每个元素包括用户ID、保存的文件数、再使用线性表表示文件信息,每个元素包括文件名,文件属性(保护码),文件的状态等信息。该结构需支持以下操作:在尾部插入,查找,修改,在任意位置删除。3、物理设计 char UserName[SizeOfUser][SizeOfUserName];//用户ID long User;//当前用户标志 struct InfoOfFile { char Name[SizeOfFileName];//文件名 bool safe[3];//Read,Write,Execute long status;//ready,open; }UFD[SizeOfUser][SizeOfFile];

操作系统实验报告

操作系统教程实验报告 专业班级 学号 姓名 指导教师

实验一WINDOWS进程初识 1、实验目的 (1)学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。 (2)掌握WINDOWS API的使用方法。 (3)编写测试程序,理解用户态运行和核心态运行。 2、实验内容和步骤 (1)编写基本的Win32 Consol Application 步骤1:登录进入Windows,启动VC++ 6.0。 步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location”处输入工程目录。创建一个新的控制台应用程序工程。 步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”, 然后在“File”处输入C/C++源程序的文件名。 步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。 步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows “命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序:E:\课程\os课\os实验\程序\os11\debug>hello.exe 运行结果 (如果运行不成功,则可能的原因是什么?) : (2)计算进程在核心态运行和用户态运行的时间 步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。 步骤2:在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。 步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。 E:\课程\os课\os实验\程序\os12\debug>time TEST.exe 步骤4:运行结果 (如果运行不成功,则可能的原因是什么?) : 步骤5:分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。 屏蔽i循环:

实验八,文件管理

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

五、心得体会: 通过这次试验我学会了如何创建一个用户,已经在此用户下保存多个文件,同时也学会了如何为文件设置保护措施,只允许单个用户访问。这些综合性的知识都在本实验中得到了很好的运用,因此我对文件的管理也得到了一定的锻炼。 六、附录: #include #include #include #include struct user {char name[10]; }user[10]; int in=0; struct link { struct file { char name[10];

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

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

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

操作系统实验三 进程的创建#(精选.)

操作系统 实验报告 哈尔滨工程大学 软件学院

第一讲实验环境的使用 一、实验概述 1. 实验名称 进程的创建 2. 实验目的 练习使用EOS API函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。 调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位。 3. 实验类型(验证、设计) 验证 4. 实验内容

二、实验环境 操作系统:windows xp 编译环境:OS Lab 语言:汇编语言、C语言 三、实验过程(每次实验不一定下面6条都写,根据实际情况定) 1.设计思路和流程图

main函数流程图 2. 需要解决的问题及解答 (1)在源代码文件NewTwoProc.c提供的源代码基础上进行修改,要求使用hello.exe同时创建10个进程。提示:可以使用PROCESS_INFORMATION类型定义一个有10个元素的数组,每一个元素对应一个进程。使用一个循环创建10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄。 答:后文中,有此题解决方案。 尝试根据之前对PsCreateProcess函数和PspCreateProcessEnvironment函数执行过程的跟踪调试,绘制一幅进程创建过程的流程图。

PspCreateThread创建 了进程的主线程 结束 (3)在PsCreateProcess函数中调用了PspCreateProcessEnvironment函数后又先后调用了PspLoadProcessImage和PspCreateThread函数,学习这些函数的主要功能。能够交换这些函数被调用的顺序吗?思考其中的原因。 答:PspCreateProcessEnvironment 的主要功能是创建进程控制块并且为进程创建了地址空间和分配了句柄表。PspLoadProcessImage是将进程的可执行映像加载到了进程的地址空间中。PspCreateThread创建了进程的主线程。这三个函数被调用的顺序是不能够改变的就向上面描述的加载可执行映像之前必须已经为进程创建了地址空间这样才能够确定可执行映像可以被加载到内存的什么位置在创建主线程之前必须已经加载了可执行映像这样主线程才能够知道自己要从哪里开始执行,执行哪些指令。因此不能交换他们的顺序。 3.主要数据结构、实现代码及其说明 主要定义一个有10个元素的数组,每一个元素对应一个进程。使用一个循环创建10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄 4.源程序并附上注释 #include "EOSApp.h" // // main 函数参数的意义: // argc - argv 数组的长度,大小至少为1,argc - 1 为命令行参数的数量。 // argv - 字符串指针数组,数组长度为命令行参数个数+ 1。其中argv[0] 固定指向当前 // 进程所执行的可执行文件的路径字符串,argv[1] 及其后面的指针指向各个命令行 // 参数。

实验3 文件管理

实验三文件管理 一、实验目的 理解文件系统的主要概念及文件系统内部功能和实现过程。 二、实验内容 采用二级文件目录结构,编写程序实现文件系统的文件存储空间的管理、文件的物理结构、目录结构管理和文件操作。具体如下: 1、设计一个有m个用户的文件系统,每个用户最少可保存一个文件。 2、规定用户在一次运行中只能打开K个文件。 3、系统能检查键入命令的正确性,出错时应能显示出错原因。 4、对文件应能设置保护措施,如只能执行、允许读、允许写等。 5、对文件的操作设计提供一套文件操作: CREATE建立文件; DELETE删除文件; OPEN打开文件; CLOSE关闭文件; READ读文件; WRITE写文件。 三、实验要求 ①详细描述实验设计细想、程序结构及各模块设计思路。 ②详细描述程序所用数据结构及算法 ③给出测试用例及实验结构 ④为增加程序可读性,在程序中进行适当注释说明 ⑤认真进行实验总结,包括:设计中遇到的问题、解决方法和收获 ⑥实验报告撰写要求结构清晰、描述准确逻辑性强 四、实验过程 举例:主文件目录 mfd=record username :string[maxlen]; files :array[1..K] of ufd; ofiles :arrau[1..S] of uod end; 用户打开文件目录表: uod=record filename:string[maxlen]; attrib:attrib;

status:(open,create); rp,up:integer; end; 用户文件目录: ufd=record fielname:string[maxlen]; attrib ro,rw); len:integer; addr:integer; end; 流程图: 二、主要数据结构 界面采用VC6 MFC环境开发

兰州大学操作系统实验七存储管理题目和答案

实验七实验报告 实验名称:7 存储管理 实验目的: 1.观察系统存储器使用情况 2.观察进程使用存储器的情况 3.掌握通过内存映像文件提高性能的方法 4.掌握动态内存分配技术 实验时间 3学时 预备知识: 1.存储相关的命令 free 显示系统使用和未被使用的内存数量(可以实时执行) 输出包含的标题有 3 行信息: Mem。此行包含了有关物理内存的信息。包括以下详细内容: total。该项显示可用的物理内存总量,单位为KB。该数字小于安装的物理内存的 容量,是因为内核本身也要使用一小部分的内存。 used。该项显示了用于应用程序超速缓存数据的内存容量。 free。该项显示了此时未使用且有效的内存容量。 Shared/buffers 缓冲区/cached。这些列显示了有关内存如何使用的更为详细的信息。 -/+ buffers/cache。Linux 系统中的部分内存用来为应用程序或设备高速缓存数据。这部分内存在需要用于其他目的时可以释放。 free列显示了调整的缓冲区行,显示释放缓冲区或高速缓存时可以使用的内存容量。 Swap。该行显示有关交换内存利用率的信息。该信息包含全部、已使用和释放的可用内存容量。 vmstat 报告进程、内存、分页、IO等多类信息(使用手册页) size 列出目标文件段大小和总大小(使用手册页)

2./proc文件系统(使用手册页man 5 proc) /proc/meminfo 内存状态信息 /proc/stat 包含内存页、内存对换等信息。 /proc/$pid/stat 某个进程的信息(包含内存使用信息) /proc/$pid/maps某个进程的内存映射区信息,包括地址范围、权限、偏移量以及主次设备号和映射文件的索引节点。 /proc/$pid/statm 某个进程的内存使用信息,包括内存总大小、驻留集大小、共享页面数、文本页面数、堆栈页面数和脏页面数。 3.内存映像文件 内存映像文件是指把一个磁盘文件映像到内存中,二者存在逐字节的对应关系。这样做可以加速I/O操作,并可以共享数据。 3.1 mmap(建立内存映射) 表头文件#include #include 定义函数void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize); 函数说明mmap()用来将某个文件内容映射到内存中,对该内存区域的存取即是直接对该文件内容的读写。参数start指向欲对应的内存起始地址,通常设为NULL,代表让系统自动选定地址,对应成功后该地址会返回。参数length代表将文件中多大的部分对应到内存。 参数prot代表映射区域的保护方式有下列组合 PROT_EXEC 映射区域可被执行 PROT_READ 映射区域可被读取 PROT_WRITE 映射区域可被写入 PROT_NONE 映射区域不能存取 参数flags会影响映射区域的各种特性 MAP_FIXED 如果参数start所指的地址无法成功建立映射时,则放弃映射,不 对地址做修正。通常不鼓励用此旗标。 MAP_SHARED对映射区域的写入数据会复制回文件内,而且允许其他映射该 文件的进程共享。 MAP_PRIV A TE 对映射区域的写入操作会产生一个映射文件的复制,即私人的

相关主题