已阅读5页,还剩31页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机操作系统实验指导书实验一 进程管理一、目的本课题实验的目的是,加深对进程概念及进程管理各个部分内容的理解;熟悉进程管理中主要数据结构的设计及进程调度算法,进程控制机构,同步机构,通信机构的实施。二、 题目进程管理三、要求及提示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);fp2-address=jp-address;fp2-size=jp-length;fp2-next=fp;if(fp!=null)fp2-back=fp-back;if(fp-back!=null)fp1-next=fp2;else freep=fp2;fp-back=fp2;elsefp2-back=fp1;fp1-next=fp2; case 1:fp-size=fp-size+jp-length;fp-address=jp-address;case 2:fp1-size=fp1-size+jp-length;case 3:fp1-size=fp1-size+jp-length+fp-size;fp1-next=fp-next;if(fp-next!=null)fp-next-back=fp2;free(fp); if(jp=jobp) jobp=jp-next;if(jp-next!=null)jp-next-back=jp-back;if(jp-back!=null)jp-back-next=jp-next;free(jp);/*搬家*/banjia()freeptr fp,fp1;jobptr jp;long bottom;if(jobnumber0)jp=jobp;bottom=total+setaddress;while(jp!=null)jp-address=bottom-jp-length;bottom=bottom-jp-length;jp=jp-next;fp=freep;while(fp!=null)fp1=fp;fp=fp-next;free(fp1);freep=(freeptr)malloc(sizeof(freeptr);freep-size=totalfree;freep-address=setaddress;freep-next=null;freep-back=null;mingling()char name,anykey,jobname;int length,select;int address;a1:clrscr();printf(you can select one of the following:n);printf( (1)require to be allocaten);printf( (2)require to collexte the sizen);printf( (3)check the memoryn);printf( (4)quit systemn);printf(you select is:);scanf(%d,&select);switch(select) case 1:if(jobnumber=max) printf(the job is too many);elseprintf(enter you job namen);scanf(%s,&name);printf(enter your job lengthn);scanf(%10d,&length);address=fengpei(length,name);switch(address)case 1:printf(the memory is full);break;case 0:banjia();fengpei(length,name);xianshi();break;case 2: xianshi();break;/*else xianshi();*/break;case 2:printf(enter the name of the jobn);printf(you select i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商业区项目水库大坝碾压施工方案-施工技术方案
- 公众聚集场所检修员装卸作业安全操作规程
- 城市快速路高架桥施工专项施工方案
- 深基坑开挖安全专项施工方案
- 2026年护士执业资格考试题库(内科护理学专项)历年真题及答案
- 广东省港口安全管理培训班考试试题及参考答案
- 客运企业车工装卸作业安全操作规程
- 肿瘤内科学主治医师技术等级评定试卷与答案
- 掌握高分逻辑初中数学建模思维培养暑假思维提升复习课
- 2026年初中道德与法治七年级上册专项训练卷
- 浙江中控DCS操作指导全面覆盖
- 2025年交通安全非机动车培训
- 机场消防安全培训知识课件
- 南宋建立课件
- 健康体检质量控制指南
- 2025年山东药品监管题库及答案
- 化疗药物配伍及输注操作标准
- 物业项目成本控制及预算管理方案
- 2024年注册安全工程师考试化工(初级)安全生产实务试题及答案
- 农村企业经营管理课件
- 《气体中毒急诊救治》课件
评论
0/150
提交评论