14103232操作系统课程设计报告
操作系统课程设计实验报告

操作系统课程设计实验报告操作系统课程设计实验报告引言:操作系统是计算机科学中的重要课程,通过实验设计,可以帮助学生更好地理解操作系统的原理和实践。
本文将结合我们在操作系统课程设计实验中的经验,探讨实验设计的目的、实验过程和实验结果,以及对操作系统的理解和应用。
一、实验设计目的操作系统课程设计实验的目的是帮助学生深入理解操作系统的工作原理和实际应用。
通过设计和实现一个简单的操作系统,学生可以更好地掌握操作系统的各个组成部分,如进程管理、内存管理、文件系统等。
同时,实验设计还可以培养学生的动手能力和问题解决能力,提高他们对计算机系统的整体把握能力。
二、实验过程1. 实验准备在进行操作系统课程设计实验之前,我们需要对操作系统的基本概念和原理进行学习和理解。
同时,还需要掌握一些编程语言和工具,如C语言、汇编语言和调试工具等。
这些准备工作可以帮助我们更好地进行实验设计和实现。
2. 实验设计根据实验要求和目标,我们设计了一个简单的操作系统实验项目。
该项目包括进程管理、内存管理和文件系统三个主要模块。
在进程管理模块中,我们设计了进程创建、调度和终止等功能;在内存管理模块中,我们设计了内存分配和回收等功能;在文件系统模块中,我们设计了文件的创建、读写和删除等功能。
通过这些模块的设计和实现,我们可以全面了解操作系统的各个方面。
3. 实验实现在进行实验实现时,我们采用了分阶段的方法。
首先,我们实现了进程管理模块。
通过编写相应的代码和进行调试,我们成功地实现了进程的创建、调度和终止等功能。
接下来,我们实现了内存管理模块。
通过分配和回收内存空间,我们可以更好地管理系统的内存资源。
最后,我们实现了文件系统模块。
通过设计文件的读写和删除等功能,我们可以更好地管理系统中的文件资源。
三、实验结果通过实验设计和实现,我们获得了一些有意义的结果。
首先,我们成功地实现了一个简单的操作系统,具备了进程管理、内存管理和文件系统等基本功能。
操作系统课程设计报告

;一、概述课程设计目的、意义:课程设计目的使学生熟悉文件管理系统的设计方法;加深对所学各种文件操作的了解及其操作方法的特点。
通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
主要任务:模拟文件系统设计是设计和实现一个简单的文件系统。
内容包括: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;int f_num;struct content *next;}Content;typedef struct user{char name[10];char psw[10];…Content *con;struct user *next;}User;char cur_user[20];User *user;int user_num=0;void write(char name[]){ FILE *p;!char ch;p=fopen(name,"w");ch=getchar();while(1){fputc(ch,p);ch=getchar();if(ch=='#') break;}'fclose(p);}void read(char name[]){FILE *p;int i=0;p=fopen(name,"r");while(!feof(p)){i++;%printf("%c",fgetc(p));}if(i==0) printf("文件是空的!\n"); fclose(p);}int display_files(Content *con){ int i=0;File *file;》file=con->file;file=file->next;while(file!=NULL){i++;printf("文件 %d: %s\n",i,file->name);file=file->next;}printf(" 文件总数:%d\n",i);*return i;}int is_exist_file(File *f,char name[]){ int exist=0;File *file=f->next;while(file!=NULL){if(strcmp(file->name,name)==0){exist=1;{break;}file=file->next;}return exist;}void add_file(Content *con){int exist;@char f_name[10];char tail[]=".txt";FILE *q;File *file=con->file;File *new_f;if(con->f_num==10){printf("已存在10个文件!\n");return;$}do{exist=0;printf("输入新文件名:");scanf("%s",f_name);strcat(f_name,tail);if(is_exist_file(con->file,f_name)) exist=1;!if(exist==1)printf("文件已存在!\n");}while(exist==1);q=fopen(f_name,"w");fclose(q);while(file->next!=NULL)new_f=(File *)malloc(sizeof(File));》strcpy(new_f->name,f_name);new_f->next=NULL;file->next=new_f;con->f_num++;printf("添加文件 %s 成功!\n",f_name); }void read_file(Content *con){char name[10];|char tail[]=".txt";int find=0;File *file=con->file->next;printf("输入需要读取的文件名:");scanf("%s",name);strcat(name,tail);while(file!=NULL){if(strcmp(name,file->name)==0){…find=1;break;}}if(find==0){printf("读取错误或文件不存在!---Read File\n");return;$}printf("文件已打开...\n");read(name);printf("\n文件 %s 读取成功!\n",name);}void write_file(Content *con){char name[10];char tail[]=".txt";#int find=0;File *file=con->file->next;printf("输入需要编辑的文件名:");scanf("%s",name);strcat(name,tail);while(file!=NULL){if(strcmp(name,file->name)==0){find=1;(break;}file=file->next;}if(find==0){printf("写入错误或文件不存在!---Write File\n");return;}^printf("文件被打开...\n");printf("结尾输入#完成输入\n");write(name);printf("\n文件 %s 写入成功!\n",name);}void delete_file(Content *con){int exist;char name[10];^File *file,*f;char tail[]=".txt";if(display_files(con)==0) printf("无内容!\n");else{do{exist=1;printf("输入需要删除的文件名:");scanf("%s",name);¥strcat(name,tail);if(!is_exist_file(con->file,name))exist=0;if(exist==0) printf("文件不存在!\n");}while(exist==0);printf("文件正在删除...");file=con->file;`f=file->next;while(f!=NULL){if(strcmp(f->name,name)==0) break;file=f;f=f->next;}file->next=f->next;printf("文件删除成功!\n");【}}void move_file(User *u,Content *con){int exist;char name[10];char c_name[10];char tail[]=".txt";File *file,*f,*temp_f;}Content *c;do{exist=1;printf("输入需要移动文件名:");scanf("%s",name);strcat(name,tail);if(!is_exist_file(con->file,name)) exist=0;if(exist==0) printf("此文件不存在!\n");.}while(exist==0);printf("移动中...\n");file=con->file;f=file->next;while(f!=NULL){if(strcmp(f->name,name)==0) break;file=file->next;f=f->next;;}temp_f=f;file->next=f->next;printf("输入目标存储空间名: ");scanf("%s",c_name);c=u->con;while(c->next!=NULL){if(strcmp(c->name,c_name)==0) break; ~c=c->next;}f=c->file;while(f->next!=NULL) f=f->next;f->next=temp_f;temp_f->next=NULL;printf("移动成功!\n");}!int display_contents(User *u){int i=0;Content *con;con=u->con->next;while(con!=NULL){i++;printf("存储空间 %d: %s\n",i,con->name);con=con->next;…}printf("显示存储空间为%d\n",i);return i;}int is_exist_con(Content *c,char name[]){int exist=0;Content *con=c->next;while(con!=NULL){!if(strcmp(con->name,name)==0){exist=1;break;}con=con->next;}return exist;}…void add_content(User *u){char name[10];int exist=0;Content *con,*c;File *file;do{exist=0;printf("输入存储空间名称:");|scanf("%s",name);if(is_exist_con(u->con,name))exist=1;if(exist==1)printf("此存储空间已存在!\n"); }while(exist==1);printf("新建中...\n");con=u->con;@while(con->next!=NULL)con=con->next;c=(Content *)malloc(sizeof(Content)); c->next=NULL;file=(File *)malloc(sizeof(File));file->next=NULL;c->file=file;strcpy(c->name,name);—c->f_num=0;con->next=c;printf("\n新建成功!\n");}void del_content(User *u){int exist;char name[10];Content *con,*c;%if(display_contents(u)==0) printf("无内容!\n");else{do{exist=1;printf("输入删除存储空间名称:");scanf("%s",name);if(!is_exist_con(u->con,name)) exist=0;if(exist==0) printf("The Content Not Exist!\n");·}while(exist==0);printf("文件夹删除中...");con=u->con;c=con->next;while(c!=NULL){if(strcmp(c->name,name)==0) break;con=c;*c=c->next;}con->next=c->next;printf("删除成功!\n");}}void into_content(User *u){int choice;…int exist;char name[10];Content *con;do{exist=1;printf("输入存储空间名称:");scanf("%s",name);if(!is_exist_con(u->con,name)) exist=0;?if(exist==0) printf("存储空间不存在!\n"); }while(exist==0);con=u->con->next;while(con!=NULL){if(strcmp(con->name,name)==0) break;con=con->next;}do{<printf("1. 显示所有文件\n");printf("2. 新建文件\n");printf("3. 写入文件\n");printf("4. 读取文件\n");printf("5. 删除文件\n");printf("6. 移动文件\n");printf("0. 返回上层\n");printf("输入以上选项:");.scanf("%d",&choice);switch(choice){case 1:display_files(con);break;case 2:add_file(con);break;{case 3:write_file(con);break;case 4:read_file(con);break;case 5:delete_file(con);(break;case 6:move_file(u,con);break;}}while(choice!=0);}void login(){$int choice;int find=0;int login=0;User *p;Content *con;User *head=user->next;;p=(User *)malloc(sizeof(User));con=(Content *)malloc(sizeof(Content));·con->next=NULL;p->con=con;head=p;do{printf("1. 显示所有存储空间\n");printf("2. 新建存存储空间\n");printf("3. 删除存储空间\n");printf("4. 写入存储空间\n");!printf("0. 退出\n");printf("输入以上选项:");scanf("%d",&choice);switch(choice){case 1:display_contents(head);break;case 2:add_content(head);break;case 3:del_content(head);break;case 4:into_content(head);break; ?}}while(choice!=0);}int main(){user=(User *)malloc(sizeof(User));user->next=NULL;login();printf("谢谢使用!\n");return 0;}四、系统测试系统功能模块测试、性能测试结果:进入系统菜单:add_content(User *u)新建存储空间:display_contents(User *u)显示所有存储空间状态:del_content(User *u)删除存储空间:into_content(User *u)写入存储空间:进入文件系统菜单:write(char name[])写入文件:read(char name[])读取文件:display_files(Content *con)显示所有文件状态:add_file(Content *con)新建文件:delete_file(Content *con)删除文件:move_file(User *u,Content *con)移动文件:五、结论课程设计的主要成果、体会:课程设计是对我们平时学习的一种考察,我们要正确地对待。
操作系统课程设计报告

目录一、课程设计目的 (2)二、课程设计要求 (2)三、创新思维 (3)四、系统环境支持及语言选择 (4)五、系统框架构成 (4)(一)整体框架: (4)(二)流程图 (5)1.先来先服务算法流程图 (5)2.优先级算法 (5)六、系统功能说明 (6)(一)先来先服务算法的实现: (6)(二)静态优先级算法的实现: (6)(三)动态优先级算法的实现: (6)(四)创建进程的实现: (6)(五)阻塞进程的实现: (7)(六)唤醒进程的实现: (7)(七)撤销进程的实现: (7)(八)进程控制的实现: (7)七、用户使用说明 (8)八、体会与自我评价 (8)一、课程设计目的在学习操作系统课程的基础上,在对操作系统各部分充分理解的基础上,对操作系统的整体进行一个模拟。
本实验进行的进程调度系统的算法采用的是动态和静态优先数优先的调度算法(即把处理机分配给优先数最低的进程)先来先服务算法。
通过实践加深对各个部分的管理功能的认识,还能进一步分析各个部分之间的联系,最后达到对完整系统的理解。
同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力、创新能力、开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。
二、课程设计要求1.进程管理功能以进程调度为主要功能。
以进程控制为辅助功能。
2.体现操作系统原理中进程调度算法和进程控制算法。
按照操作系统原理设计。
3.结构化设计。
设计时构建出模块结构图并存于文件中。
模块化实现,对每一功能,每一操作使用模块、函数、子程序设计方法实现。
4.进程以PCB为代表。
队列、指针用图示。
每一步功能在桌面上能显示出来。
5.系统应具有排错功能,对可能出现的错误应具有排查功能和纠错能力。
6.界面自行设计,语言自行选择。
(可用C#语言,也可用你会的其他语言,甚至还可用PPT)7.每人的设计功能都能表现或说明出来。
8.进程以队列法组织,对不同进程调度算法:FIFO队列或PRI队列或rotate(轮转队列)用同一个进程序列组织,对阻塞队列可设置一个,也可设多个。
操作系统课程设计报告

一、课程设计任务划分二、根本原理〔一〕页面置换算法定义在地址映射过程中,假设在页面中发现所要访问的页面不再内存中,那么产生缺页中断。
当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。
而用来选择淘汰哪一页的规那么叫做页面置换算法。
〔二〕所使用的算法1) 最正确置换算法(OPT):将以后永不使用的或许是在最长(未来)时间内不再被访问的页面换出。
2) 先进先出算法(FIFO):淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
3) 最近最久未使用算法(LRU):淘汰最近最久未被使用的页面。
〔三〕设计思想选择置换算法,先输入所有页面号,为系统分配物理块,依次进行置换:OPT根本思想:是用一维数组page[pIZE]存储页面号序列,memery[mIZE]是存储装入物理块中的页面。
数组ne某t[mIZE]记录物理块中对应页面的最后访问时间。
每当发生缺页时,就从物理块中找出最后访问时间最大的页面,调出该页,换入所缺的页面。
FIFO根本思想:是用一维数组page[pIZE]存储页面号序列,memery[mIZE]是存储装入物理块中的页面。
数组flag[10]标记页面的访问时间。
每当使用页面时,刷新访问时间。
发生缺页时,就从物理块中页面标记最小的一页,调出该页,换入所缺的页面。
三、根本思路实验环境:vc++,编程语言:c语言 #include #include /某全局变量某/int mIZE; /某物理块数某/int pIZE; /某页面号引用串个数某/tatic int memery[10]={0}; /某物理块中的页号某/ tatic int page[100]={0}; /某页面号引用串某/ tatic int temp[100][10]={0}; /某辅助数组某/ /某置换算法函数某/ void FIFO(); void LRU(); void OPT(); /某辅助函数某/void print(unigned int t); void deignBy(); void download();void mDelay(unigned int Delay); /某主函数某/ void main() {canf("%1d",&page[i]); download(); ytem("cl"); ytem("color 0E"); do{ put("输入的页面号引用串为:"); for(k=0;k<=(pIZE-1)/20;k++){ for(i=20某k;(i<pize)&&(i<20某(k+1));i++) 20="=0)||(((i+1))&&</p">(i==pIZE-1))) printf("%d ",page[i]); ele printf("%d ",page[i]); } } printf("某某某某某某某某某某某某某某某某某某某某某某某 "); printf("某请选择页面置换算法:某 "); printf("某 ----------------------------------------- 某 ");printf("某 1.先进先出(FIFO) 2.最近最久未使用(LRU) 某 "); printf("某 3.最正确(OPT) 4.退出某 "); printf("某某某某某某某某某某某某某某某某某某某某某某某 "); printf("请选择操作:[ ]"); canf("%d",&code); witch(code) { cae 1:FIFO(); break; cae 2:LRU(); break; cae 3:OPT(); break; cae 4: ytem("cl"); ytem("color 0A"); deignBy(); /某显示设计者信息后退出某/ printf("┃谢谢使用页面置换算法演示器!ytem("cl"); }while (code!=4); getch(); }/某载入数据某/ void download() { int i; ytem("color 0D");printf("╔════════════╗ "); printf("║正在载入数据,请稍候 !!!║ "); printf("╚════════════╝ "); printf("Loading... "); printf("for(i=0;i<51;i++) printf(""); for(i=0;i<50;i++) { mDelay((pIZE+mIZE)/2);printf(">"); } printf(" Finih. 载入成功,按任意键进入置换算法选择界面:/某设置延迟某/void mDelay(unigned int Delay) {unigned int i;for(;Delay>0;Delay--) { for(i=0;i<124;i++) { printf(" "); } } }/某显示设计者信息某/ void deignBy(){ printf("┏━━━━━━━━━━━━━━━━━━━━┓ "); printf("┃页面置换算法┃ "); printf("┃ 12级1班┃ ");O");printf("┃姓名:张海洋,李奔┃ ");printf("┣━━━━━━━━━━━━━━━━━━━━┫ "); }void print(unigned int t) { int i,j,k,l; int flag; for(k=0;k<=(pIZE-1)/20;k++) { for(i=20某k;(i<pize)&&(i<20某(k+1));i++) 20="=0)||(((i+1))&&(i==pIZE-1)))" ele="" d="" j="0;j<mIZE;j++)" i="">=j) printf(" |%d|",temp[i][j]); ele printf(" | |"); } for(i=mIZE+20某k;(i<pize)&&(i<20某(k+1));i++) {=""for(flag="0,l=0;l<mIZE;l++)" if(temp[i][l]="=temp[i-1][l])" flag++;=""if(flag="=mIZE)/某页面在物理块中某/" printf("="" ");="" ele=""|%d|",temp[i][j]);="" }="" 某每行显示20个某="" if(i="=0)" continue;="" printf(" ");="" printf("---------------------------------------- ");="" printf("缺页次数:%d",t+mize);="" printf("缺页率:%d="" %d ",t+mize,pize);<="" p="">printf("置换次数:%d ",t); printf("访问命中率:%d%% ",(pIZE-(t+mIZE))某100/pIZE); printf("---------------------------------------- "); }/某先进先出页面置换算法某/ void FIFO() {int memery[10]={0};int ma某=0; /某记录换出页某/ int count=0; /某记录置换次数某/ /某前mIZE 个数直接放入某/ for(i=0;i<mize;i++) {<="" p="">for(j=0;j<mize;j++) temp[i][j]="memery[j];" }<="" p="">for(i=mIZE;i<pize;i++) {="" 某判断新页面号是否在物理块中某=""for(j="0,k=0;j<mIZE;j++)" {<="" p="">if(memery[j]!=page[i]) k++;}if(k==mIZE) /某如果不在物理块中某/ {count++; /某计算换出页某//某最近最久未使用置换算法某/ void LRU() {int memery[10]={0};int flag[10]={0}; /某记录页面的访问时间某/ int i,j,k,m;int ma某=0; /某记录换出页某/ int count=0; /某记录置换次数某/ /某前mIZE 个数直接放入某/ for(i=0;i<mize;i++) {<="" p="">memery[i]=page[i]; flag[i]=i;for(j=0;j<mize;j++) temp[i][j]="memery[j];" }<="" p="">for(i=mIZE;i<pize;i++) {="" 某判断新页面号是否在物理块中某=""for(j="0,k=0;j<mIZE;j++)" {<="" p="">if(memery[j]!=page[i]) k++; ele flag[j]=i; /某刷新该页的访问时间某/ }if(k==mIZE) /某如果不在物理块中某/ {count++; /某计算换出页某/ma某=flag[0]<flag[1] 0:1; for(m="2;m<mIZE;m++)" if(flag[m]flag[ma某]=i; /某记录该页的访问时间某/ for(j=0;j<mize;j++)temp[i][j]="memery[j];" }="" ele="" {<="" p="">/某最正确置换算法某/ void OPT() {int memery[10]={0};int ne某t[10]={0}; /某记录下一次访问时间某/ int i,j,k,l,m;int ma某; /某记录换出页某/int count=0; /某记录置换次数某/ /某前mIZE个数直接放入某/for(i=0;i<mize;i++) {<="" p="">memery[i]=page[i]; for(j=0;j<mize;j++) temp[i][j]="memery[j];" }<="" p=""> for(i=mIZE;i<pize;i++) {<="" p="">/某判断新页面号是否在物理块中某/ for(j=0,k=0;j<mize;j++) {<="" p="">if(memery[j]!=page[i]) k++; }if(k==mIZE) /某如果不在物理块中某/ { count++; /某得到物理快中各页下一次访问时间某/ for(m=0;m=ne某t[1] 0:1; for(m=2;mne某t[ma某]) ma某=m; /某下一次访问时间都为pIZE,那么置换物理块中第一个某/ memery[ma某]=page[i]; for(j=0;j<mize;j++) temp[i][j]="memery[j];" }="" ele="" {<="" p="">四、调试及实验结果第一组数据:1.运行结果2. 按任意键进行初始化:3. 载入数据:4. 进入置换算法选择界面:5.运算中延迟操作:6.三种算法演示结果7.退出算法第二组数据:1.运行结果2.按任意键进行初始化:3.载入数据:4.进入置换算法选择界面:5.运算中延迟操作:6. 三种算法演示结果7.退出算法五、个人体会由于时间有限,本次设计完成的并不是很完美,下面从以下几点来说明本次课程设计的个人体会:1.本次课程设计中做的比拟好的地方:做的.好的地方就是在于对题目意思的正确理解,以及在此根底上的模型设计。
操作系统课程设计实验报告

输出结果按字典排序
输出 当前 目录 ,及 下级 目录
从一个终端登
录,打开一个文
输出
件,保持文件的
指定
打开状态,然后
目录
从另外的终端
登录,去掉文件
的读权限
Ls 命令结束
内核模块:打印 super_block 结构中的一些域的值。
开始
加锁
遍历节点
尾节点
否 是
打印文件系统 所在设备的主 设备号和次设 备号
#define S_IFMT 0170000 记录文件的类型#define S_IFREG0100000 regular #define S_IFDIR 0040000directory #define S_IBLK 0060000 特殊块 #define S_IFCHR 0020000 字符块 #define S_IFIFO 0010000 fifo #define S_IFLNK 0120000 文件连接数 #define S_IFSOCK 0140000 通道 if(S_ISDIR(mode)) str[0] = 'd';是设备 if(S_ISCHR(mode)) str[0] = 'c'; 字符设备 if(S_ISDIR(mode)) str[0] = 'b';块设备 if(S_IRUSR & mode) str[1] = 'r';可读 if(S_IWUSR & mode) str[2] = 'w';可写 if(S_IXUSR & mode) str[3] = 'x';可执行 if(S_IRGRP & mode) str[4] = 'r';可读 if(S_IWGRP & mode) str[5] = 'w';可写 if(S_IXGRP & mode) str[6] = 'x'; 可执行 if(S_IROTH & mode) str[7] = 'r';可读 if(S_IWOTH & mode) str[8] = 'w';可写 if(S_IXOTH & mode) str[9] = 'x';可执行。Struct passwd 结构体 中 pw_name 用户名,pw_passwd 用户密码,pw_uid 用户 id,pw_gid 组 id, pw_gecos 真是名称 pw_dir 用户目录 pw_shell shell 命令。
操作系统课程设计报告

操作系统课程设计报告1. 引言操作系统是计算机系统中最核心的软件之一,它负责管理和优化计算机资源的分配和调度,为用户和应用程序提供一个可靠、高效的执行环境。
在操作系统课程设计中,我们通过设计一个简单的操作系统,深入理解操作系统的原理和功能,提升对操作系统的理解和实践能力。
本报告将详细介绍我们小组在操作系统课程设计过程中所完成的工作和实现的目标。
2. 设计目标在本次操作系统课程设计中,我们的设计目标包括:•实现一个基本的中断处理、进程调度和内存管理机制;•设计一个简单的文件系统;•确保操作系统的稳定性和可靠性;•实现用户命令解析和执行功能。
3. 系统架构我们的操作系统设计采用了经典的分层结构,主要由硬件抽象层、内核和用户接口层组成。
1.硬件抽象层:负责与硬件进行交互,提供基本的底层硬件接口,如处理器管理、中断处理、设备控制等。
2.内核:实现操作系统的核心功能,包括进程管理、内存管理、文件系统管理等。
这一层是操作系统的核心,负责管理和调度系统资源。
3.用户接口层:为用户提供简单友好的界面,解析用户输入的命令并调用内核功能进行处理。
用户可以通过命令行或图形界面与操作系统进行交互。
4. 功能实现4.1 中断处理中断是操作系统与外部设备通信的重要机制,我们的操作系统设计中实现了基本的中断处理功能。
通过在硬件抽象层中捕获和处理硬件的中断信号,内核可以对中断进行相应的处理,保证系统的响应能力和稳定性。
4.2 进程调度进程调度是操作系统中的重要任务之一,它决定了系统如何分配和调度上下文切换。
我们的操作系统设计中实现了一个简单的进程调度算法,通过时间片轮转算法和优先级调度算法来管理多个进程的执行顺序,以提高系统的吞吐量和响应性能。
4.3 内存管理内存管理是操作系统中必不可少的功能,它负责对系统内存的分配和回收。
我们的操作系统设计中实现了基本的内存管理功能,包括内存分区、内存空闲管理和地址映射等。
通过合理的内存管理,可以提高系统的内存利用率和性能。
操作系统课程设计报告

实践课设计报告课程名称操作系统课程设计模拟设计内存管理中的地址题目转换(动态分区、页式十进制)学院班级学号姓名指导教师年月日课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目: 模拟设计内存管理中的地址转换(动态分区、页式十进制)初始条件:1.预备内容:阅读操作系统的内存管理章节内容,理解动态分区、页式、段式和段页式存储管理的思想及相应的分配主存的过程。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.下列内部存储器管理中地址转换,在完成指定存储管理技术中的地址转换基础上还可以选择其它内部存储器管理中的地址转换进行模拟设计并实现:⑴动态分区方案,用最先适用算法对作业实施内存分配,然后把作业地址空间的某一逻辑地址转换成相应的物理地址。
能够处理以下的情形:输入某一逻辑地址,程序能判断地址的合法性,如果合法,计算并输出相应的物理地址。
如果不能计算出相应的物理地址,说明原因。
⑵页式存储管理中逻辑地址到物理地址的转换(十进制)。
能够处理以下的情形:输入某一十进制逻辑地址,能检查地址的合法性,如果合法进行转换,否则显示“地址非法”;物理地址用十进制表示。
⑶页式存储管理中逻辑地址到物理地址的转换(八进制)。
能够处理以下的情形:输入某一八进制逻辑地址,能检查地址的合法性,如果合法进行转换,否则显示“地址非法”;物理地址用八进制表示。
⑷页式存储管理中逻辑地址到物理地址的转换(十六进制)。
能够处理以下的情形:输入某一十六进制逻辑地址,能检查地址的合法性,如果合法进行转换,否则显示“地址非法”;物理地址用十六进制表示。
⑸段式存储管理中逻辑地址到物理地址的转换。
能够处理以下的情形:指定内存的大小,进程的个数,每个进程的段数及段大小;能检查地址的合法性,如果合法进行转换,否则显示地址非法的原因。
⑹段页式存储管理中逻辑地址到物理地址的转换。
操作系统课程设计报告

《操作系统课程设计》一、课程设计目的1、进程调度是处理机管理的核心内容。
2、本设计要求用C语言编写和调试一个简单的进程调度程序。
3、通过设计本可以加深理解有关进程控制块、进程队列的概念,并体会和了解最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法的具体实施办法。
二、课程设计主要内容1、项目名称设计一个有 N个进程共行的进程调度程序2、实验设备及环境:软件要求:WINDOWS NT 系列操作系统,VC、VB、TURBO C等多种程序设计开发工具。
硬件要求:P4 2.0以上CPU、256M、40G硬盘。
3、课程设计类型综合设计型4、课程设计内容与要求1)进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。
2)每个进程有一个进程控制块( PCB)表示。
进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
3)进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算。
4)每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
5)就绪进程获得 CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
如果运行一个时间片后,进程的已占用 CPU 时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
6)每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。
7)重复以上过程,直到所要进程都完成为止。
5、课程设计方法及步骤1)充分了解各项设计要求。
深入理解有关进程控制块、进程队列的概念,并体会和了解最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法的具体实施办法。
(完整word版)操作系统课程设计(小型的操作系统)

操作系统课程设计报告题目:一个小型的操作系统班级:计122(杏)学号:1213023075姓名:贾苏日期:2014/06/231.实验平台(1)软件平台:开发系统平台:Windows 7 (64)Microsoft visual c++ 6.0测试系统平台:Windows 7 (64)(2)硬件平台:cpu:AMD A6-3420 APU内存:4GB硬盘:500G2.所需实现的功能及相应的阐述:(1)进程调度管理为了贴切现实中的os,采用RR(轮转调度算法),且不提供用户显式的选择调度算法,即对用户是透明的。
现实中的处理器主频为1Ghz~3Ghz,选取中间点为1.5Ghz,得时间片大小为0。
7ns ,为方便计算*10,则时间片大小定为7ns.假设进程之间的调度和切换不耗费cpu时间。
(2)死锁的检测与处理检测当然采用的是银行家算法处理:让用户选择kill一个进程,释放他所占有的所有资源。
(3)虚拟分页调度管理虚拟分页:给出的是逻辑值访问磁盘将那个数据块放入到内存中内存中的地址采用一定的算法相对应于磁盘的地址。
特规定访存采用的是按字节寻址内存的大小128KB外存的大小1MB即整个系统可以提供1MB的逻辑地址空间供进程进行访问(在地址总线足够扫描内存的情况下)。
虚拟地址映射采用:直接映射法规定的8kB为一个页面,故内存有16个页面,外存有128个页面。
如果产生了内存已满,便会产生缺页中断,淘汰采用FIFO算法,利用一个队列来做.(4)I/O中断处理设中断来自两个方面:1.DMA输送开始和结束时的中断设定一个宏定义为DMA一次传输的数据量的大小->DmaNum假定为10kb每次DMA开始:耗费1ns cpu时间进行中断处理DMA结束:耗费2ns cpu时间进行中断处理由操作系统课程知,DMA传输数据时不需要CPU的干预。
2.随机的中断发生外部随机中断,cpu无条件的立即响应,并执行中断处理程序,同样的假设中断处理程序的调度和切换不耗费cpu时间。
操作系统课程设计报告

操作系统课程设计报告目录一、目的和要求 21、设计目的 22、设计要求 2二、设计思路及过程 21、概要设计 22、过程设计 3三、数据定义 5四、核心代码 5五、运行截图 8六、小结 10七、参考文献 11附录 12一、目的和要求1、设计目的通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
2、设计要求根据模拟的页式管理设计,掌握在页式存储管理中最基本的三种页面调度算法FIFO、LRU以及OPT。
但在三种算法中均要求在调度程序中产生的页面序列是随机产生的,而不是人为的输入,在执行时只需改变页面的大小及内存容量就可以得到不同的页面序列,另外还需要说明随机的性能和其性能可能对算法的影响,并对随机性要有一定的参数控制能力。
此外,计算并输出FIFO、LRU以及OPT算法在不同内存容量下的命中率。
根据方法的执行过程,编写一个解决上述问题的程序,显示访问每个值页面中的值。
具体参数:访问串的长度,访问串,页面个数。
分别用3种不同的方法实现页面的置换,并输出相关信息。
二、设计思路及过程1、概要设计1.1 问题概述根据三种不同的置换算法,依据其不同的算法方式,分别计算该算法在不同情况下的命中率,并显示各页面的变化情况。
1.2 内容分析对于该课程设计中模拟的页式存储管理的页面置换过程,只要掌握其中最基本的三种算法,包括FIFO、LRU及OPT。
但最重要的一点就是要求产生随机序列,所以在编写程序时要采用控制产生随机值的种子数函数,如此能产生随机的访问序列。
另外,不能在执行完一次操作后就只能进行另外一种算法的操作,必须还要有更加详细的操作,比如:是否要重新得到新序列?还是要不改变访问序列而只改变访问串的内存容量?抑或是不操作就退出该算法以进行下一种调度算法?因此,在执行完每次操作后都必须要有提示语,看是否进入更细节的操作,还是退出本次算法的操作以进入下一种算法的调度。
操作系统课程设计报告

操作系统课程设计实验报告姓名:学号:班级专业:软件工程操作系统课程设计---建立基于磁盘存储设备的FAT文件系统一、课程设计要求、目的在现代计算机系统中,用到大量的程序和数据,由于内存容量有限,且不能长期保存,故而平时总是把他们以文件的形式存放在外村中,需要时可随时将他们调入到内存。
如果用户直接管理外存上的文件,不仅要求用户熟悉外存的特性,了解各种文件的属性,以及他们在外存上的位置,而且在多用户的环境下,还必须能保持数据的安全性和一致性。
显然,这是用户多不能胜任、也不愿意承担的工作。
取而代之的是操作系统中又增加了文件管理功能,即构成一个文件系统,负责管理在外存上的文件,并把对文件的存取、共享和保护等手段提供给用户。
这不仅方便了用户,保证了文件的安全性,还可以有效的提高系统资源的利用率。
课程设计不仅要求我们紧扣课本知识,熟练的掌握课FAT文件系统实现原理上,而且要求最终的软件实现有很好的人机交互界面,从多方面考查我们的学习、实践能力。
让我们在实践中去认识FAT文件系统的实现原理,加深对文件系统存储、数据的安全性和一致性理解,在实践中去完善自己的理论知识,纠正理论学习过程中出现的错误。
二、课程设计的任务1、首先分配一定容量的磁盘存储空间,作为文件存储空间。
2、建立相应的文件系统,使用FAT文件系统。
3、为该文件系统设计相应的数据结构来管理目录、磁盘空闲空间、已分配空间等。
4、提供文件的创建、删除、移位、改名等功能。
5、提供良好的界面,可以显示磁盘文件系统的状态和空间的使用情况。
6、提供虚拟磁盘转储功能,可将信息存入磁盘,还可从磁盘读入内存。
三、相关原理及算法描述3.1文件系统设计原理本次设计的基于磁盘存储设备的FAT文件系统利用的是二级目录管理方式,分别由用户文件目录UFD( User File Directory )、主文件目录MFD( Master File Diretory )构成。
其中UFD由用户的所有文件块组成,在MFD中每个用户目录文件占用一个目录项,其中目录项中包括用户名和指向用户目录文件的指针,其基本构成如图所示:用户文件目录项的基本信息包括基本信息、地址信息、访问控制信息、使用信息。
操作系统课程设计报告

操作系统课程设计报告专业:计算机科学与技术学号:姓名:提交日期:(1)本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。
(2)结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。
(3)通过分对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力【设计内容】为Linux系统设计一个简单的二级文件系统。
要求做到以下几点:1.可以实现下列几条命令:login 用户登录dir 列目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件cd 进出目录2.列目录时要列出文件名,物理地址,保护码和文件长度3.源文件可以进行读写保护【实验环境】Windows xp/7C++/VC++【相关知识综述】1、文件系统文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。
操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。
文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。
从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。
具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。
2、位示图位示图是利用二进制的一位来表示磁盘中的一个盘块的使用情况。
当其值为“0”时,表示对应的盘块空闲;为“1”时,表示已经分配。
有的系统把"0"作为盘块已分配的标记,把“1”作为空闲标志。
(它们的本质上是相同的,都是用一位的两种状态标志空闲和已分配两种情况。
)磁盘上的所有盘块都有一个二进制位与之对应,这样,由所有盘块所对应的位构成一个集合,称为位示图。
操作系统课程设计总结报告

《操作系统课程设计》
总结报告
学期2012-2013学年第二学期
学院软件学院
学号20113311
姓名杜常数
2013 年6月28日
图3.2 SDT类图
图3.4 CHCT类图
图3.5 添加设备流程图
(2).删除设备:
①输入要删除的设备名称name;②根据名称在SDT表中查找与
同的设备,若没有查找到,则提示出错返回;③否则检查设备是否正忙,
图4.4 FileManage类图算法设计及流程图
(1)md命令的实现:
图4.5 md命令流程图
(2)cd命令的实现:
对于cd命令只需从命令行中提取出要打开的目录名,对链表中的所点遍历查找type为1的与name相同的结点,若
pdnow->pfnow=p->child若找不到显示系统找不到路径即可。
实现的代码如下所示:
void FileManage::cd(string name)
{
File *p=pdnow->pfnow;
if(name=="\\"){
pdnow->pfnow=pdnow->root;
return ;
图5.8 HRN抢占流程图
时间片轮转调度算法,将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时把CPU分配给队首进程,令其执行一个时间片,当时间片用完时把它送到就绪队列的末尾,然后再给就绪队列的队首进程执行。
直到所有进程执行完毕退出即可。
多级反馈队列调度算法,算法的执行如下所述:。
操作系统课程设计报告指导

- - -.. 操作系统课程设计指导一、本课程的教学目的及根本要求1、教学目的操作系统课程设计是操作系统课程的重要实践环节,是操作系统课程内实验的有益补充,它旨在培养学生的实践能力,促进理论与实践的结合。
要求学生通过上机编程,了解如何模拟操作系统原理的实现,从而加深对操作系统原理的领会,加深对操作系统实现方法的理解,与此同时使学生在程序设计方面也能够得到很大程度的提高。
操作系统虽然是理论性很强的课程,但是仅仅是课堂讲授是绝对不够的,操作系统课程设计即是课堂教学根底上的实践环节,其重要程度决不亚于课堂的知识传授。
本课程设计的目的和任务是在课堂教学的根底上,使学生对操作系统运行机制有一个全面的认识和理解,锻炼学生的抽象思维、逻辑思维和实际动手能力,培养操作系统等大型系统程序的使用者、管理者、分析员和设计人才。
促进理论与实践的结合,使学生在系统程序设计方面能够得到很大程度的提高。
先修课程:数据构造,操作系统。
2、教学根本要求要求学生通过上机编程,使学生对操作系统运行机制有一个全面的认识和理解,通过模拟文件系统及内存管理系统,锻炼学生的逻辑思维和实际动手能力,培养操作系统等大型系统程序的使用者、管理者、分析员和设计人才。
促进理论与实践的结合,使学生在系统程序设计方面能够得到很大程度的提高。
课程设计根本要求:1)掌握课堂教学内容,主要包括:(1)掌握操作系统四大资源管理的理论知识;(2)熟悉Linu*或UNI*文件系统的构造;(3)使用编程语言实现课程设计题目要求的功能。
2) 根据课程设计题目,按以下步骤进展:(1)问题分析,理解问题,明确设计要求;(2)根据要求进展概要设计和详细设计;(3)编码实现、上机调试,数据测试;(4)完成课程设计实习报告。
二、操作系统课程设计题目1、实现一个进程管理子系统【问题描述】在Linu*/UNI*/Windows下编制一个程序,模拟实现一个简单的进程管理子系统,它由进程建立模块、进程撤消模块、进程控制表组成,〔此外还可能包括选作的进程切换和调度模块〕。
操作系统课程设计报告

操作系统课程设计报告一、操作系统课程设计任务书读者-写者问题实现1设计目的通过实现经典的读者写者问题,巩固对线程及其同步机制的学习效果,加深对相关基本概念的理解,并学习如何将基本原理和实际设计有机的结合。
2 设计要求在Windows 2000/XP环境下,使用多线程和信号量机制实现经典的读者写者问题,每个线程代表一个读者或一个写者。
每个线程按相应测试数据文件的要求,进行读写操作。
请用信号量机制分别实现读者优先和写者优先的读者-写者问题。
读者-写者问题的读写操作限制:(1)写-写互斥,即不能有两个写者同时进行写操作(2)读-写互斥,即不能同时有一个读者在读,同时却有一个写者在写(3)读-读允许,即可以有二个以上的读者同时读读者优先的附加限制:如果一个读者申请进行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作。
写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。
运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确信所有处理都遵守相应的读写操作限制。
3 测试数据文件格式测试数据文件包括n 行测试数据,分别描述创建的n 个线程是读者还是写者,以及读写操作的开始时间和持续时间。
每行测试数据包括四个字段,各字段间用空格分隔。
第一字段为一个正整数,表示线程序号。
第二字段表示相应线程角色,R 表示读者是,W 表示写者。
第三字段为一个正数,表示读写操作的开始时间。
线程创建后,延时相应时间(单位为秒)后发出对共享资源的读写申请。
第四字段为一个正数,表示读写操作的持续时间。
当线程读写申请成功后,开始对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。
下面是一个测试数据文件的例子:1 r 3 52 w 4 53 r 5 24 r 6 55 w 5.1 34 相关API函数CreateThread()在调用进程的地址空间上创建一个线程ExitThread()用于结束当前线程Sleep()可在指定的时间内挂起当前线程CreateMutex()创建一个互斥对象,返回对象句柄OpenMutex()打开并返回一个已存在的互斥对象句柄,用于后续访问ReleaseMutex()释放对互斥对象的占用,使之成为可用WaitForSingleObject()可在指定的时间内等待指定对象为可用状态InitializeCriticalSection()初始化临界区对象EnterCriticalSection()等待指定临界区对象的所有权LeaveCriticalSection()释放指定临界区对象的所有权文件系统的设计通过对文件系统的设计,加深理解文件系统的内部功能及内部实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统课程设计报告专业:软件工程学号:14103232姓名:窦新月提交日期:2017.1.10【设计目的】(1)本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。
(2)结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。
(3)通过分对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力……………………………………..【设计内容】一、任务为Linux系统设计一个简单的二级文件系统。
要求做到以下几点:1.可以实现下列几条命令:login 用户登录dir 列目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件cd 进出目录2.列目录时要列出文件名,物理地址,保护码和文件长度3.源文件可以进行读写保护二、程序设计1.设计思想本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。
另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。
首先应确定文件系统的数据结构:主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
用户创建的文件,可以编号存储于磁盘上。
如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。
………………………………….【实验环境】C++/VC++【相关知识综述】对采用二级文件目录的文件系统工作的机理了如指掌,对文件系统的相关操作要掌握。
理解二级目录的文件系统的组织;掌握常用的数据结构;系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件;使用文件来模拟外存,进行数据结构设计和操作算法的设计,实现一个文件系统并实现基本的文件操作(为了简便文件系统,不考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容)。
【设计思路】采用的数据结构、主要的函数说明、程序流程设计等本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。
另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。
首先应确定文件系统的数据结构:主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
用户创建的文件,可以编号存储于磁盘上。
如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记1.主要的数据结构#define MAXNAME 25 /*the largest length of mfdname,ufdname,filename表示三种文件的长度都为25*/#define MAXCHILD 50 /*the largest child每个用户下可以有50个文件*/#define MAX (MAXCHILD*MAXCHILD) /*the size of fpaddrno定义一个常量2500个扇区*/typedef struct /*the structure of OSFILE*/{int fpaddr; /*file physical address物理地址*/int flength; /*file length文件长度*/int fmode; /*file mode:0-Read Only;1-Write Only;2-Read and Write; 3-Protect;*/ char fname[MAXNAME]; /*file name文件名*/} OSFILE;typedef struct /*the structure of OSUFD*/{char ufdname[MAXNAME]; /*ufd name*/OSFILE ufdfile[MAXCHILD]; /*ufd own file*/}OSUFD;/*osf文件的数据结构*/typedef struct /*the structure of OSUFD'LOGIN*/{char ufdname[MAXNAME]; /*ufd name*/char ufdpword[8]; /*ufd password*/} OSUFD_LOGIN;typedef struct /*file open mode*/{int ifopen; /*ifopen:0-close,1-open*/int openmode; /*0-read only,1-write only,2-read and write,3-initial*/}OSUFD_OPENMODE;2.主要函数void LoginF(); /*LOGIN FileSystem*/void DirF(); /*Dir FileSystem*/void CdF(); /*Change Dir*/void CreateF(); /*Create File*/void DeleteF(); /*Delete File*/void ModifyFM(); /*Modify FileMode*/void OpenF(); /*Open File*/void CloseF(); /*Close File*/void ReadF(); /*Read File*/void WriteF(); /*Write File*/void QuitF(); /*Quit FileSystem退出文件系统*/ void help();3.总体功能程序结构图(3)关闭命令的流程图(close)(4)写入命令的流程图(write)【源程序清单】1.删除void DeleteF() /*Delete File*/{char fname[MAXNAME],str[50],str1[50];int i,k,j;int fpaddrno1;if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0) /*列表名为空,变为UFD列表*/ {printf("\nError.Please convert to ufd dir before delete.\n");wgetchar=1;}if (strcmp(strupr(dirname),strupr(username))!=0) /*无法删除非自己目录的文件*/ {printf("\nError.You can only modify filemode in yourself dir.\n");wgetchar=1;}else{printf("\nPlease input FileName:");gets(fname);//从键盘获取所要删除的文件名ltrim(rtrim(fname));i=ExistF(fname);//获取文件编号if (i>=0){k=ExistD(username);if(ifopen[k][i].ifopen==1)/*文件打开时无法删除*/{printf("\nError.\'%s\' is in open status. Close it before delete.\n",fname); wgetchar=1;}else{if(ufd[k]->ufdfile[i].fmode==3)/*被保护的文件无法删除*/{printf("\nError.\'%s\' is in protect status. Close it beforedelete.\n",fname); wgetchar=1;}else{fpaddrno1=ufd[k]->ufdfile[i].fpaddr;//获取文件对应的物理文件名fpaddrno[fpaddrno1]=0;//回收盘块for(j=i;j<fcount[k];j++){ufd[k]->ufdfile[j]=ufd[k]->ufdfile[j+1];//从被删除的文件号开始,数组值全部前移一个}strcpy(str,"d:\\osfile\\file\\file");itoa(fpaddrno1,str1,10);//整数转化成字符串strcat(str,str1);strcat(str,".txt");remove(str);//删除物理文件fcount[k]--;//k用户文件数量少1printf("\n \'%s\'is deleted successfully.\n",fname);wgetchar=1;}}}else//所要删除的文件不存在{printf("\nError. \'%s\' dose not exist.\n",fname);wgetchar=1;}}}2.打开文件void OpenF()//打开文件{char fname[MAXNAME];int i,k;char openmode[25]; /*是否删除*/char *rtrim(char *str); /*移除尾部空格.*/char *ltrim(char *str); /*移除头部空格.*/int ExistF(char *filename); /* FileName 是否存在,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(dirname),strupr(username))!=0) /*用户名和当前目录不同*/{printf("\nError.You can only open file in yourself dir.\n");wgetchar=1;}else/*用户名和当前目录相同了*/{printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname); /*文件是否存在并返回第几个文件号*/if (i>=0)/*文件存在*/{k=ExistD(username);/*根据用户名确定用户号*/if(ifopen[k][i].ifopen==1) /*文件已打开*/{printf("\nError.\'%s\' is in open status. You don't need to openit.\n",fname);wgetchar=1;}else{if((ufd[k]->ufdfile[i].fmode==0)||(ufd[k]->ufdfile[i].fmode==1)||(ufd[k]->ufdfile[i].fmode== 2)) //判断fmode{ifopen[k][i].ifopen=1;ifopen[k][i].openmode=(ufd[k]->ufdfile[i].fmode);printf("\n\'%s\' has been open.\n",fname);wgetchar=1;return;}else{printf("\n\'%s\' is protected file ,you can not open it.",fname);}}}else{printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}}3.关闭文件void CloseF() /*关闭文件*/{char fname[MAXNAME];int i,k;if (strcmp(strupr(dirname),strupr(username))!=0) /*用户名和当前目录不同*/{printf("\nError.You can only modify filemode in yourself dir.\n");}else /*用户名和当前目录相同了*/{printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname)); /*去除空格*/i=ExistF(fname); /*文件是否存在并返回第几个文件号*/if (i>=0) /*文件存在*/{k=ExistD(username); /*根据用户名确定用户号*/if(ifopen[k][i].ifopen==0) /*该文件未打开*/{printf("\nError. \'%s\' has been closed. you can not close it again.\n",fname);}else /*该文件已打开*/{ifopen[k][i].ifopen=0; /*关闭,置为0*/ifopen[k][i].openmode=4; /*修改打开模式为初始的打开模式*/printf("\'%s\' has been closed successfully!",fname);}}else /*文件不存在*/{printf("\nError. \'%s\' dose not exist.\n",fname);}}}4.写文件void WriteF() /*Write File*/{int z;int i,k,m=0;int length;char fname[MAXNAME];char str[255],str1[255];if (strcmp(strupr(dirname),strupr(username))!=0) //只能写自己目录下的文件{printf("\nError.Please convert to ufd dir before write.\n");wgetchar=1;return;}printf("\nCaution:Open file first\n");printf("Opened File(s) List:\n");k=ExistD(dirname);//获取目录编号for(i=0;i<fcount[k];i++)/*列出可以写的文件*/{if(ifopen[k][i].ifopen==1)//如果文件是打开的{printf("%15s",ufd[k]->ufdfile[i].fname);m++;}if((m%4==0)&&(m!=0)) printf("\n");}printf("\n%d files openned.\n",m);if (m==0) wgetchar=1;//没有打开的文件if(m!=0){printf("\nPlease input FileName:");gets(fname);//从键盘获取所要写的文件ltrim(rtrim(fname));//去掉文件名头尾的空格i=ExistF(fname);//获取文件编号if(i>=0){if(ifopen[k][i].ifopen==1)//如果文件是打开的{//当文件是可写的(包括可读可写)if((ifopen[k][i].openmode==1) ||(ifopen[k][i].openmode==2)){itoa(ufd[k]->ufdfile[i].fpaddr,str,10);//获取文件对应的物理地址strcpy(str1,"file");strcat(str1,str);strcpy(str,"c:\\osfile\\file\\");strcat(str,str1);strcat(str,".txt");printf("Please input z(1-appendix,2-cover):");scanf("%d",&z);switch(z){case 1:fp_ufd=fopen(str,"ab");//以二进制只写的形式打开,每次将内容添加到文件末尾接着上一次内容length=WriteF1();ufd[k]->ufdfile[i].flength=ufd[k]->ufdfile[i].flength+length;//计算总长度printf("\n\n%d Length.\n",ufd[k]->ufdfile[i].flength);break;case 2:fp_ufd=fopen(str,"wb");length=WriteF1(); //写入并获得长度printf("\n\n%d Length.\n",length);break;}printf("\n\nYou have write file successfully!!");fclose(fp_file);wgetchar=0;}else if(ifopen[k][i].openmode==0)//文件是只读的{printf("\nError.\'%s\' has been opened with READ ONL Y mode. It isn\'t write.\n",fname);wgetchar=1;}else//如果文件是保护的{printf("\nError.\'%s\' has been opened with PROTECT mode. It isn\'t write.\n",fname);wgetchar=1;}}else //否则文件是关闭的{printf("\nError.\'%s\' is in closing status. Please open it before write\n",fname);wgetchar=1;}}else //如果所指定的文件不存在{printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}}【测试结果】1.登录界面2.创造文件3.打开文件4.第一次读文件5.写操作,选择追加写6.读出前两次写进去的东西7.再做一次覆盖写8.读出文档里的数据9.关闭文件10.删除文件操作系统课程设计报告20 11.退出系统【设计总结】在设计的过程中,我查询了不少相关资料,不断地发现问题、提出问题、解决问题。