操作系统实验进程管理存储器管理设备管理实验代码报告.doc

上传人:仙人指路1688 文档编号:2388227 上传时间:2023-02-17 格式:DOC 页数:35 大小:127KB
返回 下载 相关 举报
操作系统实验进程管理存储器管理设备管理实验代码报告.doc_第1页
第1页 / 共35页
操作系统实验进程管理存储器管理设备管理实验代码报告.doc_第2页
第2页 / 共35页
操作系统实验进程管理存储器管理设备管理实验代码报告.doc_第3页
第3页 / 共35页
操作系统实验进程管理存储器管理设备管理实验代码报告.doc_第4页
第4页 / 共35页
操作系统实验进程管理存储器管理设备管理实验代码报告.doc_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《操作系统实验进程管理存储器管理设备管理实验代码报告.doc》由会员分享,可在线阅读,更多相关《操作系统实验进程管理存储器管理设备管理实验代码报告.doc(35页珍藏版)》请在三一办公上搜索。

1、实验一 进程管理一、目的本课题实验的目的是,加深对进程概念及进程管理各个部分内容的理解;熟悉进程管理中主要数据结构的设计及进程调度算法,进程控制机构,同步机构,通信机构的实施。二、 题目进程管理三、要求及提示1、要求设置PCB,进程控制原语,进程调度算法,能描述进程调度中不同进程状态之间的转换,设计一个允许n个进程并发运行的进程管理模拟系统。该系统包括有简单的进程控制,同步及通信机构,其进程调度算法可任意选择。每个进程用一个PCB表示,其内容可根据具体情况设置。各进程之间应有一定的同步关系。系统在运行过程中能显示或打印各进程的状态及有关参数的变化情况,以便观察诸进程的运行过程及系统的管理过程。

2、2、编程实现。3、工具:C语言或其它高级语言4、实验时间:3学时四、实验报告1、写出进程管理的思想。2、画出算法流程图和设置的数据结构。3、写出调试程序出现的问题及解决的方法。4、打印实验报告及程序清单。5、报告给出测试的结果。五、范例支持多个进程并发运行的简单进程管理模拟系统。1、问题描述 本系统的同步机构采用的是信号量上的P,V操作的机制;控制机构包括阻塞和唤醒操作;时间片中断处理程序处理模拟的时间片中断;进程调度程序负责为各进程分配处理机。系统中设计了3个并发进程。它们之间有如下同步关系:3个进程需要互斥使用临界资源s2,进程1和进程2又需互斥使用临界资源s1。本系统在运行过程中随机打印

3、出各进程的状态变换过程,系统的调度过程及公共变量的变化情况。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。进程调度算法采用剥夺式最高优先数法。各进程的优先数通过键盘输入予以静态设置。

4、调度程序每次总是选择优先数最小(优先权最高)的就绪进程投入执行。先从r状态进程中选择,在从t状态进程中选择。当现行进程唤醒某个等待进程,且被唤醒进程的优先数小于现行进程时,则剥夺现行进程的执行权。各进程在使用临界资源s1和s2时,通过调用信号量sem1和sem2上的P,V操作来实现同步,阻塞和唤醒操作负责完成从进程的执行态到等待态到就绪态的转换。系统启动后,在完成必要的系统初始化后便执行进程调度程序。但执行进程因“时间片中断”,或被排斥使用临界资源,或唤醒某个等待资源时,立即进行进程调度。当3个进程都处于完成状态后,系统退出运行。图1和图2分别示出了系统主控程序和进程调度程序的大致流程。初始化

5、处处石化初始化有进程管理(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 N

6、Y Y N N Y Y N Y nexrtwr 等待链指针,只是在同一信号量上等待的下一个进程的标时数。(2)信号量semaphore,对于临界资源 s1和s2分别有sem1和sem2均为互斥信号量。内容包括:value 信号量值,初值为1;firstwr 等待链首指针,指示该信号量上等待的下一个进程标识数。(3)现场保留区,用数组savearea34表示,即每一个进程都有一个大小为4个单元的保留区,用来保存被“中断”时的现场信息,如通用寄存器的内容和断点地址等。此外,系统中还用到下列主要全程变量:exe 执行进程指针,其值为进程标识数; i 用来模拟一个通用寄存器;addr 用来模拟程序计数

7、器;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; pc

8、bj.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)

9、; 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)

10、; 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(proce

11、ss%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=

12、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);saveareae

13、xe1=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)g

14、oto 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) bre

15、ak; 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

16、(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;b

17、2: 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 seme

18、phore1 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 cre

19、tical 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; pri

20、ntf(*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

21、; 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

22、 section 1.s1=1process1 calls V on semaphore and quit cretical section 1.process1 calls P on semaphore2.process1 is execting cretical section2.Times slice interrupt!process1 enter into ready.process2 is executing.process2 calls P on scmaphore2.process2 is blocked.process3 is executing.process3 calls

23、 P on semaphore2.process3 is blocked.process1 is executing.s2=1process1 calls V on semaphore2 and quit cretical section2.process2 is waken up.process1 cycle count=1 . . .process3 is executing on its critical section.process3 calls V on semaphore2 and quit cretical section process1 is waken upprocess

24、3 is enter into readyprocess1 is executing . . .process2 calls V on semaphore2 add quit cretical section2.process3 is waken upprecess2 calls P on semaphore 1.process2 is execting cretical section1.Time slice interrupt!process2 enter into ready.process3 is executing. . . .process3 cycle count=5proces

25、s3 is completed! . . .process1 cycle count=5process1 is completed!process2 is executing.process2 is executing on the cretical section2.s2=15process2 calls V on semaphore2 and quit critical section2.process2 calls P on semaphore1.process2 is execting cretical section1.s1=10process2 calls V on semapho

26、re1 and quit cretical section1.process2 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。为了模拟时间片中断,在进程模块中安排

27、了访问时间片中断处理程序timeint 的语句。当timeint的返回值为TURE时,表示时间片到限,进程中止执行,返回主控程序。6、调试程序出现的问题及解决的方法调试程序过程中发现一些问题主要问题如下: 输出内容多,在屏幕上一闪而过,可采用在程序中预先设置断点或将输出信息发送到文件中的方法来处理。7、设计体会操作系统是现代计算机系统工作的基石,而且进行程序离不开操作系统的支持。本程序完成后对于进程管理有了整体的定义和理解。进程:可并发执行的程序,在某个数据集合上的一次运行过程。而进程控制块是为使程序(含数据)能独立运行,为之配置一进程控制块,即PCB。进程有三种基本状态为就绪态(Ready)

28、,执行态(Running),阻塞态(Blocked)在程序中还涉及到进程的阻塞与唤醒,系统有3个进程,执行时涉及到高低就绪态和优先数的选择。经过本次试验加深了对于进程管理的理解和认识,对于它的执行过程和整体的结构有了一定的了解,熟悉了进程管理中主要数据结构的设计及进程调度算法,进程控制机构,同步机构,通讯机构的实施。通过本次实验把理论知识转化成了实际结果,强化了理论知识的学习把课本知识生动的得到了验证。对今后从事实验工作打下了坚实的基础。实验二 存储器管理一、目的本课题实验的目的是,使学生实验存储器管理系统的设计方法;加深对所学各种存储器管理方案的了解;要求采用一些常用的存储器分配算法,设计一

29、个存储器管理模拟系统并调试运行。二、 题目存储器管理三、要求及提示1、要求采用一种常用的存储器分配算法,设计一个存储器管理模拟系统。允许进行多次的分配和释放,并可向用户反馈分配和释放情况及当前内存的情况;采用“命令菜单”选择和键盘命令输入的会话方式,根据输入请求调用分配模块,或回收模块,或内存查询模块,或最终退出系统。2、编程实现。3、工具:C语言或其它高级语言4、实验时间:3学时四、实验报告1、写出存储器管理的思想。2、画出算法流程图和设置的数据结构。3、写出调试程序出现的问题及解决的方法。4、打印实验报告及程序清单。5、报告给出测试的结果。五、范例采用可变分区存储器管理方案的模拟系统。1、

30、问题描述该模拟系统的外部特性与真实系统基本一样。存储分配算法采用首次适应法。用“拼,接”和“紧凑”技术来处理存储器碎片。2、算法存储分配算法采用首次适应(FF)法。根据指针freep查找自由链,当找到第一块可满足分配请求的空闲区时便分配之。当某空闲区被分配后的剩余空闲区空间大于规定的碎片最小容量min时,则形成一个较小的空闲区留在自由链中。回收时,根据MAT将指定分区链入自由链。若该分区有前邻或后邻空闲分区,则将他们拼接成一块加大的空闲区。当某个分配请求不能被满足,但此时系统中所有碎片总量满足分配请求的容量时,系统立即进入内存“紧凑”以消除碎片。即将各作业占用区集中下移到用户内存区的下部(高地

31、址部分),形成一片连接的作业区,而在用户内存区的上部形成一块较大的空闲区。然后再进行分配。本系统的主要程序模块包括:分配模块ffallocation,回收模块ffcolection,紧凑模块coalesce及命令处理模块menu。Menu用以模拟系统的输入,采用“命令菜单”选择和键盘命令输入的会话方式,根据输入请求调用分配模块,或回收模块,或内存查询模块,或最终退出系统。系统的主流程如图3所示。3、数据结构(1) 自由链与区头。内存空闲区采用自由链结构。链首由freep指向,链中各个空闲区按地址递增次序排列。初启时整个用户内存区为一个空闲区。在每个空闲区首部设置一个区头(freearca)结构

32、。区头信息包括: 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 fr

33、eeareaint 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);f

34、reep-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

35、;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)nex

36、t!=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=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号