免费预览已结束,剩余33页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机操作系统实验指导书操作系统实验大纲一、 基本情况1、 实验名称:操作系统实验 2、 专业:计算机科学与技术3、 学时:104、 先修课:高级语言程序设计/数据结构/面向对象程序设计/微机原理等5、 实验指导教材:操作系统实验指导书(自编)6、 实验单位:信息工程学院实验中心/计算机系7、 实验学期:5/78、 工具:高级语言二、 实验目的从课程性质上讲,操作系统是计算机学科中的一门综合性专业技术基础课,它是计算机学科的核心课程。操作系统的研究不仅涉及到计算机硬件的研究范围,而且和计算机软件有更为密切的关系;通过对操作系统理论的学习,可深刻理解计算机软硬件如何协同工作;同时也可综合应用前面学习的相关知识,而且开发大型软件必然需要取得操作系统的支持。在理论学习的基础上进一步进行实践,系统的巩固前面学习的知识,加深对实际操作系统工作原理、工作方式的了解,并为以后设计和实现大型应用软件和系统软件打好基础;具备基本的分析问题和解决问题的能力。操作系统实践性很强,保证实验教学环节,才能有效提高课程的质量,因此设置了操作系统实验。三、 实验内容与要求1、实验一 进程管理 实验要求: 要求设置PCB,进程控制原语,进程调度算法,能描述进程调度中不同进程状态之间的转换,设计一个允许n个进程并发运行的进程管理模拟系统。该系统包括有简单的进程控制,同步及通信机构,其进程调度算法可任意选择。每个进程用一个PCB表示,其内容可根据具体情况设置。各进程之间应有一定的同步关系。系统在运行过程中能显示或打印各进程的状态及有关参数的变化情况,以便观察诸进程的运行过程及系统的管理过程。 工具:C语言或其它高级语言 实验时间:3学时 2、实验二 存储器管理实验要求: 要求采用一些常用的存储器分配算法,设计一个存储器管理模拟系统并调试运行。加深对所学各种存储器管理方案的了解;要求定义实施算法的相关数据结构,实现分配、回收算法,模拟环境应尽量接近真实。 工具:C语言或其它高级语言 实验时间:3学时3、实验三 设备管理实验要求: 本课题实验的目的是,通过设计并运行一个简单的SPOOLing系统来模拟实际的SPOOLing输入/输出过程,以掌握这种有用的技术。要求将SPOOLing输入/输出处理程序编成一个独立的进程模块并与其他请求输入/输出的进程并发运行。SPOOLing进程负责把从输入设备输入的信息送到外存输入井中,或把外存输入井中的信息送到打印机等输出设备上输出。其余进程只要求编写输入/输出部分的程序。要求定义实施算法的相关数据结构,实现设备分配和SPOOLing算法 工具:C语言或其它高级语言 实验时间:4学时四、参考书1 计算机操作系统 汤子瀛 哲凤屏 编著 西安电子科技大学出版社2 操作系统基础(第三版) 屠祁 屠立德 编著 清华大学出版社 3 操作系统 冯耀霖 杜舜国 编著 西安电子科技大学出版社实验一 进程管理一、目的本课题实验的目的是,加深对进程概念及进程管理各个部分内容的理解;熟悉进程管理中主要数据结构的设计及进程调度算法,进程控制机构,同步机构,通信机构的实施。二、 题目进程管理三、要求及提示1、要求设置PCB,进程控制原语,进程调度算法,能描述进程调度中不同进程状态之间的转换,设计一个允许n个进程并发运行的进程管理模拟系统。该系统包括有简单的进程控制,同步及通信机构,其进程调度算法可任意选择。每个进程用一个PCB表示,其内容可根据具体情况设置。各进程之间应有一定的同步关系。系统在运行过程中能显示或打印各进程的状态及有关参数的变化情况,以便观察诸进程的运行过程及系统的管理过程。2、编程实现。3、工具:C语言或其它高级语言4、实验时间:3学时四、实验报告1、写出进程管理的思想。2、画出算法流程图和设置的数据结构。3、写出调试程序出现的问题及解决的方法。4、打印实验报告及程序清单。5、报告给出测试的结果。五、范例支持多个进程并发运行的简单进程管理模拟系统。1、问题描述 本系统的同步机构采用的是信号量上的P,V操作的机制;控制机构包括阻塞和唤醒操作;时间片中断处理程序处理模拟的时间片中断;进程调度程序负责为各进程分配处理机。系统中设计了3个并发进程。它们之间有如下同步关系:3个进程需要互斥使用临界资源s2,进程1和进程2又需互斥使用临界资源s1。本系统在运行过程中随机打印出各进程的状态变换过程,系统的调度过程及公共变量的变化情况。2、算法 系统为进程设置了5种运行状态:e执行态;r高就绪态;t低就绪态(执行进程因时间片到限而转入);w等待态;c完成态。各进程的初始状态均设置为r。系统分时执行各进程,并规定3个进程的执行概率均为33%。通过产生随机数x来模拟时间片。当进程process1访问随机数x时,若x 0.33;当进程process2访问x时,若x0.33或x0.66;当进程process3访问x时,若x0.66,分别认为各进程的执行时间片到限,产生“时间片中断”而转入低就绪态t。进程调度算法采用剥夺式最高优先数法。各进程的优先数通过键盘输入予以静态设置。调度程序每次总是选择优先数最小(优先权最高)的就绪进程投入执行。先从r状态进程中选择,在从t状态进程中选择。当现行进程唤醒某个等待进程,且被唤醒进程的优先数小于现行进程时,则剥夺现行进程的执行权。各进程在使用临界资源s1和s2时,通过调用信号量sem1和sem2上的P,V操作来实现同步,阻塞和唤醒操作负责完成从进程的执行态到等待态到就绪态的转换。系统启动后,在完成必要的系统初始化后便执行进程调度程序。但执行进程因“时间片中断”,或被排斥使用临界资源,或唤醒某个等待资源时,立即进行进程调度。当3个进程都处于完成状态后,系统退出运行。图1和图2分别示出了系统主控程序和进程调度程序的大致流程。初始化处处石化初始化有进程管理(exeNIL)进程1进程2进程3mainschedulerENDNY 图1 进程管理主控程序 3 、数据结构(1)每个进程有一个进程控制块PCB,内容包括:id 进程控制数,id=0,1,2; 图2 进程调度程序有r态就绪进程?有t态就绪进程?选取优先数最小pd有无执行者(exeNIL)?pd优先数exe优先数?置exe 进程状态为“r”置pd进程状态为“e”恢复进程pd的现场有无执行 进 程?exepdreturn(NIL)恢复现行进行现场return(exe)schedulerstatus 进程状态,可为e,r,t,w,c;priorty 进程优先数; Y N NY Y N N Y Y N Y nexrtwr 等待链指针,只是在同一信号量上等待的下一个进程的标时数。(2)信号量semaphore,对于临界资源 s1和s2分别有sem1和sem2均为互斥信号量。内容包括:value 信号量值,初值为1;firstwr 等待链首指针,指示该信号量上等待的下一个进程标识数。(3)现场保留区,用数组savearea34表示,即每一个进程都有一个大小为4个单元的保留区,用来保存被“中断”时的现场信息,如通用寄存器的内容和断点地址等。此外,系统中还用到下列主要全程变量:exe 执行进程指针,其值为进程标识数; i 用来模拟一个通用寄存器;addr 用来模拟程序计数器;s1,s2 两个公用变量,与来共享临界资源。4、 程序清单#include#define TRUE 1#define FALSE 0#define MAXPRI 100#define NIL-1structint id;char status;int nextwr;int priority;pcb3;struct int value; int firstwr; sem2; char savearea34,addr; int i,s1,s2,seed,exe=NIL; init() /*initialization*/ int j; for (j=0;j3;j+) pcbj.id=j; pcbj.status=r; pcbj.nextwr=NIL; printf(n process%d priority?,j+1); scanf(%d,&i); pcbj.priority=i; sem0.value=1;sem0.firstwr=NIL; sem1.value=1;sem1.firstwr=NIL; for(i=1;i3;i+) for(j=0;j4;j+) saveareaij=0; float random() int m;if (seed0)m=-seed;else m=seed;seed=(25173*seed+13849)%65536;return(m/32767.0); timeint(ad) /*time slice interrupt */ 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; pcbexe.status=t; printf(Time silce interruptnprocess%d enter inro ready.n,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(process%d is executing.n,exe+1); else if(pcbpd.prioritypcbexe.priority) 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 (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;elsewhile(pcbw.nextwr!=NIL)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); /* scheduler*/ 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)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=1;i6;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(timeint(b) break; b1: printf(s1%dn,+s1); printf(process1 calls V on semaphore1 and quit cretical section 1.n); if(v(0,c) break; c1: printf(process1 calls P on semaphore1 2.n); if(p(1,d) break; d1: printf(process1 is executing cretical section 2.n); if(timeint (e) break; e1: printf(s2=%dn,+s2); printf(process1 calls V on semephore2 and quit cretical section2.n); if(v(1,f) )break; f1: printf(process1 cycle count=%dn,i); if(i6) return; eexit(0); process2() if(addr=a)goto a2; if(addr=b)goto b2; if(addr=c)goto c2; if(addr=d)goto d2; if(addr=e)goto e2; if(addr=f)goto f2;for(i=1;i6;+i) printf(process2 calls Pon semephore2n); if(p(1,a) break;a2: printf(process2 is executing on the cretical section2n); if(timeint(b) break;b2: printf(s2=%dn,+s2); printf(process2 calls V on semephore2 and quit cretical section2.n); if(v(1,c) break;c2: printf(process2 calls P on semaphore1.n); if(p(0,d) break;d2: printf(process2 is executing cretical section1.n); if(timeint(e) break;e2: printf(s1=%dn,+s1); printf(process2 calls V on semephore1 and quit cretical section1.n); if(v(0,f) break;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 calls P on semaphore2n); if(p(1,a) break;a3: printf(process3 is executing on the cretical section n); if(timeint(b) break;b3: printf(s2=%dn,+s2); printf(process3 calls V on semaphore2 and quit cretical section.n); if(v(1,c) break;c3: printf(process3 cycle count=%dn); if(i6) return; eexit(2); eexit(n)int n;pcbn.status=c;printf(process%d is completed !n,n+1);exe=NIL;main() int k; printf(*process management*nn); init(); printf(s1=%d,s2=%dn,s1,s2); printf(process1,process2,process3 are all in ready1n); for( ; ;) 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); 5、程序运行结果 * * * * process management * * * *process1 priority ?1process2 priority ?2process3 priority ?3s1=0,s2=0process1,process2,process3 are all in ready!process1 is executing .process1 calls P on the semaphore 1.process1 is executing in the cretical section 1.s1=1process1 calls V on semaphore and quit cretical section 1.process1 calls P on cess1 is execting cretical section2.Times slice interrupt!process1 enter into cess2 is cess2 calls P on cess2 is cess3 is cess3 calls P on cess3 is cess1 is executing.s2=1process1 calls V on semaphore2 and quit cretical cess2 is waken cess1 cycle count=1 . . .process3 is executing on its critical cess3 calls V on semaphore2 and quit cretical section process1 is waken upprocess3 is enter into readyprocess1 is executing . . .process2 calls V on semaphore2 add quit cretical cess3 is waken upprecess2 calls P on semaphore 1.process2 is execting cretical section1.Time slice interrupt!process2 enter into cess3 is executing. . . .process3 cycle count=5process3 is completed! . . .process1 cycle count=5process1 is completed!process2 is cess2 is executing on the cretical section2.s2=15process2 calls V on semaphore2 and quit critical cess2 calls P on cess2 is execting cretical section1.s1=10process2 calls V on semaphore1 and quit cretical cess2 cycle count=5process2 is completed!s1=10,s2=5* * * * END * * * *该程序启动后将在屏幕上提示:process1 priority?process2 priority?process3 priority?要求分别键入3个进程的执行优先数。键入后系统自动运行并随机输出运行情况。3个进程的实现任务只是简单的访问公共变量s1和s2;对它们做加1运算,并通过调用P,V操作实现互斥访问。s1和s2的最终正确结果应分别为15和10。为了模拟时间片中断,在进程模块中安排了访问时间片中断处理程序timeint 的语句。当timeint的返回值为TURE时,表示时间片到限,进程中止执行,返回主控程序。6、调试程序出现的问题及解决的方法调试程序过程中发现一些问题主要问题如下: 输出内容多,在屏幕上一闪而过,可采用在程序中预先设置断点或将输出信息发送到文件中的方法来处理。7、设计体会操作系统是现代计算机系统工作的基石,而且进行程序离不开操作系统的支持。本程序完成后对于进程管理有了整体的定义和理解。进程:可并发执行的程序,在某个数据集合上的一次运行过程。而进程控制块是为使程序(含数据)能独立运行,为之配置一进程控制块,即PCB。进程有三种基本状态为就绪态(Ready),执行态(Running),阻塞态(Blocked)在程序中还涉及到进程的阻塞与唤醒,系统有3个进程,执行时涉及到高低就绪态和优先数的选择。经过本次试验加深了对于进程管理的理解和认识,对于它的执行过程和整体的结构有了一定的了解,熟悉了进程管理中主要数据结构的设计及进程调度算法,进程控制机构,同步机构,通讯机构的实施。通过本次实验把理论知识转化成了实际结果,强化了理论知识的学习把课本知识生动的得到了验证。对今后从事实验工作打下了坚实的基础。实验二 存储器管理一、目的本课题实验的目的是,使学生实验存储器管理系统的设计方法;加深对所学各种存储器管理方案的了解;要求采用一些常用的存储器分配算法,设计一个存储器管理模拟系统并调试运行。二、 题目存储器管理三、要求及提示1、要求采用一种常用的存储器分配算法,设计一个存储器管理模拟系统。允许进行多次的分配和释放,并可向用户反馈分配和释放情况及当前内存的情况;采用“命令菜单”选择和键盘命令输入的会话方式,根据输入请求调用分配模块,或回收模块,或内存查询模块,或最终退出系统。2、编程实现。3、工具:C语言或其它高级语言4、实验时间:3学时四、实验报告1、写出存储器管理的思想。2、画出算法流程图和设置的数据结构。3、写出调试程序出现的问题及解决的方法。4、打印实验报告及程序清单。5、报告给出测试的结果。五、范例采用可变分区存储器管理方案的模拟系统。1、问题描述该模拟系统的外部特性与真实系统基本一样。存储分配算法采用首次适应法。用“拼,接”和“紧凑”技术来处理存储器碎片。2、算法存储分配算法采用首次适应(FF)法。根据指针freep查找自由链,当找到第一块可满足分配请求的空闲区时便分配之。当某空闲区被分配后的剩余空闲区空间大于规定的碎片最小容量min时,则形成一个较小的空闲区留在自由链中。回收时,根据MAT将指定分区链入自由链。若该分区有前邻或后邻空闲分区,则将他们拼接成一块加大的空闲区。当某个分配请求不能被满足,但此时系统中所有碎片总量满足分配请求的容量时,系统立即进入内存“紧凑”以消除碎片。即将各作业占用区集中下移到用户内存区的下部(高地址部分),形成一片连接的作业区,而在用户内存区的上部形成一块较大的空闲区。然后再进行分配。本系统的主要程序模块包括:分配模块ffallocation,回收模块ffcolection,紧凑模块coalesce及命令处理模块menu。Menu用以模拟系统的输入,采用“命令菜单”选择和键盘命令输入的会话方式,根据输入请求调用分配模块,或回收模块,或内存查询模块,或最终退出系统。系统的主流程如图3所示。3、数据结构(1) 自由链与区头。内存空闲区采用自由链结构。链首由freep指向,链中各个空闲区按地址递增次序排列。初启时整个用户内存区为一个空闲区。在每个空闲区首部设置一个区头(freearca)结构。区头信息包括: size 空闲区大小(以字节计),包括区头所占空间; next 前向链指针,指向下一个空闲区; back 反向链指针,指向上一个空闲区; address 本空闲区首地址。(2) 内存分配表MAT。系统设置一个MAT,每个运行作业都在MAT中占有一个表目,回收分区时清除相应表目。表目信息包括:name 用户作业名;length 作业区大小;addr 作业区首地址;4、程序清单#include#include#define TOTAL 5000#define SETADDRESS 2000#define MIN 100#define MAX 10typedef struct freeareaint address;int size;struct freearea *next;struct freearea *back;*freeptr;typedef struct matcharname;intaddress;intlength;struct mat *next;struct mat *back;*jobptr;char string10;long totalfree;char jobnumber;freeptr freep;jobptr jobp;/*初始化*/init()freep=(freeptr)malloc(sizeof(struct freearea);freep-size=TOTAL;freep-address=SETADDRESS;freep-next=NULL;freep-back=NULL;totalfree=TOTAL;jobp=NULL;jobnumber=0;return(0);/*分配模块*/fengpei(int jl,char jn)freeptr fp;jobptr jp,jp1,jp2;jp2=(jobptr)malloc(sizeof(struct mat);if(totalfreesizenext;elsejobnumber=jobnumber+1;totalfree=totalfree-jl;jp2-name=jn;jp2-length=jl;jp2-address=freep-address;if(jobp=NULL)jp2-next=NULL;jp2-back=NULL;jobp=jp2;elsejp=jobp;while(jp!=NULL&(jp2-addressaddress)jp1=jp;jp=jp-next;jp2-next=jp;if(jp=NULL)jp2-back=jp1;jp1-next=jp2;elsejp2-back=jp-back;if(jp-back!=NULL) jp1-next=jp2;else jobp=jp2;jp-back=jp2;if(fp-size-jl)next!=NULL)fp-next-back=fp-back;if(fp-back!=NULL)fp-back-next=fp-next;elsefreep=fp-next;/*return();*/elsefp-size=fp-size-jl;fp-address=fp-address+jl;return(2);if(totalfree=jl) return(0);/*显示模块*/xianshi()jobptr jp;/*清屏*/if(jobnumbername,jp-length,jp-address);jp=jp-next;printf(nthe total left is %d bytes:,totalfree);/*回收模块*/huishou(char jn)freeptr fp,fp1,fp2;jobptr jp;int f=0;jp=jobp;while(jp!=NULL)&(jp-name!=jn)jp=jp-next;if(jp!=NULL)jobnumber=jobnumber-1;totalfree=totalfree+jp-length;if(freep=NULL)freep=(freeptr)malloc(sizeof(struct freearea);freep-address=jp-address;freep-size=jp-address;freep-next=NULL;freep-back=NULL;elsefp=freep;while(fp!=NULL)&(fp-addressaddress)fp1=fp;fp=fp-next;if(fp!=NULL)if(fp-next!=NULL)&(fp-next-address=jp-address+jp-length)f=f+1;if(fp-back!=NULL)&(jp-address=fp1-address+fp1-size)f=f+2;else if(jp-address)=(fp1-address+fp1-size)f=f+2; switch(f) case 0: fp2=(freeptr)malloc(sizeof(struct freearea)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 部编版二年级语文测评资料
- 九年级化学分层作业设计及教学实例
- 林木资源精准识别与利用技术-洞察及研究
- 大型物流企业仓储安全管理方案
- 梨子-区块链驱动的数字虚拟资产发行与交易模型-洞察及研究
- 甘草提取物在抗病毒研究中的作用机制-洞察及研究
- 餐饮服务员顾客投诉处理技巧
- 中小学春季教研活动总结范本
- 企业人才梯队培养与绩效考核方案
- 强相互作用场论研究-洞察及研究
- 互联网农业课件
- 血透感染控制监测
- 2025年道路运输两类人员安全员考试考核题库及答案
- 统编版(2024)八年级上册历史全册教材问题参考答案
- 冠脉搭桥术的手术方法和并发症
- 沙僧介绍课件图片
- 二年级上册数学应用题100道含完整答案【名师系列】
- 关联交易管理办法模板
- 2025年湖北省武汉市黄陂区中考语文三模试题(含答案)
- 信仰宗教学生管理制度
- 种子学试题及答案
评论
0/150
提交评论