《操作系统2010课程设计.doc》由会员分享,可在线阅读,更多相关《操作系统2010课程设计.doc(33页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、操作系统课程设计学习完操作系统课程,通过一个具体的课程设计实践,可使学生对操作系统原理有更进一步的理解与应用,通过设计对操作系统有一个实现的尝试和创新的思维,同时发挥团队协作精神和个人创造能力。选题:以下二题可任选一个。分组:每组不可超过四人(包括四个),每组指定一个组长,每人设计系统中的一部分,集体协商整合。组长能够在设计过程中,能有效的组织和协调各个阶段的任务及融合。要求:界面自行设计,语言自行选择。每组需写一份课程设计报告,内容包括:小组成员及分工,系统采用的语言、支撑平台、程序的模块功能分析、程序的流程图、程序功能段的说明及代码解释;实验体会与软件评价。报告提交后,将系统代码及说明压缩
2、成文件以所有组员学号组合命名发于指定邮箱(os240608)。(如:2406080101020304(班号四个组员学号)。题目一:支持多个进程(线程)并发运行的简单进程(线程)管理模拟系统1实验内容学习进程管理的设计与实现,学习和运用操作系统原理,设计一个操作系统子系统的模拟系统。通过该系统的设计调试可增加对操作系统实现的感知性。设计一个允许n个进程并发运行的进程管理的模拟系统。该系统包括简单的进程控制、同步及通信机构,其进程调度算法可任意选择。分析系统所需的数据结构、算法的流程以及化分各个功能模块。2实验原理进程管理包括进程的控制、阻塞、唤醒与撤消。进程在运行过程中状态在不断的变化。进程运行
3、过程中,因为竞争资源而需对它们进行同步控制。所有这些在操作系统中用数据结构PCB来记录,系统通过PCB控制进程的运行。在单处理机系统中,多道程序的引入,需要进程的调度程序来选择一个进程进行运行。比如常用的先来先服务、短进程优和优先级优先等等,也可以选择它们的结合调度算法。题目二:文件系统设计1 实验内容通过一个简单的二级文件系统设计,加深对文件系统的内部功能以及内部实现的理解。要求模拟采用二级目录结构的磁盘文件系统的文件操作能实现以下几条命令,用输入命令来模拟用户程序中调用的文件操作:Login 用户登录Dir 列文件目录(列出文件名、物理地址、保护码和文件长度)Create 创建文件Dele
4、te 删除文件Open 打开文件Close 关闭文件Read 读文件Write 写文件源文件可以进行读写保护2实验原理文件系统管理中用到的数据结构有:首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2并以编号作为物理地址,在目录中进行登记。例:/下例只是参考(每组可自行设计数据结构和程序功能,只需能演示进程管理的功能,如用多线程)1程管理模拟系统。(1)问题描述本系统的同步机构采用的信号量上的P、V操作的机制;控制机构包括阻塞和唤醒操作;时间片中断处理
5、程序处理模拟的时间片中断;进程调度程序负责为各进程分配处理机。系统中设计了3个并发进程它们之间有如下同步关系:3个进程需要互斥使用临界资源s2,进程1和进程2又需互斥使用临界资源s1。本系统在运行过程中随机打印出各进程的状态变换过程,系统的调度过程及公共交量的变化情况。(2)算法系统为进程设置了5种运行状态:e执行态;r高就绪态;t低就绪态(执行进程因时间片到限而转入):w等待态;c完成态。各进程的初始状态均设置为r。系统分时执行各进程。通过产生随机数x来模拟时间片(每一个时间片并不相同)。当进程processl访问随机数x时,若x033;当进程proccss2访问x时,若x0.33或x0.6
6、6;当进程process3访问x时,若x0.66,则分别认为各进程的执行时间片到限,产生“时间片中断”面转入低就绪态t。进程调度算法采用剥夺式最高优先数法。各进程的优先数通过键盘输入予以静态设置。调度程序每次总是选择优先数最小(优先权最高)的就绪进程投入执行。先从r状态进程中选择,再从t状态进程中选择。当现行进程唤醒某个等待进程,且被唤醒进程的比先数小于现行进程时,则剥夺现行进程的执行权。各进程在使用临界资源s1和s2时,通过调用信号量sem1和sem2上的P、V操作来实现同步。阻塞和唤醒操作负责完成从进程的执行态到等待态以及从就绪态的转变。系统启动后,在完成必要的系统初始化后便执行进程调度程
7、序。当执行因“时间片中断”,或者被排斥使用临界资源,或唤醒某个等待进程时,立即进行进程调度。当3个进程都处于完成状态后,系统退出运行。(3)数据结构每个进程一个PCB,内容:id进程标识status 进程状态priority进程优先数nextwr等待队链指针,指示在同一信号量上等待的下一个进程的标识。信号量。对应于临界资源s1和s2分别有sem1和sem2,均为互斥号量,内容包括:value信号量值,初值为1firstwr等待链指针,指示在该信号量上第一个等待进程的标识数。保留区。用数组saveaera34表示。即每个进程都有一个大小为4个单元的保留区,用来保存被“中断”时的现场信息,如通用寄
8、存器的内容和断点地址等。全程变量。exe执行进程指针,其值为进程标识数i用来模拟一个通用寄存器。(4)用TurboC编写的程序代码:#include #include #include #define TRUE 1#define FALSE 0#define MAXPRI 100#define NIL -1struct int id; char status; int nextwr; /*等待链指针,指示在同一信号量上等待的下一个进行进程的标识符* int priority; pcb3;struct int value; int firstwr; /*等待链首指针,指示该信号量上第一个等待进程
9、的标识数*/ sem2;char savearea34,addr;int i,s1=0,s2=0,seed,exe=NIL;init( ) int j; for(j=0;j3;j+) pcbj.id=j; pcbj.status=r; pcbj.nextwr=NIL; printf(nprocess%dpriority?,j+1); scanf(%d,&i); pcbj.priority=i; sem0.value=1; sem0.firstwr=NIL; sem1.value=1; sem1.firstwr=NIL; for(i=0;i3;i+) for(j=0;j4;j+) saveare
10、aij=0;float random()float m;srand(time(0);m=(1+rand()%3)%3-0.1; printf(random m=%fn,m); getchar();return(m);timeint(ad) /*time slice interupt*/char ad; float x; x=random(); if(x0.33)&(exe=0)return(FALSE); if(x0.66)&(exe=1)return(FALSE); if(x1.0)&(exe=2)return(FALSE);saveareaexe0=i;saveareaexe1=ad;pc
11、bexe.status=t;printf(This times slice interrupt process%d enter into readyn,exe+1);exe=NIL;return(TRUE);scheduler( ) int pd; if(pd=find()=NIL&exe=NIL) return(NIL); /*quit system*/ if(pd!=NIL) if(exe=NIL) pcbpd.status=e; exe=pd; printf(proccess%d is executingn,exe+1); else if(pcbpd.prioritypcbexe.pri
12、ority) pcbexe.status=r; printf(process%d enter into readyn,exe+1); pcbpd.status=e; exe=pd; printf(process%d is executingn, exe+1); i=saveareaexe0; addr=saveareaexe1; return(exe); find( ) int j,pd=NIL,w=MAXPRI; for(j=0;j3;j+) if(pcbj.status=r) if(pcbj.priorityw) w=pcbj.priority; pd=j; if (pd=NIL) for
13、(j=0;j3;j+) if(pcbj.status=t) if(pcbj.priority=0) return(FALSE); block(se); saveareaexe0=i; saveareaexe1=ad; exe=NIL; return(TRUE); block(se)int se; int w; printf(process%d is blockedn,exe+1); pcbexe.status=w; pcbexe.nextwr=NIL; if(w=semse.firstwr)=NIL) semse.firstwr=exe; else while(pcbw.nextwr!=NIL
14、) w=pcbw.nextwr; pcbw.nextwr=exe; v(se,ad)int se;char ad;if(+semse.value0) return(FALSE); wakeup(se); saveareaexe1=ad; saveareaexe0=i; return(TRUE); wakeup(se)int se; int w; w=semse.firstwr; if(w!=NIL) semse.firstwr=pcbw.nextwr; pcbw.status=r; printf(process%d is waken upn,w+1); process1() if(addr=a
15、) goto a1; if(addr=b) goto b1; if(addr=c) goto c1; if(addr=d) goto d1; if(addr=e) goto e1; if(addr=f) goto f1; for(i=0; i3;i+)/*如果程序执行超过次,则*/ printf(process1 calls P on the semaphore 1n); if(p(0,a) break; /*process 1 is blocked*/a1: printf(process1 is executing in the cretical section 1n); if(timein
16、t(b) break; /*time silce interrupt*/b1: printf(s1=%dn,+s1); printf(process1 calls V on semaphorel and quit cretical section 1.n); if(v(0,c) break; /*wake up a blocked process*/c1: printf(process1 calls P on semaphorel 2.n); if(p(1,d) break;d1: printf(process1 is execting cretical section 2.n); if(ti
17、meint(e) break;e1: printf(s2=%dn,+s2); printf(process1 calls V on semaphore2 and quit cretical section2.n); if(v(1,f) break; /*wake up a block process*/f1: printf(process1 cycle count=%dn,i); if(i3) return; eexit(0); process2() if(addr=a) goto a2; if(addr=b) goto b2; if(addr=c) goto c2; if(addr=d) g
18、oto d2; if(addr=e) goto e2; if(addr=f) goto f2; for(i=1;i6;+i) printf(process2 call P on semaphore2n); if(p(1,a) break; /*process2 is blocked*/a2: printf(process2 is executing on the cretical setion2n); if(timeint(b) break;b2: printf(s2=%dn,+s2); printf(process2 is calls V on semaphore2 and quit cre
19、tical section2.n); if(v(1,c) break; /*wake up a blocked process*/c2: printf(process2 call P on semphore 1.n); if(p(0,d) break; /*process2 is blocked*/d2: printf(process2 is executing cretical setion1n); if(timeint(e) break;e2: printf(s1=%dn,+s1); printf(process2 call V on semaphorel and quit cretica
20、l setion2n); if(v(0,f) break; /*wkup up a block process*/f2: printf(process2 cycle count=%dn,i); if(i6) return; eexit(1); process3()if(addr=a) goto a3;if(addr=b) goto b3;if(addr=c) goto c3;for(i=1;i6;+i) printf(process3 call P on semaphore2n); if(p(1,a) break; /*process3 is blocked*/a3: printf(proce
21、ss3 is executing on its cretical section.n); if(timeint(b) break;b3: printf(s2=%dn,+s2); printf(process3 calls V on semaphore and quit cretical section.n); if(v(1,c) break; /*wake up a blocked process */c3: printf(process3 cyclen count=%dn,i); if(i6) return; eexit(2);eexit(n)int n; pcbn.status=c; pr
22、intf(process%d is completed!n,n+1); exe=NIL;main() int j=0; int k; char m; printf(* * * * process management * * * *nn); init(); printf(s1=%d, s2=%dn,s1,s2); printf(process1,process2,process3 are all in ready!n); for(;) j=j+1; printf(n%dth Scheduler Press ENTER to continuen,j); /scanf(%s,&m); getcha
23、r(); if(k=scheduler()!=NIL) switch(k) case 0: process1(); break; case 1: process2(); break; case 2: process3(); break; default: printf(process identifer errorn); break; else break; printf(s1=%d, s2=%dn,s1,s2); printf(n* * * * END * * * *n); 2文件系统参考程序见下(本程序需要在c:下建一个名为osfile的目录及一个名为file的子目录):#include
24、stdio.h#include string.h#include conio.h#include stdlib.h#define MAXNAME 25 /*the largest length of mfdname,ufdname,filename*/#define MAXCHILD 50 /*the largest child*/#define MAX (MAXCHILD*MAXCHILD) /*the size of fpaddrno*/typedef struct /*the structure of OSFILE*/ int fpaddr; /*file physical addres
25、s*/ int flength; /*file length*/ int fmode; /*file mode:0-Read Only;1-Write Only;2-Read and Write(default);*/ char fnameMAXNAME; /*file name*/ OSFILE;typedef struct /*the structure of OSUFD*/ char ufdnameMAXNAME; /*ufd name*/ OSFILE ufdfileMAXCHILD; /*ufd own file*/ OSUFD;typedef struct /*the struct
26、ure of OSUFDLOGIN*/ char ufdnameMAXNAME; /*ufd name*/ char ufdpword8; /*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;OSUFD *ufdMAXCHILD; /*ufd and ufd own files*
27、/OSUFD_LOGIN ufd_lp;int ucount=0; /*the count of mfds ufds*/int fcountMAXCHILD; /*the count of ufds files*/int loginsuc=0; /*whether login successfully*/char usernameMAXNAME; /*record login users name22*/char dirnameMAXNAME;/*record current directory*/int fpaddrnoMAX; /*record file physical address
28、num*/OSUFD_OPENMODE ifopenMAXCHILDMAXCHILD; /*record file open/close*/int wgetchar; /*whether getchar()*/FILE *fp_mfd,*fp_ufd,*fp_file_p,*fp_file;void main()int i,j,choice1; char choice50; /*choice operation:dir,create,delete,open,delete,modify,read,write*/ int choiceend=1; /*whether choice end*/ ch
29、ar *rtrim(char *str); /*remove the trailing blanks.*/ char *ltrim(char *str); /*remove the heading blanks.*/ void LoginF(); /*LOGIN FileSystem*/ void DirF(); /*Dir FileSystem*/ void CdF(); /*Change Dir*/ void CreateF(); /*Create File*/ void DeleteF(); /*Delete File*/ void ModifyFM(); /*Modify FileMo
30、de*/ void OpenF(); /*Open File*/ void CloseF(); /*Close File*/ void ReadF(); /*Read File*/ void WriteF(); /*Write File*/ void QuitF(); /*Quit FileSystem*/ void help(); if(fp_mfd=fopen(c:osfilemfd,rb)=NULL) fp_mfd=fopen(c:osfilemfd,wb);fclose(fp_mfd); for(i=0;i,strupr(dirname); else printf(Bad comman
31、d or file name.nC:%s,strupr(username); gets(choice); strcpy(choice,ltrim(rtrim(strlwr(choice); if (strcmp(choice,dir)=0) choice1=1; else if(strcmp(choice,creat)=0) choice1=2; else if(strcmp(choice,delete)=0) choice1=3; else if(strcmp(choice,attrib)=0) choice1=4; else if(strcmp(choice,open)=0) choice
32、1=5; else if(strcmp(choice,close)=0) choice1=6; else if(strcmp(choice,read)=0) choice1=7; else if(strcmp(choice,modify)=0) choice1=8; else if(strcmp(choice,exit)=0) choice1=9; else if(strcmp(choice,cls)=0) choice1=10; else if(strcmp(choice,cd)=0) choice1=11; else if(strcmp(choice,help)=0) choice1=20
33、; else choice1=12; switch(choice1) case 1:DirF();choiceend=1;break;case 2:CreateF();choiceend=1;if(!wgetchar) getchar();break;case 3:DeleteF();choiceend=1;if(!wgetchar)getchar();break;case 4:ModifyFM();choiceend=1;if(!wgetchar) getchar();break;case 5:choiceend=1;OpenF();if (!wgetchar) getchar();brea
34、k;case 6:choiceend=1;CloseF();if (!wgetchar) getchar();break;case 7:choiceend=1;ReadF();if (!wgetchar) getchar();break;case 8:choiceend=1;WriteF();if (!wgetchar) getchar();break;case 9:printf(nYou have exited this system.); QuitF();exit(0);break;case 10:choiceend=1;clrscr();break;case 11:CdF();choic
35、eend=1;break;case 20:help();choiceend=1;break;default:choiceend=0; else printf(nAccess denied.);void help(void)printf(nThe Command Listn);printf(nCd Attrib Creat Modify Read Open Cls Delete Exit Closen);char *rtrim(char *str) /*remove the trailing blanks.*/int n=strlen(str)-1; while(n=0) if(*(str+n)
36、!= ) *(str+n+1)=0;break; else n-; if (nufdname,strupr(ufd_lp.ufdname); fp_ufd=fopen(str,rb); fcountj=0; for(i=0;fread(&ufdj-ufdfilei,sizeof(OSFILE),1,fp_ufd)!=0;i+,fcountj+) ifopenji.ifopen=0; ifopenji.openmode=4; fclose(fp_ufd); fclose(fp_mfd); ucount=j; SetPANo(0); printf(nnLogin successful! Welcome to this FileSystemnn); loginsuc=1; return; else printf(nn